[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] Handle the possibility that FXRSTOR may fault by silently clearing



ChangeSet 1.1394, 2005/04/28 19:26:25+01:00, kaf24@xxxxxxxxxxxxxxxxxxxx

        Handle the possibility that FXRSTOR may fault by silently clearing
        the data area that it is restoring from. This may occur if control
        tools reload a saved VM image without adequate checking, for example.
        Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx>



 i387.c |   28 ++++++++++++++++++++++++++--
 1 files changed, 26 insertions(+), 2 deletions(-)


diff -Nru a/xen/arch/x86/i387.c b/xen/arch/x86/i387.c
--- a/xen/arch/x86/i387.c       2005-04-28 15:04:43 -04:00
+++ b/xen/arch/x86/i387.c       2005-04-28 15:04:43 -04:00
@@ -46,10 +46,34 @@
 
 void restore_fpu(struct exec_domain *tsk)
 {
+    /*
+     * FXRSTOR can fault if passed a corrupted data block. We handle this
+     * possibility, which may occur if the block was passed to us by control
+     * tools, by silently clearing the block.
+     */
     if ( cpu_has_fxsr )
         __asm__ __volatile__ (
-            "fxrstor %0"
-            : : "m" (tsk->arch.guest_context.fpu_ctxt) );
+            "1: fxrstor %0            \n"
+            ".section .fixup,\"ax\"   \n"
+            "2: push %%"__OP"ax       \n"
+            "   push %%"__OP"cx       \n"
+            "   push %%"__OP"di       \n"
+            "   lea  %0,%%"__OP"di    \n"
+            "   mov  %1,%%ecx         \n"
+            "   xor  %%eax,%%eax      \n"
+            "   rep ; stosl           \n"
+            "   pop  %%"__OP"di       \n"
+            "   pop  %%"__OP"cx       \n"
+            "   pop  %%"__OP"ax       \n"
+            "   jmp  1b               \n"
+            ".previous                \n"
+            ".section __ex_table,\"a\"\n"
+            "   "__FIXUP_ALIGN"       \n"
+            "   "__FIXUP_WORD" 1b,2b  \n"
+            ".previous                \n"
+            : 
+            : "m" (tsk->arch.guest_context.fpu_ctxt),
+              "i" (sizeof(tsk->arch.guest_context.fpu_ctxt)/4) );
     else
         __asm__ __volatile__ (
             "frstor %0"

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.