[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-3.1-testing] hvm: Register fields CS, DS, ES, FS, GS, SS, etc. are all undefined during
# 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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |