# HG changeset patch
# User Keir Fraser <keir.fraser@xxxxxxxxxx>
# Date 1198792538 0
# Node ID 5e8068c541fc4123646150af21e175412cf962d2
# Parent 73f349c80f355f817e49f6e2897b3637f14fa109
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-unstable changeset: 16660:2324110ef2c6
xen-unstable date: Thu Dec 27 10:39:04 2007 +0000
---
xen/arch/x86/hvm/svm/x86_32/exits.S | 16 ++++++++++++++++
xen/arch/x86/hvm/svm/x86_64/exits.S | 16 ++++++++++++++++
xen/arch/x86/hvm/vmx/x86_32/exits.S | 18 +++++++++++++++++-
xen/arch/x86/hvm/vmx/x86_64/exits.S | 17 +++++++++++++++++
xen/arch/x86/x86_32/asm-offsets.c | 1 +
xen/arch/x86/x86_64/asm-offsets.c | 5 +++++
6 files changed, 72 insertions(+), 1 deletion(-)
diff -r 73f349c80f35 -r 5e8068c541fc xen/arch/x86/hvm/svm/x86_32/exits.S
--- a/xen/arch/x86/hvm/svm/x86_32/exits.S Thu Dec 27 21:46:32 2007 +0000
+++ b/xen/arch/x86/hvm/svm/x86_32/exits.S Thu Dec 27 21:55:38 2007 +0000
@@ -82,6 +82,22 @@ svm_trace_done:
movl VMCB_rax(%ecx),%eax
movl %eax,UREGS_eax(%esp)
+#ifndef NDEBUG
+ movl $0xdeadbeef,%eax
+ 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)
+ movl %eax,UREGS_eflags(%esp)
+ movl %eax,UREGS_eip(%esp)
+ movl %eax,UREGS_esp(%esp)
+#endif
+
STGI
.globl svm_stgi_label;
svm_stgi_label:
diff -r 73f349c80f35 -r 5e8068c541fc xen/arch/x86/hvm/svm/x86_64/exits.S
--- a/xen/arch/x86/hvm/svm/x86_64/exits.S Thu Dec 27 21:46:32 2007 +0000
+++ b/xen/arch/x86/hvm/svm/x86_64/exits.S Thu Dec 27 21:55:38 2007 +0000
@@ -101,6 +101,22 @@ svm_trace_done:
movq VMCB_rax(%rcx),%rax
movq %rax,UREGS_rax(%rsp)
+#ifndef NDEBUG
+ movl $0xdeadbeef,%eax
+ 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)
+ movq %rax,UREGS_eflags(%rsp)
+ movq %rax,UREGS_rip(%rsp)
+ movq %rax,UREGS_rsp(%rsp)
+#endif
+
STGI
.globl svm_stgi_label;
svm_stgi_label:
diff -r 73f349c80f35 -r 5e8068c541fc xen/arch/x86/hvm/vmx/x86_32/exits.S
--- a/xen/arch/x86/hvm/vmx/x86_32/exits.S Thu Dec 27 21:46:32 2007 +0000
+++ b/xen/arch/x86/hvm/vmx/x86_32/exits.S Thu Dec 27 21:55:38 2007 +0000
@@ -30,7 +30,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; \
@@ -51,6 +50,23 @@
ALIGN
ENTRY(vmx_asm_vmexit_handler)
HVM_SAVE_ALL_NOSEGREGS
+
+#ifndef NDEBUG
+ movl $0xdeadbeef,%eax
+ 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)
+ movl %eax,UREGS_eflags(%esp)
+ movl %eax,UREGS_eip(%esp)
+ movl %eax,UREGS_esp(%esp)
+#endif
+
movl %esp,%eax
push %eax
call vmx_vmexit_handler
diff -r 73f349c80f35 -r 5e8068c541fc xen/arch/x86/hvm/vmx/x86_64/exits.S
--- a/xen/arch/x86/hvm/vmx/x86_64/exits.S Thu Dec 27 21:46:32 2007 +0000
+++ b/xen/arch/x86/hvm/vmx/x86_64/exits.S Thu Dec 27 21:55:38 2007 +0000
@@ -66,6 +66,23 @@
ALIGN
ENTRY(vmx_asm_vmexit_handler)
HVM_SAVE_ALL_NOSEGREGS
+
+#ifndef NDEBUG
+ movl $0xdeadbeef,%eax
+ 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)
+ movq %rax,UREGS_eflags(%rsp)
+ movq %rax,UREGS_rip(%rsp)
+ movq %rax,UREGS_rsp(%rsp)
+#endif
+
movq %rsp,%rdi
call vmx_vmexit_handler
jmp vmx_asm_do_vmentry
diff -r 73f349c80f35 -r 5e8068c541fc xen/arch/x86/x86_32/asm-offsets.c
--- a/xen/arch/x86/x86_32/asm-offsets.c Thu Dec 27 21:46:32 2007 +0000
+++ b/xen/arch/x86/x86_32/asm-offsets.c Thu Dec 27 21:55:38 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 73f349c80f35 -r 5e8068c541fc xen/arch/x86/x86_64/asm-offsets.c
--- a/xen/arch/x86/x86_64/asm-offsets.c Thu Dec 27 21:46:32 2007 +0000
+++ b/xen/arch/x86/x86_64/asm-offsets.c Thu Dec 27 21:55:38 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
|