VirtualBox

Changeset 33935 in vbox for trunk/src/VBox/VMM


Ignore:
Timestamp:
Nov 10, 2010 3:37:02 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
67595
Message:

VMM: mask all Local APIC interrupt vectors which are set up to NMI mode during world switch (raw mode only)

Location:
trunk/src/VBox/VMM
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/CPUMInternal.h

    r33540 r33935  
    313313
    314314#if HC_ARCH_BITS == 32
    315     /** Align the next member, and thereby the structure, on a 64-byte boundary. */
    316315    uint8_t                 abPadding2[4];
    317316#endif
    318317
     318#ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
     319    RTHCPTR                 pvApicBase;
     320    uint32_t                fApicDisVectors;
     321    uint8_t                 abPadding3[HC_ARCH_BITS == 32 ? 56 : 52];
     322#endif
     323
    319324    /**
    320      * Guest context on raw mode entry.
     325     * Guest context on raw mode entry. 64-byte aligned!
    321326     * This a debug feature, see CPUMR3SaveEntryCtx.
    322327     */
  • trunk/src/VBox/VMM/CPUMInternal.mac

    r30263 r33935  
    8181    .aGuestCpuIdCentaur   resb    16*4
    8282    .GuestCpuIdDef        resb    16
     83
     84%if HC_ARCH_BITS == 32
     85    .abPadding2           resb    4
     86%endif
     87
     88%ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
     89 %if HC_ARCH_BITS == 32
     90    .pvApicBase           resd    1
     91    .fApicDisVectors      resd    1
     92 %else
     93    .pvApicBase           resq    1
     94    .fApicDisVectors      resd    1
     95 %endif
     96%endif
    8397
    8498    alignb 64
     
    450464    sub     %1, dword [%1 + CPUMCPU.offCPUM]
    451465%endmacro
     466
     467;;
     468; Converts the CPUMCPU pointer to CPUM
     469; @param   %1   register name (PVM)
     470; @param   %2   register name (CPUMCPU offset)
     471%macro CPUM_FROM_CPUMCPU_WITH_OFFSET 2
     472    sub     %1, %2
     473%endmacro
  • trunk/src/VBox/VMM/Makefile.kmk

    r32253 r33935  
    3838ifdef VBOX_WITH_R0_LOGGING
    3939 VMM_COMMON_DEFS += VBOX_WITH_R0_LOGGING
     40endif
     41ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
     42 VMM_COMMON_DEFS += VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
    4043endif
    4144# VMM_COMMON_DEFS += VBOX_WITH_NS_ACCOUNTING_STATS
  • trunk/src/VBox/VMM/VMMR0/CPUMR0.cpp

    r29250 r33935  
    3030#include <iprt/assert.h>
    3131#include <iprt/asm-amd64-x86.h>
    32 
     32#ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
     33# include <iprt/mem.h>
     34# include <iprt/memobj.h>
     35# include <VBox/apic.h>
     36#endif
     37
     38
     39#ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
     40/** Local APIC mappings */
     41typedef struct
     42{
     43    bool        fEnabled;
     44    uint64_t    PhysBase;
     45    RTR0MEMOBJ  hMemObj;
     46    RTR0MEMOBJ  hMapObj;
     47    void        *pv;
     48    uint32_t    fHasThermal;
     49} CPUMHOSTLAPIC;
     50
     51static CPUMHOSTLAPIC g_aLApics[RTCPUSET_MAX_CPUS];
     52static int  cpumR0MapLocalApics(void);
     53static void cpumR0UnmapLocalApics(void);
     54#endif
     55
     56
     57/**
     58 * Does the Ring-0 CPU initialization once during module load.
     59 * XXX Host-CPU hot-plugging?
     60 */
     61VMMR0DECL(int) CPUMR0ModuleInit(void)
     62{
     63#ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
     64    return cpumR0MapLocalApics();
     65#endif
     66}
     67
     68
     69/**
     70 * Terminate the module.
     71 */
     72VMMR0DECL(int) CPUMR0ModuleTerm(void)
     73{
     74#ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
     75    cpumR0UnmapLocalApics();
     76#endif
     77    return VINF_SUCCESS;
     78}
    3379
    3480
     
    4591{
    4692    LogFlow(("CPUMR0Init: %p\n", pVM));
     93
     94#ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
     95    for (unsigned i = 0; i < RT_ELEMENTS(g_aLApics); i++)
     96        if (g_aLApics[i].pv)
     97            SUPR0Printf(" CPU%d: %llx => %llx\n", i, g_aLApics[i].PhysBase, (uint64_t)g_aLApics[i].pv);
     98#endif
    4799
    48100    /*
     
    590642}
    591643
     644
     645#ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
     646/**
     647 * Worker for cpumR0MapLocalApics. Check each CPU for a present Local APIC.
     648 * Play safe and treat each CPU separate.
     649 */
     650static void cpumR0MapLocalApicWorker(RTCPUID idCpu, void *pvUser1, void *pvUser2)
     651{
     652    uint32_t u32MaxIdx;
     653    uint32_t u32EBX, u32ECX, u32EDX;
     654    int iCpu = RTMpCpuIdToSetIndex(idCpu);
     655    Assert(iCpu < RTCPUSET_MAX_CPUS);
     656    ASMCpuId(0, &u32MaxIdx, &u32EBX, &u32ECX, &u32EDX);
     657    if (   (   (   u32EBX == X86_CPUID_VENDOR_INTEL_EBX
     658                && u32ECX == X86_CPUID_VENDOR_INTEL_ECX
     659                && u32EDX == X86_CPUID_VENDOR_INTEL_EDX)
     660           ||  (   u32EBX == X86_CPUID_VENDOR_AMD_EBX
     661                && u32ECX == X86_CPUID_VENDOR_AMD_ECX
     662                && u32EDX == X86_CPUID_VENDOR_AMD_EDX))
     663        && u32MaxIdx >= 1)
     664    {
     665        ASMCpuId(1, &u32MaxIdx, &u32EBX, &u32ECX, &u32EDX);
     666        if (    (u32EDX & X86_CPUID_FEATURE_EDX_APIC)
     667            &&  (u32EDX & X86_CPUID_FEATURE_EDX_MSR))
     668        {
     669            uint64_t u64ApicBase = ASMRdMsr(MSR_IA32_APICBASE);
     670            uint32_t u32MaxExtIdx;
     671            /* see Intel Manual: Local APIC Status and Location: MAXPHYADDR default is bit 36 */
     672            uint64_t u64Mask = UINT64_C(0x0000000ffffff000);
     673            ASMCpuId(0x80000000, &u32MaxExtIdx, &u32EBX, &u32ECX, &u32EDX);
     674            if (   u32MaxExtIdx >= 0x80000008
     675                && u32MaxExtIdx <  0x8000ffff)
     676            {
     677                uint32_t u32PhysBits;
     678                ASMCpuId(0x80000008, &u32PhysBits, &u32EBX, &u32ECX, &u32EDX);
     679                u32PhysBits &= 0xff;
     680                u64Mask = ((UINT64_C(1) << u32PhysBits) - 1) & UINT64_C(0xfffffffffffff000);
     681            }
     682            g_aLApics[iCpu].fEnabled = true;
     683            g_aLApics[iCpu].PhysBase = u64ApicBase & u64Mask;
     684        }
     685    }
     686}
     687
     688
     689/**
     690 * Map the MMIO page of each local APIC in the system.
     691 */
     692static int cpumR0MapLocalApics(void)
     693{
     694    int rc = RTMpOnAll(cpumR0MapLocalApicWorker, NULL, NULL);
     695    for (unsigned iCpu = 0; RT_SUCCESS(rc) && iCpu < RT_ELEMENTS(g_aLApics); iCpu++)
     696    {
     697        if (g_aLApics[iCpu].fEnabled)
     698        {
     699            rc = RTR0MemObjEnterPhys(&g_aLApics[iCpu].hMemObj, g_aLApics[iCpu].PhysBase,
     700                                     PAGE_SIZE, RTMEM_CACHE_POLICY_MMIO);
     701            if (RT_SUCCESS(rc))
     702                rc = RTR0MemObjMapKernel(&g_aLApics[iCpu].hMapObj, g_aLApics[iCpu].hMemObj, (void*)-1,
     703                                         PAGE_SIZE, RTMEM_PROT_READ | RTMEM_PROT_WRITE);
     704            if (RT_SUCCESS(rc))
     705            {
     706                void *pApicBase = RTR0MemObjAddress(g_aLApics[iCpu].hMapObj);
     707                uint32_t ApicVersion = ApicRegRead(pApicBase, APIC_REG_VERSION);
     708                /*
     709                 * 0x0X       82489 external APIC
     710                 * 0x1X       Local APIC
     711                 * 0x2X..0xFF reserved
     712                 */
     713                if ((APIC_REG_VERSION_GET_VER(ApicVersion) & 0xF0) != 0x10)
     714                {
     715                    RTR0MemObjFree(g_aLApics[iCpu].hMapObj, true /* fFreeMappings */);
     716                    RTR0MemObjFree(g_aLApics[iCpu].hMemObj, true /* fFreeMappings */);
     717                    g_aLApics[iCpu].fEnabled = false;
     718                    continue;
     719                }
     720                g_aLApics[iCpu].fHasThermal = APIC_REG_VERSION_GET_MAX_LVT(ApicVersion) >= 5;
     721                g_aLApics[iCpu].pv = pApicBase;
     722            }
     723        }
     724    }
     725    if (RT_FAILURE(rc))
     726    {
     727        cpumR0UnmapLocalApics();
     728        return rc;
     729    }
     730
     731    return VINF_SUCCESS;
     732}
     733
     734
     735/**
     736 * Unmap the Local APIC of all host CPUs.
     737 */
     738static void cpumR0UnmapLocalApics(void)
     739{
     740    for (unsigned iCpu = RT_ELEMENTS(g_aLApics); iCpu-- > 0;)
     741    {
     742        if (g_aLApics[iCpu].pv)
     743        {
     744            RTR0MemObjFree(g_aLApics[iCpu].hMapObj, true /* fFreeMappings */);
     745            RTR0MemObjFree(g_aLApics[iCpu].hMemObj, true /* fFreeMappings */);
     746            g_aLApics[iCpu].fEnabled = false;
     747            g_aLApics[iCpu].pv = NULL;
     748        }
     749    }
     750}
     751
     752
     753/**
     754 * Write the Local APIC mapping address of the current host CPU to CPUM to be
     755 * able to access the APIC registers in the raw mode switcher for disabling/
     756 * re-enabling the NMI. Must be called with disabled preemption or disabled
     757 * interrupts!
     758 *
     759 * @param   pVM         VM handle.
     760 * @param   idHostCpu   The ID of the current host CPU.
     761 */
     762VMMR0DECL(void) CPUMR0SetLApic(PVM pVM, RTCPUID idHostCpu)
     763{
     764    pVM->cpum.s.pvApicBase = g_aLApics[RTMpCpuIdToSetIndex(idHostCpu)].pv;
     765}
     766
     767#endif /* VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI */
  • trunk/src/VBox/VMM/VMMR0/VMMR0.cpp

    r33595 r33935  
    117117                        if (RT_SUCCESS(rc))
    118118                        {
    119                             LogFlow(("ModuleInit: returns success.\n"));
    120                             return VINF_SUCCESS;
     119                            rc = CPUMR0ModuleInit();
     120                            if (RT_SUCCESS(rc))
     121                            {
     122                                LogFlow(("ModuleInit: returns success.\n"));
     123                                return VINF_SUCCESS;
     124                            }
    121125                        }
    122126
     
    148152{
    149153    LogFlow(("ModuleTerm:\n"));
     154
     155    /*
     156     * Terminate the CPUM module (Local APIC cleanup).
     157     */
     158    CPUMR0ModuleTerm();
    150159
    151160    /*
     
    574583                RTTHREADPREEMPTSTATE PreemptState = RTTHREADPREEMPTSTATE_INITIALIZER;
    575584                RTThreadPreemptDisable(&PreemptState);
    576                 ASMAtomicWriteU32(&pVCpu->idHostCpu, RTMpCpuId());
     585                RTCPUID idHostCpu = RTMpCpuId();
     586#ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
     587                CPUMR0SetLApic(pVM, idHostCpu);
     588#endif
     589                ASMAtomicWriteU32(&pVCpu->idHostCpu, idHostCpu);
    577590                if (pVM->vmm.s.fUsePeriodicPreemptionTimers)
    578591                    GVMMR0SchedUpdatePeriodicPreemptionTimer(pVM, pVCpu->idHostCpu, TMCalcHostTimerFrequency(pVM, pVCpu));
     
    887900            RTCCUINTREG fFlags = ASMIntDisableFlags();
    888901
     902#ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
     903            RTCPUID idHostCpu = RTMpCpuId();
     904            CPUMR0SetLApic(pVM, idHostCpu);
     905#endif
     906
    889907            /* We might need to disable VT-x if the active switcher turns off paging. */
    890908            rc = HWACCMR0EnterSwitcher(pVM, &fVTxDisabled);
  • trunk/src/VBox/VMM/VMMSwitcher/AMD64andLegacy.mac

    r33540 r33935  
    2323;*******************************************************************************
    2424%include "VBox/asmdefs.mac"
     25%include "VBox/apic.mac"
    2526%include "VBox/x86.mac"
    2627%include "VBox/cpum.mac"
     
    250251    pop     qword [rdx + r8 + CPUMCPU.Host.rflags]
    251252
     253%ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
     254    ; Block Local APIC NMI vectors
     255    mov     rbx, [rdx + CPUM.pvApicBase]
     256    or      rbx, rbx
     257    jz      htg_noapic
     258    xor     edi, edi
     259    mov     eax, [rbx + APIC_REG_LVT_LINT0]
     260    mov     ecx, eax
     261    and     ecx, (APIC_REG_LVT_MASKED | APIC_REG_LVT_MODE_MASK)
     262    cmp     ecx, APIC_REG_LVT_MODE_NMI
     263    jne     htg_nolint0
     264    or      edi, 0x01
     265    or      eax, APIC_REG_LVT_MASKED
     266    mov     [rbx + APIC_REG_LVT_LINT0], eax
     267    mov     eax, [rbx + APIC_REG_LVT_LINT0] ; write completion
     268htg_nolint0:
     269    mov     eax, [rbx + APIC_REG_LVT_LINT1]
     270    mov     ecx, eax
     271    and     ecx, (APIC_REG_LVT_MASKED | APIC_REG_LVT_MODE_MASK)
     272    cmp     ecx, APIC_REG_LVT_MODE_NMI
     273    jne     htg_nolint1
     274    or      edi, 0x02
     275    or      eax, APIC_REG_LVT_MASKED
     276    mov     [rbx + APIC_REG_LVT_LINT1], eax
     277    mov     eax, [rbx + APIC_REG_LVT_LINT1] ; write completion
     278htg_nolint1:
     279    mov     eax, [rbx + APIC_REG_LVT_PC]
     280    mov     ecx, eax
     281    and     ecx, (APIC_REG_LVT_MASKED | APIC_REG_LVT_MODE_MASK)
     282    cmp     ecx, APIC_REG_LVT_MODE_NMI
     283    jne     htg_nopc
     284    or      edi, 0x04
     285    or      eax, APIC_REG_LVT_MASKED
     286    mov     [rbx + APIC_REG_LVT_PC], eax
     287    mov     eax, [rbx + APIC_REG_LVT_PC] ; write completion
     288htg_nopc:
     289    mov     eax, [rbx + APIC_REG_VERSION]
     290    shr     eax, 16
     291    cmp     al, 5
     292    jb      htg_notherm
     293    mov     eax, [rbx + APIC_REG_LVT_THMR]
     294    mov     ecx, eax
     295    and     ecx, (APIC_REG_LVT_MASKED | APIC_REG_LVT_MODE_MASK)
     296    cmp     ecx, APIC_REG_LVT_MODE_NMI
     297    jne     htg_notherm
     298    or      edi, 0x08
     299    or      eax, APIC_REG_LVT_MASKED
     300    mov     [rbx + APIC_REG_LVT_THMR], eax
     301    mov     eax, [rbx + APIC_REG_LVT_THMR] ; write completion
     302htg_notherm:
     303    mov     [rdx + CPUM.fApicDisVectors], edi
     304htg_noapic:
     305%endif
     306
    252307    FIXUP FIX_NO_SYSENTER_JMP, 0, htg_no_sysenter - NAME(Start) ; this will insert a jmp htg_no_sysenter if host doesn't use sysenter.
    253308    ; save MSR_IA32_SYSENTER_CS register.
     
    10491104    mov     rdx, rbx
    10501105
     1106%ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
     1107    ;Unblock Local APIC NMI vectors
     1108    mov     ecx, [rdx + CPUM.fApicDisVectors]
     1109    mov     rbx, [rdx + CPUM.pvApicBase]
     1110    shr     ecx, 1
     1111    jnc     gth_nolint0
     1112    and     dword [rbx + APIC_REG_LVT_LINT0], ~APIC_REG_LVT_MASKED
     1113gth_nolint0:
     1114    shr     ecx, 1
     1115    jnc     gth_nolint1
     1116    and     dword [rbx + APIC_REG_LVT_LINT1], ~APIC_REG_LVT_MASKED
     1117gth_nolint1:
     1118    shr     ecx, 1
     1119    jnc     gth_nopc
     1120    and     dword [rbx + APIC_REG_LVT_PC], ~APIC_REG_LVT_MASKED
     1121gth_nopc:
     1122    shr     ecx, 1
     1123    jnc     gth_notherm
     1124    and     dword [rbx + APIC_REG_LVT_THMR], ~APIC_REG_LVT_MASKED
     1125gth_notherm:
     1126%endif
    10511127
    10521128    ; restore general registers.
  • trunk/src/VBox/VMM/VMMSwitcher/LegacyandAMD64.mac

    r30180 r33935  
    2626;*******************************************************************************
    2727%include "VBox/asmdefs.mac"
     28%include "VBox/apic.mac"
    2829%include "VBox/x86.mac"
    2930%include "VBox/cpum.mac"
     
    155156%endif
    156157
     158%ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
     159    CPUM_FROM_CPUMCPU_WITH_OFFSET edx, ebp
     160    mov     ebx, [edx + CPUM.pvApicBase]
     161    or      ebx, ebx
     162    jz      htg_noapic
     163    mov     eax, [ebx + APIC_REG_LVT_LINT0]
     164    mov     ecx, eax
     165    and     ecx, (APIC_REG_LVT_MASKED | APIC_REG_LVT_MODE_MASK)
     166    cmp     ecx, APIC_REG_LVT_MODE_NMI
     167    jne     htg_nolint0
     168    or      edi, 0x01
     169    or      eax, APIC_REG_LVT_MASKED
     170    mov     [ebx + APIC_REG_LVT_LINT0], eax
     171    mov     eax, [ebx + APIC_REG_LVT_LINT0] ; write completion
     172htg_nolint0:
     173    mov     eax, [ebx + APIC_REG_LVT_LINT1]
     174    mov     ecx, eax
     175    and     ecx, (APIC_REG_LVT_MASKED | APIC_REG_LVT_MODE_MASK)
     176    cmp     ecx, APIC_REG_LVT_MODE_NMI
     177    jne     htg_nolint1
     178    or      edi, 0x02
     179    or      eax, APIC_REG_LVT_MASKED
     180    mov     [ebx + APIC_REG_LVT_LINT1], eax
     181    mov     eax, [ebx + APIC_REG_LVT_LINT1] ; write completion
     182htg_nolint1:
     183    mov     eax, [ebx + APIC_REG_LVT_PC]
     184    mov     ecx, eax
     185    and     ecx, (APIC_REG_LVT_MASKED | APIC_REG_LVT_MODE_MASK)
     186    cmp     ecx, APIC_REG_LVT_MODE_NMI
     187    jne     htg_nopc
     188    or      edi, 0x04
     189    or      eax, APIC_REG_LVT_MASKED
     190    mov     [ebx + APIC_REG_LVT_PC], eax
     191    mov     eax, [ebx + APIC_REG_LVT_PC] ; write completion
     192htg_nopc:
     193    mov     eax, [ebx + APIC_REG_VERSION]
     194    shr     eax, 16
     195    cmp     al, 5
     196    jb      htg_notherm
     197    mov     eax, [ebx + APIC_REG_LVT_THMR]
     198    mov     ecx, eax
     199    and     ecx, (APIC_REG_LVT_MASKED | APIC_REG_LVT_MODE_MASK)
     200    cmp     ecx, APIC_REG_LVT_MODE_NMI
     201    jne     htg_notherm
     202    or      edi, 0x08
     203    or      eax, APIC_REG_LVT_MASKED
     204    mov     [ebx + APIC_REG_LVT_THMR], eax
     205    mov     eax, [ebx + APIC_REG_LVT_THMR] ; write completion
     206htg_notherm:
     207    mov     [edx + CPUM.fApicDisVectors], edi
     208htg_noapic:
     209    CPUMCPU_FROM_CPUM_WITH_OFFSET edx, ebp
     210%endif
     211
    157212    ; control registers.
    158213    mov     eax, cr0
     
    287342    ; Load CPUM pointer into rdx
    288343    mov     rdx, [NAME(pCpumIC) wrt rip]
    289     CPUMCPU_FROM_CPUM_WITH_OFFSET    edx, ebp
     344    CPUMCPU_FROM_CPUM_WITH_OFFSET edx, ebp
    290345
    291346    mov     rax, cs
     
    369424    ; Load CPUM pointer into rdx
    370425    mov     rdx, [NAME(pCpumIC) wrt rip]
    371     CPUMCPU_FROM_CPUM_WITH_OFFSET    edx, ebp
     426    CPUMCPU_FROM_CPUM_WITH_OFFSET edx, ebp
    372427
    373428%ifdef VBOX_WITH_CRASHDUMP_MAGIC
     
    516571    FIXUP FIX_GC_CPUM_OFF, 1, 0
    517572    mov     edx, 0ffffffffh
    518     CPUMCPU_FROM_CPUM_WITH_OFFSET    edx, ebp
     573    CPUMCPU_FROM_CPUM_WITH_OFFSET edx, ebp
    519574    mov     esi, [edx + CPUMCPU.Host.cr3]
    520575    mov     cr3, esi
     
    523578    FIXUP FIX_HC_CPUM_OFF, 1, 0
    524579    mov     edx, 0ffffffffh
    525     CPUMCPU_FROM_CPUM_WITH_OFFSET    edx, ebp
     580    CPUMCPU_FROM_CPUM_WITH_OFFSET edx, ebp
    526581
    527582    ; restore the host EFER
     
    570625    ;mov     ecx, [edx + CPUMCPU.Host.cr2] ; assumes this is waste of time.
    571626    ;mov     cr2, ecx
     627
     628%ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
     629    ; Restore blocked Local APIC NMI vectors
     630    CPUM_FROM_CPUMCPU_WITH_OFFSET edx, ebp
     631    mov     ebx, [edx + CPUM.pvApicBase]
     632    mov     ecx, [edx + CPUM.fApicDisVectors]
     633    CPUMCPU_FROM_CPUM_WITH_OFFSET edx, ebp
     634    shr     ecx, 1
     635    jnc     gth_nolint0
     636    and     dword [ebx + APIC_REG_LVT_LINT0], ~APIC_REG_LVT_MASKED
     637gth_nolint0:
     638    shr     ecx, 1
     639    jnc     gth_nolint1
     640    and     dword [ebx + APIC_REG_LVT_LINT1], ~APIC_REG_LVT_MASKED
     641gth_nolint1:
     642    shr     ecx, 1
     643    jnc     gth_nopc
     644    and     dword [ebx + APIC_REG_LVT_PC], ~APIC_REG_LVT_MASKED
     645gth_nopc:
     646    shr     ecx, 1
     647    jnc     gth_notherm
     648    and     dword [ebx + APIC_REG_LVT_THMR], ~APIC_REG_LVT_MASKED
     649gth_notherm:
     650%endif
    572651
    573652    ; restore general registers.
  • trunk/src/VBox/VMM/VMMSwitcher/PAEand32Bit.mac

    r33540 r33935  
    2222;*******************************************************************************
    2323%include "VBox/asmdefs.mac"
     24%include "VBox/apic.mac"
    2425%include "VBox/x86.mac"
    2526%include "VBox/cpum.mac"
     
    136137    pushfd
    137138    pop     dword [edx + CPUMCPU.Host.eflags]
     139
     140    ; Block Local APIC NMI vectors
     141    xor     edi, edi
     142
     143%ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
     144    mov     esi, edx
     145    CPUM_FROM_CPUMCPU(edx)
     146    mov     ebx, [edx + CPUM.pvApicBase]
     147    or      ebx, ebx
     148    jz      htg_noapic
     149    mov     eax, [ebx + APIC_REG_LVT_LINT0]
     150    mov     ecx, eax
     151    and     ecx, (APIC_REG_LVT_MASKED | APIC_REG_LVT_MODE_MASK)
     152    cmp     ecx, APIC_REG_LVT_MODE_NMI
     153    jne     htg_nolint0
     154    or      edi, 0x01
     155    or      eax, APIC_REG_LVT_MASKED
     156    mov     [ebx + APIC_REG_LVT_LINT0], eax
     157    mov     eax, [ebx + APIC_REG_LVT_LINT0] ; write completion
     158htg_nolint0:
     159    mov     eax, [ebx + APIC_REG_LVT_LINT1]
     160    mov     ecx, eax
     161    and     ecx, (APIC_REG_LVT_MASKED | APIC_REG_LVT_MODE_MASK)
     162    cmp     ecx, APIC_REG_LVT_MODE_NMI
     163    jne     htg_nolint1
     164    or      edi, 0x02
     165    or      eax, APIC_REG_LVT_MASKED
     166    mov     [ebx + APIC_REG_LVT_LINT1], eax
     167    mov     eax, [ebx + APIC_REG_LVT_LINT1] ; write completion
     168htg_nolint1:
     169    mov     eax, [ebx + APIC_REG_LVT_PC]
     170    mov     ecx, eax
     171    and     ecx, (APIC_REG_LVT_MASKED | APIC_REG_LVT_MODE_MASK)
     172    cmp     ecx, APIC_REG_LVT_MODE_NMI
     173    jne     htg_nopc
     174    or      edi, 0x04
     175    or      eax, APIC_REG_LVT_MASKED
     176    mov     [ebx + APIC_REG_LVT_PC], eax
     177    mov     eax, [ebx + APIC_REG_LVT_PC] ; write completion
     178htg_nopc:
     179    mov     eax, [ebx + APIC_REG_VERSION]
     180    shr     eax, 16
     181    cmp     al, 5
     182    jb      htg_notherm
     183    mov     eax, [ebx + APIC_REG_LVT_THMR]
     184    mov     ecx, eax
     185    and     ecx, (APIC_REG_LVT_MASKED | APIC_REG_LVT_MODE_MASK)
     186    cmp     ecx, APIC_REG_LVT_MODE_NMI
     187    jne     htg_notherm
     188    or      edi, 0x08
     189    or      eax, APIC_REG_LVT_MASKED
     190    mov     [ebx + APIC_REG_LVT_THMR], eax
     191    mov     eax, [ebx + APIC_REG_LVT_THMR] ; write completion
     192htg_notherm:
     193    mov     [edx + CPUM.fApicDisVectors], edi
     194htg_noapic:
     195    mov     edx, esi
     196%endif
    138197
    139198    FIXUP FIX_NO_SYSENTER_JMP, 0, htg_no_sysenter - NAME(Start) ; this will insert a jmp htg_no_sysenter if host doesn't use sysenter.
     
    935994gth_debug_regs_no:
    936995
     996%ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
     997    mov     esi, edx
     998    CPUM_FROM_CPUMCPU(edx)
     999    ; Restore blocked Local APIC NMI vectors
     1000    mov     ebx, [edx + CPUM.pvApicBase]
     1001    mov     ecx, [edx + CPUM.fApicDisVectors]
     1002    mov     edx, esi
     1003    shr     ecx, 1
     1004    jnc     gth_nolint0
     1005    and     dword [ebx + APIC_REG_LVT_LINT0], ~APIC_REG_LVT_MASKED
     1006gth_nolint0:
     1007    shr     ecx, 1
     1008    jnc     gth_nolint1
     1009    and     dword [ebx + APIC_REG_LVT_LINT1], ~APIC_REG_LVT_MASKED
     1010gth_nolint1:
     1011    shr     ecx, 1
     1012    jnc     gth_nopc
     1013    and     dword [ebx + APIC_REG_LVT_PC], ~APIC_REG_LVT_MASKED
     1014gth_nopc:
     1015    shr     ecx, 1
     1016    jnc     gth_notherm
     1017    and     dword [ebx + APIC_REG_LVT_THMR], ~APIC_REG_LVT_MASKED
     1018gth_notherm:
     1019%endif
     1020
    9371021    ; restore general registers.
    9381022    mov     eax, edi                    ; restore return code. eax = return code !!
  • trunk/src/VBox/VMM/testcase/Makefile.kmk

    r29329 r33935  
    107107  tstVMStructRC_DEFS    += VBOX_WITH_R0_LOGGING
    108108 endif
     109 ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
     110  tstVMStructRC_DEFS    += VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
     111 endif
    109112 tstVMStructRC_SOURCES   = tstVMStructRC.cpp
    110113 tstVMStructRC_INCS      = $(VBOX_PATH_VMM_SRC) $(VBOX_PATH_VMM_SRC)/PATM
     
    129132 tstVMStructSize_DEFS  += VBOX_WITH_R0_LOGGING
    130133endif
     134ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
     135 tstVMStructSize_DEFS  += VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
     136endif
    131137
    132138tstAsmStructs_TEMPLATE  = VBOXR3AUTOTST
     
    137143ifdef VBOX_WITH_R0_LOGGING
    138144 tstAsmStructs_DEFS    += VBOX_WITH_R0_LOGGING
     145endif
     146ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
     147 tstAsmStructs_DEFS    += VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
    139148endif
    140149tstAsmStructs_INCS      = $(VBOX_PATH_VMM_SRC) $(VBOX_VMM_TESTCASE_OUT_DIR)
     
    147156 ifdef VBOX_WITH_R0_LOGGING
    148157  tstAsmStructsRC_DEFS  += VBOX_WITH_R0_LOGGING
     158 endif
     159 ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
     160  tstAsmStructsRC_DEFS  += VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
    149161 endif
    150162 tstAsmStructsRC_INCS    = $(VBOX_PATH_VMM_SRC) $(VBOX_VMM_TESTCASE_OUT_DIR)
     
    286298                        $(DEFS.$(KBUILD_TARGET_ARCH)) \
    287299                        $(DEFS.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) \
     300                        $(if $(VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI),VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI,) \
    288301                ) \
    289302                -f $(if $(eq $(KBUILD_TARGET),darwin),macho,elf) \
  • trunk/src/VBox/VMM/testcase/tstVMStructSize.cpp

    r33540 r33935  
    260260    CHECK_MEMBER_ALIGNMENT(VM, aCpus[0].cpum.s.Hyper, 64);
    261261    CHECK_MEMBER_ALIGNMENT(VM, aCpus[1].cpum.s.Hyper, 64);
     262#ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
     263    CHECK_MEMBER_ALIGNMENT(VM, cpum.s.pvApicBase, 8);
     264#endif
    262265    CHECK_MEMBER_ALIGNMENT(VM, cpum.s.GuestEntry, 64);
    263266
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette