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

[Xen-changelog] [xen-unstable] hvm: Register fields CS, DS, ES, FS, GS, SS, etc. are all undefined during



# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1198751944 0
# Node ID 2324110ef2c69da2b530d8762bb7bc4257084b07
# Parent  717f0dce76e7859dbd0648190ce8dfc3ec0f8170
hvm: Register fields CS,DS,ES,FS,GS,SS,etc. are all undefined during
HVM execution as they are not saved/restore on vmexit/vmentry. To
prevent accidental usage of these fields, poison them with 16-bit
value 0xbeef (debug builds only).
Signed-off-by: Keir Fraser <keir.fraser@xxxxxxxxxx>
---
 xen/arch/x86/hvm/svm/x86_32/exits.S |   13 +++++++++++++
 xen/arch/x86/hvm/svm/x86_64/exits.S |   13 +++++++++++++
 xen/arch/x86/hvm/vmx/x86_32/exits.S |   14 +++++++++++++-
 xen/arch/x86/hvm/vmx/x86_64/exits.S |   13 +++++++++++++
 xen/arch/x86/x86_32/asm-offsets.c   |    1 +
 xen/arch/x86/x86_64/asm-offsets.c   |    5 +++++
 6 files changed, 58 insertions(+), 1 deletion(-)

diff -r 717f0dce76e7 -r 2324110ef2c6 xen/arch/x86/hvm/svm/x86_32/exits.S
--- a/xen/arch/x86/hvm/svm/x86_32/exits.S       Sat Dec 22 10:27:26 2007 +0000
+++ b/xen/arch/x86/hvm/svm/x86_32/exits.S       Thu Dec 27 10:39:04 2007 +0000
@@ -94,6 +94,19 @@ svm_trace_done:
         movl VMCB_rflags(%ecx),%eax
         movl %eax,UREGS_eflags(%esp)
 
+#ifndef NDEBUG
+        movw $0xbeef,%ax
+        movw %ax,UREGS_error_code(%esp)
+        movw %ax,UREGS_entry_vector(%esp)
+        movw %ax,UREGS_saved_upcall_mask(%esp)
+        movw %ax,UREGS_cs(%esp)
+        movw %ax,UREGS_ds(%esp)
+        movw %ax,UREGS_es(%esp)
+        movw %ax,UREGS_fs(%esp)
+        movw %ax,UREGS_gs(%esp)
+        movw %ax,UREGS_ss(%esp)
+#endif
+
         STGI
 .globl svm_stgi_label;
 svm_stgi_label:
diff -r 717f0dce76e7 -r 2324110ef2c6 xen/arch/x86/hvm/svm/x86_64/exits.S
--- a/xen/arch/x86/hvm/svm/x86_64/exits.S       Sat Dec 22 10:27:26 2007 +0000
+++ b/xen/arch/x86/hvm/svm/x86_64/exits.S       Thu Dec 27 10:39:04 2007 +0000
@@ -113,6 +113,19 @@ svm_trace_done:
         movq VMCB_rflags(%rcx),%rax
         movq %rax,UREGS_eflags(%rsp)
 
+#ifndef NDEBUG
+        movw $0xbeef,%ax
+        movw %ax,UREGS_error_code(%rsp)
+        movw %ax,UREGS_entry_vector(%rsp)
+        movw %ax,UREGS_saved_upcall_mask(%rsp)
+        movw %ax,UREGS_cs(%rsp)
+        movw %ax,UREGS_ds(%rsp)
+        movw %ax,UREGS_es(%rsp)
+        movw %ax,UREGS_fs(%rsp)
+        movw %ax,UREGS_gs(%rsp)
+        movw %ax,UREGS_ss(%rsp)
+#endif
+
         STGI
 .globl svm_stgi_label;
 svm_stgi_label:
diff -r 717f0dce76e7 -r 2324110ef2c6 xen/arch/x86/hvm/vmx/x86_32/exits.S
--- a/xen/arch/x86/hvm/vmx/x86_32/exits.S       Sat Dec 22 10:27:26 2007 +0000
+++ b/xen/arch/x86/hvm/vmx/x86_32/exits.S       Thu Dec 27 10:39:04 2007 +0000
@@ -40,7 +40,6 @@
         movl (reg),reg;
 
 #define HVM_SAVE_ALL_NOSEGREGS                                              \
-        movl $0, 0xc(%esp);  /* XXX why do we need to force eflags==0 ?? */ \
         pushl %eax;                                                         \
         pushl %ebp;                                                         \
         pushl %edi;                                                         \
@@ -68,6 +67,19 @@ ENTRY(vmx_asm_vmexit_handler)
         VMREAD(UREGS_esp)
         movl $GUEST_RFLAGS,%eax
         VMREAD(UREGS_eflags)
+
+#ifndef NDEBUG
+        movw $0xbeef,%ax
+        movw %ax,UREGS_error_code(%esp)
+        movw %ax,UREGS_entry_vector(%esp)
+        movw %ax,UREGS_saved_upcall_mask(%esp)
+        movw %ax,UREGS_cs(%esp)
+        movw %ax,UREGS_ds(%esp)
+        movw %ax,UREGS_es(%esp)
+        movw %ax,UREGS_fs(%esp)
+        movw %ax,UREGS_gs(%esp)
+        movw %ax,UREGS_ss(%esp)
+#endif
 
         movl %esp,%eax
         push %eax
diff -r 717f0dce76e7 -r 2324110ef2c6 xen/arch/x86/hvm/vmx/x86_64/exits.S
--- a/xen/arch/x86/hvm/vmx/x86_64/exits.S       Sat Dec 22 10:27:26 2007 +0000
+++ b/xen/arch/x86/hvm/vmx/x86_64/exits.S       Thu Dec 27 10:39:04 2007 +0000
@@ -86,6 +86,19 @@ ENTRY(vmx_asm_vmexit_handler)
         movl $GUEST_RFLAGS,%eax
         VMREAD(UREGS_eflags)
 
+#ifndef NDEBUG
+        movw $0xbeef,%ax
+        movw %ax,UREGS_error_code(%rsp)
+        movw %ax,UREGS_entry_vector(%rsp)
+        movw %ax,UREGS_saved_upcall_mask(%rsp)
+        movw %ax,UREGS_cs(%rsp)
+        movw %ax,UREGS_ds(%rsp)
+        movw %ax,UREGS_es(%rsp)
+        movw %ax,UREGS_fs(%rsp)
+        movw %ax,UREGS_gs(%rsp)
+        movw %ax,UREGS_ss(%rsp)
+#endif
+
         movq %rsp,%rdi
         call vmx_vmexit_handler
         jmp vmx_asm_do_vmentry
diff -r 717f0dce76e7 -r 2324110ef2c6 xen/arch/x86/x86_32/asm-offsets.c
--- a/xen/arch/x86/x86_32/asm-offsets.c Sat Dec 22 10:27:26 2007 +0000
+++ b/xen/arch/x86/x86_32/asm-offsets.c Thu Dec 27 10:39:04 2007 +0000
@@ -44,6 +44,7 @@ void __dummy__(void)
     OFFSET(UREGS_eflags, struct cpu_user_regs, eflags);
     OFFSET(UREGS_error_code, struct cpu_user_regs, error_code);
     OFFSET(UREGS_entry_vector, struct cpu_user_regs, entry_vector);
+    OFFSET(UREGS_saved_upcall_mask, struct cpu_user_regs, saved_upcall_mask);
     OFFSET(UREGS_kernel_sizeof, struct cpu_user_regs, esp);
     DEFINE(UREGS_user_sizeof, sizeof(struct cpu_user_regs));
     BLANK();
diff -r 717f0dce76e7 -r 2324110ef2c6 xen/arch/x86/x86_64/asm-offsets.c
--- a/xen/arch/x86/x86_64/asm-offsets.c Sat Dec 22 10:27:26 2007 +0000
+++ b/xen/arch/x86/x86_64/asm-offsets.c Thu Dec 27 10:39:04 2007 +0000
@@ -46,11 +46,16 @@ void __dummy__(void)
     OFFSET(UREGS_rdi, struct cpu_user_regs, rdi);
     OFFSET(UREGS_error_code, struct cpu_user_regs, error_code);
     OFFSET(UREGS_entry_vector, struct cpu_user_regs, entry_vector);
+    OFFSET(UREGS_saved_upcall_mask, struct cpu_user_regs, saved_upcall_mask);
     OFFSET(UREGS_rip, struct cpu_user_regs, rip);
     OFFSET(UREGS_cs, struct cpu_user_regs, cs);
     OFFSET(UREGS_eflags, struct cpu_user_regs, eflags);
     OFFSET(UREGS_rsp, struct cpu_user_regs, rsp);
     OFFSET(UREGS_ss, struct cpu_user_regs, ss);
+    OFFSET(UREGS_ds, struct cpu_user_regs, ds);
+    OFFSET(UREGS_es, struct cpu_user_regs, es);
+    OFFSET(UREGS_fs, struct cpu_user_regs, fs);
+    OFFSET(UREGS_gs, struct cpu_user_regs, gs);
     OFFSET(UREGS_kernel_sizeof, struct cpu_user_regs, es);
     DEFINE(UREGS_user_sizeof, sizeof(struct cpu_user_regs));
     BLANK();

_______________________________________________
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®.