From: Keir Fraser Date: Mon, 29 Oct 2007 09:49:39 +0000 (+0000) Subject: x86: Clean up NMI delivery logic. Allow set_trap_table vector 2 to be X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14828^2~21 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=70ee40b004c7a05092c1085772201754941a8543;p=xen.git x86: Clean up NMI delivery logic. Allow set_trap_table vector 2 to be specified as not disabling event delivery, just like any other vector. Signed-off-by: Keir Fraser --- diff --git a/xen/arch/x86/traps.c b/xen/arch/x86/traps.c index 18cfc00423..9ac1d52cbb 100644 --- a/xen/arch/x86/traps.c +++ b/xen/arch/x86/traps.c @@ -413,6 +413,19 @@ static int do_guest_trap( return 0; } +/* + * Called from asm to set up the NMI trapbounce info. + * Returns 0 if no callback is set up, else 1. + */ +asmlinkage int set_guest_nmi_trapbounce(void) +{ + struct vcpu *v = current; + struct trap_bounce *tb = &v->arch.trap_bounce; + do_guest_trap(TRAP_nmi, guest_cpu_user_regs(), 0); + tb->flags &= ~TBF_EXCEPTION; /* not needed for NMI delivery path */ + return !null_trap_bounce(v, tb); +} + static inline int do_trap( int trapnr, struct cpu_user_regs *regs, int use_error_code) { @@ -2706,12 +2719,6 @@ long do_set_trap_table(XEN_GUEST_HANDLE(trap_info_t) traps) if ( cur.address == 0 ) break; - if ( (cur.vector == TRAP_nmi) && !TI_GET_IF(&cur) ) - { - rc = -EINVAL; - break; - } - fixup_guest_code_selector(current->domain, cur.cs); memcpy(&dst[cur.vector], &cur, sizeof(cur)); diff --git a/xen/arch/x86/x86_32/asm-offsets.c b/xen/arch/x86/x86_32/asm-offsets.c index bb59330fbf..2b757c18e2 100644 --- a/xen/arch/x86/x86_32/asm-offsets.c +++ b/xen/arch/x86/x86_32/asm-offsets.c @@ -65,11 +65,6 @@ void __dummy__(void) OFFSET(VCPU_kernel_sp, struct vcpu, arch.guest_context.kernel_sp); OFFSET(VCPU_guest_context_flags, struct vcpu, arch.guest_context.flags); - OFFSET(VCPU_arch_guest_fpu_ctxt, struct vcpu, arch.guest_context.fpu_ctxt); - OFFSET(VCPU_nmi_cs, struct vcpu, - arch.guest_context.trap_ctxt[TRAP_nmi].cs); - OFFSET(VCPU_nmi_addr, struct vcpu, - arch.guest_context.trap_ctxt[TRAP_nmi].address); OFFSET(VCPU_nmi_pending, struct vcpu, nmi_pending); OFFSET(VCPU_nmi_masked, struct vcpu, nmi_masked); DEFINE(_VGCF_failsafe_disables_events, _VGCF_failsafe_disables_events); diff --git a/xen/arch/x86/x86_32/entry.S b/xen/arch/x86/x86_32/entry.S index ca1575c1c6..35273923a5 100644 --- a/xen/arch/x86/x86_32/entry.S +++ b/xen/arch/x86/x86_32/entry.S @@ -259,18 +259,13 @@ process_softirqs: process_nmi: testb $1,VCPU_nmi_masked(%ebx) jnz test_guest_events + sti movb $0,VCPU_nmi_pending(%ebx) - movzwl VCPU_nmi_cs(%ebx),%eax - movl VCPU_nmi_addr(%ebx),%ecx + call set_guest_nmi_trapbounce test %eax,%eax - jz test_guest_events + jz test_all_events movb $1,VCPU_nmi_masked(%ebx) - sti leal VCPU_trap_bounce(%ebx),%edx - movw %ax,TRAPBOUNCE_cs(%edx) - movl %ecx,TRAPBOUNCE_eip(%edx) - movw $FLAT_KERNEL_CS,TRAPBOUNCE_cs(%edx) - movb $TBF_INTERRUPT,TRAPBOUNCE_flags(%edx) call create_bounce_frame jmp test_all_events diff --git a/xen/arch/x86/x86_64/asm-offsets.c b/xen/arch/x86/x86_64/asm-offsets.c index bcb025688c..9bb41bc794 100644 --- a/xen/arch/x86/x86_64/asm-offsets.c +++ b/xen/arch/x86/x86_64/asm-offsets.c @@ -86,11 +86,6 @@ void __dummy__(void) OFFSET(VCPU_kernel_sp, struct vcpu, arch.guest_context.kernel_sp); OFFSET(VCPU_kernel_ss, struct vcpu, arch.guest_context.kernel_ss); OFFSET(VCPU_guest_context_flags, struct vcpu, arch.guest_context.flags); - OFFSET(VCPU_arch_guest_fpu_ctxt, struct vcpu, arch.guest_context.fpu_ctxt); - OFFSET(VCPU_nmi_cs, struct vcpu, - arch.guest_context.trap_ctxt[TRAP_nmi].cs); - OFFSET(VCPU_nmi_addr, struct vcpu, - arch.guest_context.trap_ctxt[TRAP_nmi].address); OFFSET(VCPU_nmi_pending, struct vcpu, nmi_pending); OFFSET(VCPU_nmi_masked, struct vcpu, nmi_masked); DEFINE(_VGCF_failsafe_disables_events, _VGCF_failsafe_disables_events); diff --git a/xen/arch/x86/x86_64/compat/entry.S b/xen/arch/x86/x86_64/compat/entry.S index 6d7c693e71..80736ecc3f 100644 --- a/xen/arch/x86/x86_64/compat/entry.S +++ b/xen/arch/x86/x86_64/compat/entry.S @@ -133,18 +133,13 @@ compat_process_softirqs: compat_process_nmi: testb $1,VCPU_nmi_masked(%rbx) jnz compat_test_guest_events + sti movb $0,VCPU_nmi_pending(%rbx) - movzwl VCPU_nmi_cs(%rbx),%eax - movl VCPU_nmi_addr(%rbx),%ecx + call set_guest_nmi_trapbounce testl %eax,%eax - jz compat_test_guest_events + jz compat_test_all_events movb $1,VCPU_nmi_masked(%rbx) - sti leaq VCPU_trap_bounce(%rbx),%rdx - movw %ax,TRAPBOUNCE_cs(%rdx) - movl %ecx,TRAPBOUNCE_eip(%rdx) - movw $FLAT_COMPAT_KERNEL_CS,TRAPBOUNCE_cs(%rdx) - movb $TBF_INTERRUPT,TRAPBOUNCE_flags(%rdx) call compat_create_bounce_frame jmp compat_test_all_events diff --git a/xen/arch/x86/x86_64/compat/traps.c b/xen/arch/x86/x86_64/compat/traps.c index fddbbd27d8..65c1e90147 100644 --- a/xen/arch/x86/x86_64/compat/traps.c +++ b/xen/arch/x86/x86_64/compat/traps.c @@ -315,12 +315,6 @@ int compat_set_trap_table(XEN_GUEST_HANDLE(trap_info_compat_t) traps) if ( cur.address == 0 ) break; - if ( (cur.vector == TRAP_nmi) && !TI_GET_IF(&cur) ) - { - rc = -EINVAL; - break; - } - fixup_guest_code_selector(current->domain, cur.cs); XLAT_trap_info(dst + cur.vector, &cur); diff --git a/xen/arch/x86/x86_64/entry.S b/xen/arch/x86/x86_64/entry.S index 34c9c2a923..d4b112bc2f 100644 --- a/xen/arch/x86/x86_64/entry.S +++ b/xen/arch/x86/x86_64/entry.S @@ -235,15 +235,13 @@ process_softirqs: process_nmi: testb $1,VCPU_nmi_masked(%rbx) jnz test_guest_events + sti movb $0,VCPU_nmi_pending(%rbx) - movq VCPU_nmi_addr(%rbx),%rax - test %rax,%rax - jz test_guest_events + call set_guest_nmi_trapbounce + test %eax,%eax + jz test_all_events movb $1,VCPU_nmi_masked(%rbx) - sti leaq VCPU_trap_bounce(%rbx),%rdx - movq %rax,TRAPBOUNCE_eip(%rdx) - movb $TBF_INTERRUPT,TRAPBOUNCE_flags(%rdx) call create_bounce_frame jmp test_all_events