# HG changeset patch # User cegger # Date 1275382033 -7200 Handle interrupts (generic part) diff -r 11f96c916410 -r 5a68e35f53af xen/arch/x86/hvm/hvm.c --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -2284,10 +2284,19 @@ enum hvm_intblk hvm_interrupt_blocked(st ASSERT(v == current); + if ( nestedhvm_enabled(v->domain) && !nestedhvm_gif_isset(v) ) + return hvm_intblk_gif; + if ( (intack.source != hvm_intsrc_nmi) && !(guest_cpu_user_regs()->eflags & X86_EFLAGS_IF) ) return hvm_intblk_rflags_ie; + if ( nestedhvm_enabled(v->domain) && nestedhvm_vcpu_in_guestmode(v) ) { + if ( VCPU_NESTEDHVM(v).nh_hostflags.fields.vintrmask ) + if ( !VCPU_NESTEDHVM(v).nh_hostflags.fields.rflagsif ) + return hvm_intblk_rflags_ie; + } + intr_shadow = hvm_funcs.get_interrupt_shadow(v); if ( intr_shadow & (HVM_INTR_SHADOW_STI|HVM_INTR_SHADOW_MOV_SS) ) diff -r 11f96c916410 -r 5a68e35f53af xen/arch/x86/x86_32/asm-offsets.c --- a/xen/arch/x86/x86_32/asm-offsets.c +++ b/xen/arch/x86/x86_32/asm-offsets.c @@ -132,4 +132,7 @@ void __dummy__(void) OFFSET(MB_flags, multiboot_info_t, flags); OFFSET(MB_cmdline, multiboot_info_t, cmdline); + + OFFSET(NESTEDHVM_hostflags, struct vcpu, arch.hvm_vcpu.nestedhvm.nh_hostflags.bytes); + DEFINE(NESTEDHVM_forcevmexit, 0x4); } diff -r 11f96c916410 -r 5a68e35f53af xen/arch/x86/x86_64/asm-offsets.c --- a/xen/arch/x86/x86_64/asm-offsets.c +++ b/xen/arch/x86/x86_64/asm-offsets.c @@ -156,4 +156,7 @@ void __dummy__(void) OFFSET(MB_flags, multiboot_info_t, flags); OFFSET(MB_cmdline, multiboot_info_t, cmdline); + + OFFSET(NESTEDHVM_hostflags, struct vcpu, arch.hvm_vcpu.nestedhvm.nh_hostflags.bytes); + DEFINE(NESTEDHVM_forcevmexit, 0x4); }