kernel - Increase size of savefpu area in pcb for vkernel64
authorMatthew Dillon <dillon@apollo.backplane.com>
Mon, 4 Mar 2013 02:25:14 +0000 (18:25 -0800)
committerMatthew Dillon <dillon@apollo.backplane.com>
Mon, 4 Mar 2013 02:25:14 +0000 (18:25 -0800)
* The vkernel64 uses bcopy.  The ucontext_t/mcontext_t reserves a 1024
  byte space for the fpu area, but the savefpu structure only reserves
  834 bytes.  Increase the savefpu structure appropriately.

* Did not effect real 64-bit kernels because they used machine instructions
  to save/restore the FP state and/or bcopy'd using the savefpu structure
  sdize instead of the size of the fpu area in the ucontext/mcontext
  structure.

* Fixes panics in vkernel64

Reported-by: tuxillo
sys/cpu/x86_64/include/npx.h
sys/cpu/x86_64/include/ucontext.h
sys/platform/pc64/include/pcb.h

index ca6e73e..06e3350 100644 (file)
@@ -132,6 +132,7 @@ union       savefpu {
        struct  save87  sv_87;
        struct  savexmm sv_xmm;
        struct  saveymm sv_ymm;
+       char            sv_savearea[1024];      /* see mcontext_t */
 };
 
 /*
index f19575b..e1ef476 100644 (file)
@@ -75,8 +75,11 @@ struct __mcontext {
        unsigned int    mc_reserved;
        unsigned int    mc_unused[8];
 
-       /* 64 byte aligned */
-       int             mc_fpregs[256]; /* 1024 bytes */
+       /*
+        * NOTE! 64-byte aligned as of here.  Also must match savefpu
+        *       structure.
+        */
+       int             mc_fpregs[256];
 } __attribute__((aligned(64)));
 
 typedef struct __mcontext mcontext_t;
index 0369ea6..f33affc 100644 (file)
@@ -45,6 +45,9 @@
 
 /*
  * x86_64 process control block
+ *
+ * WARNING! union savefpu has a 64-byte alignment requirement built-in
+ *         which will adjust the size of this structure.
  */
 #include <machine/npx.h>