VirtualBox

Changeset 61776 in vbox for trunk/src/VBox/VMM/VMMRC


Ignore:
Timestamp:
Jun 20, 2016 11:25:06 PM (9 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
108168
Message:

CPUM,APIC: Per-CPU APIC CPUID feature bit and MSR_IA32_APICBASE GP mask adjustments.

  • Changed the PDMAPICHLPR3::pfnChangeFeature to pfnSetFeatureLevel, removing the RC and R0 versions.
  • Only use pfnSetFeatureLevel from the APIC constructor to communicate to CPUM the max APIC feature level, not to globally flip CPUID[1].EDX[9].
  • Renamed APIC enmOriginalMode to enmMaxMode, changing the type of it and the corresponding config values to PDMAPICMODE. This makes the above simpler and eliminates two conversion functions. It also makes APICMODE private to the APIC again.
  • Introduced CPUMSetGuestCpuIdPerCpuApicFeature for the per-CPU APIC feature bit management.
  • Introduced CPUMCPUIDLEAF_F_CONTAINS_APIC which works same as CPUMCPUIDLEAF_F_CONTAINS_OSXSAVE and CPUMCPUIDLEAF_F_CONTAINS_APIC_ID. Updated existing CPU profiles with this.
  • Made the patch manager helper function actually handle CPUMCPUIDLEAF_F_CONTAINS_APIC and CPUMCPUIDLEAF_F_CONTAINS_OSXSAVE (the latter previously relied on CPUMSetGuestCpuIdFeature/CPUMClearGuestCpuIdFeature from CPUMSetGuestCR4).
  • Pushed CPUMSetGuestCpuIdFeature, CPUMGetGuestCpuIdFeature and CPUMClearGuestCpuIdFeature down to ring-3 only (now CPUMR3*). The latter two function are deprecated.
  • Added call to CPUMSetGuestCpuIdPerCpuApicFeature from load function just in case the APIC is disabled by the guest at the time of saving.
  • CPUMSetGuestCpuIdFeature ensures we've got a MSR_IA32_APICBASE register when enabling the APIC.
  • CPUMSetGuestCpuIdFeature adjust the MSR_IA32_APICBASE GP mask when enabling x2APIC so setting MSR_IA32_APICBASE_EXTD does not trap.
Location:
trunk/src/VBox/VMM/VMMRC
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMRC/CPUMRCPatchHlp.asm

    r54763 r61776  
    2424%include "VBox/vmm/vm.mac"
    2525%include "VMMRC.mac"
     26%include "iprt/x86.mac"
    2627
    2728
     
    6970    ; Find the middle element
    7071    mov     ebx, edx
    71 cpuid_lookup_leaf_ebx_loeaded:
     72cpuid_lookup_leaf_ebx_loaded:
    7273    sub     ebx, ecx
    7374    shr     ebx, 1 + CPUMCPUIDLEAF_SIZE_LOG2
     
    8384    cmp     ecx, ebx                    ; start == middle? if so, we failed.
    8485    mov     edx, ebx                    ; end = middle;
    85     jne     cpuid_lookup_leaf_ebx_loeaded
     86    jne     cpuid_lookup_leaf_ebx_loaded
    8687    jmp     cpuid_unknown
    8788
     
    179180
    180181    ;
    181     ; Normal return.
     182    ; Normal return unless flags (we ignore APIC_ID as we only have a single CPU with ID 0).
    182183    ;
    183184cpuid_fetch:
     185    test    dword [ss:ebx + CPUMCPUIDLEAF.fFlags], CPUMCPUIDLEAF_F_CONTAINS_APIC | CPUMCPUIDLEAF_F_CONTAINS_OSXSAVE
     186    jnz     cpuid_fetch_with_flags
    184187    mov     edx, [ss:ebx + CPUMCPUIDLEAF.uEdx]
    185188    mov     ecx, [ss:ebx + CPUMCPUIDLEAF.uEcx]
     
    191194    add     esp, 12
    192195    ret
     196
     197
     198    ;
     199    ; Need to adjust the result according to VCpu state.
     200    ;
     201    ; APIC:    CPUID[0x00000001].EDX[9]  &= pVCpu->cpum.s.fCpuIdApicFeatureVisible;
     202    ;          CPUID[0x80000001].EDX[9]  &= pVCpu->cpum.s.fCpuIdApicFeatureVisible;
     203    ;
     204    ; OSXSAVE: CPUID[0x00000001].ECX[27]  = CR4.OSXSAVE;
     205    ;
     206cpuid_fetch_with_flags:
     207    mov     edx, [ss:ebx + CPUMCPUIDLEAF.uEdx]
     208    mov     ecx, [ss:ebx + CPUMCPUIDLEAF.uEcx]
     209
     210    mov     eax, [ss:edi + VM.offVMCPU]
     211
     212    ; APIC
     213    test    dword [ss:ebx + CPUMCPUIDLEAF.fFlags], CPUMCPUIDLEAF_F_CONTAINS_APIC
     214    jz      cpuid_fetch_with_flags_done_apic
     215    test    byte [ss:edi + eax + VMCPU.cpum + CPUMCPU.fCpuIdApicFeatureVisible], 0ffh
     216    jnz     cpuid_fetch_with_flags_done_apic
     217    and     edx, ~X86_CPUID_FEATURE_EDX_APIC
     218cpuid_fetch_with_flags_done_apic:
     219
     220    ; OSXSAVE
     221    test    dword [ss:ebx + CPUMCPUIDLEAF.fFlags], CPUMCPUIDLEAF_F_CONTAINS_OSXSAVE
     222    jz      cpuid_fetch_with_flags_done_osxsave
     223    and     ecx, ~X86_CPUID_FEATURE_ECX_OSXSAVE
     224    test    dword [ss:edi + eax + VMCPU.cpum + CPUMCPU.Guest.cr4], X86_CR4_OSXSAVE
     225    jz      cpuid_fetch_with_flags_done_osxsave
     226    or      ecx, X86_CPUID_FEATURE_ECX_OSXSAVE
     227cpuid_fetch_with_flags_done_osxsave:
     228
     229    ; Load the two remaining registers and jump to the common normal exit.
     230    mov     eax, [ss:ebx + CPUMCPUIDLEAF.uEax]
     231    mov     ebx, [ss:ebx + CPUMCPUIDLEAF.uEbx]
     232    jmp     cpuid_done
     233
    193234ENDPROC CPUMPatchHlpCpuId
    194235
  • trunk/src/VBox/VMM/VMMRC/PDMRCDevice.cpp

    r61735 r61776  
    602602
    603603
    604 /** @interface_method_impl{PDMAPICHLPRC,pfnChangeFeature} */
    605 static DECLCALLBACK(void) pdmRCApicHlp_ChangeFeature(PPDMDEVINS pDevIns, PDMAPICMODE enmMode)
    606 {
    607     PDMDEV_ASSERT_DEVINS(pDevIns);
    608     LogFlow(("pdmRCApicHlp_ChangeFeature: caller=%p/%d: mode=%d\n", pDevIns, pDevIns->iInstance, (int)enmMode));
    609     switch (enmMode)
    610     {
    611         case PDMAPICMODE_NONE:
    612             CPUMClearGuestCpuIdFeature(pDevIns->Internal.s.pVMRC, CPUMCPUIDFEATURE_APIC);
    613             CPUMClearGuestCpuIdFeature(pDevIns->Internal.s.pVMRC, CPUMCPUIDFEATURE_X2APIC);
    614             break;
    615         case PDMAPICMODE_APIC:
    616             CPUMSetGuestCpuIdFeature(pDevIns->Internal.s.pVMRC, CPUMCPUIDFEATURE_APIC);
    617             CPUMClearGuestCpuIdFeature(pDevIns->Internal.s.pVMRC, CPUMCPUIDFEATURE_X2APIC);
    618             break;
    619         case PDMAPICMODE_X2APIC:
    620             CPUMSetGuestCpuIdFeature(pDevIns->Internal.s.pVMRC, CPUMCPUIDFEATURE_X2APIC);
    621             CPUMSetGuestCpuIdFeature(pDevIns->Internal.s.pVMRC, CPUMCPUIDFEATURE_APIC);
    622             break;
    623         default:
    624             AssertMsgFailed(("Unknown APIC mode: %d\n", (int)enmMode));
    625     }
    626 }
    627 
    628 
    629604/** @interface_method_impl{PDMAPICHLPRC,pfnLock} */
    630605static DECLCALLBACK(int) pdmRCApicHlp_Lock(PPDMDEVINS pDevIns, int rc)
     
    661636    pdmRCApicHlp_BusBroadcastEoi,
    662637    pdmRCApicHlp_CalcIrqTag,
    663     pdmRCApicHlp_ChangeFeature,
    664638    pdmRCApicHlp_Lock,
    665639    pdmRCApicHlp_Unlock,
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