VirtualBox

Changeset 60542 in vbox


Ignore:
Timestamp:
Apr 18, 2016 3:02:26 PM (8 years ago)
Author:
vboxsync
Message:

VMM/APIC: Much fun with alignment and sizes.

Location:
trunk
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vmm/vm.h

    r60307 r60542  
    237237        struct APICCPU      s;
    238238# endif
    239         uint8_t             padding[512];      /* multiple of 64 */
     239        uint8_t             padding[640];      /* multiple of 64 */
    240240    } apic;
    241241#endif
     
    243243    /** Align the following members on page boundary. */
    244244#ifdef VBOX_WITH_NEW_APIC
    245     uint8_t                 abAlignment2[2880];
     245    uint8_t                 abAlignment2[2752];
    246246#else
    247247    uint8_t                 abAlignment2[3392];
  • trunk/src/VBox/VMM/VMMAll/APICAll.cpp

    r60523 r60542  
    9292
    9393/**
    94  * Checks if a vector is set in an APIC Pending Interrupt Bitmap (PIB).
     94 * Checks if a vector is set in an APIC Pending-Interrupt Bitmap (PIB).
    9595 *
    9696 * @returns true if the specified vector is set, false otherwise.
     
    128128
    129129/**
    130  * Sets the vector in an APIC Pending Interrupt Bitmap (PIB).
     130 * Sets the vector in an APIC Pending-Interrupt Bitmap (PIB).
    131131 *
    132132 * @param   pvPib           Opaque pointer to the PIB.
     
    140140
    141141/**
    142  * Clears the vector in an APIC Pending Interrupt Bitmap (PIB).
     142 * Clears the vector in an APIC Pending-Interrupt Bitmap (PIB).
    143143 *
    144144 * @param   pvPib           Opaque pointer to the PIB.
     
    21552155    AssertReturn(u8Pin <= 1, VERR_INVALID_PARAMETER);
    21562156    AssertReturn(u8Level <= 1, VERR_INVALID_PARAMETER);
    2157 
    21582157    LogFlow(("APIC%u: APICLocalInterrupt\n", pVCpu->idCpu));
    21592158
    2160     PCXAPICPAGE  pXApicPage = VMCPU_TO_CXAPICPAGE(pVCpu);
    2161     VBOXSTRICTRC rcStrict   = VINF_SUCCESS;
     2159    VBOXSTRICTRC rcStrict = VINF_SUCCESS;
    21622160
    21632161    /* If the APIC is enabled, the interrupt is subject to LVT programming. */
    21642162    if (apicIsEnabled(pVCpu))
    21652163    {
     2164        PCXAPICPAGE pXApicPage = VMCPU_TO_CXAPICPAGE(pVCpu);
     2165
    21662166        /* Pick the LVT entry corresponding to the interrupt pin. */
    21672167        static const uint16_t s_au16LvtOffsets[] =
  • trunk/src/VBox/VMM/VMMR3/APIC.cpp

    r60516 r60542  
    207207    memset((void *)&pX2ApicPage->self_ipi, 0, sizeof(pX2ApicPage->self_ipi));
    208208
    209     /* Clear the posted interrupt bitmaps. */
     209    /* Clear the pending-interrupt bitmaps. */
    210210    PAPICCPU pApicCpu = VMCPU_TO_APICCPU(pVCpu);
    211211    memset((void *)&pApicCpu->ApicPibLevel, 0, sizeof(APICPIB));
     
    251251    LogFlow(("APIC%u: APICR3Reset\n", pVCpu->idCpu));
    252252
    253 #ifdef RT_STRICT
     253#ifdef VBOX_STRICT
    254254    /* Verify that the initial APIC ID reported via CPUID matches our VMCPU ID assumption. */
    255     CPUMCPUIDLEAF CpuLeaf;
    256     int rc = CPUMR3CpuIdGetLeaf(pVCpu->CTX_SUFF(pVM), &CpuLeaf, 1, 0);
    257     AssertRC(rc);
    258     Assert(((CpuLeaf.uEbx >> 24) & 0xff) == pVCpu->idCpu);
     255    uint32_t uEax, uEbx, uEcx, uEdx;
     256    uEax = uEbx = uEcx = uEdx = UINT32_MAX;
     257    CPUMGetGuestCpuId(pVCpu, 1, 0, &uEax, &uEbx, &uEcx, &uEdx);
     258    Assert(((uEbx >> 24) & 0xff) == pVCpu->idCpu);
    259259#endif
    260260
     261    /*
     262     * The state following a power-up or reset is a superset of the INIT state.
     263     * See Intel spec. 10.4.7.3 "Local APIC State After an INIT Reset ('Wait-for-SIPI' State)"
     264     */
    261265    apicR3InitIpi(pVCpu);
    262 
    263     PXAPICPAGE pXApicPage = VMCPU_TO_XAPICPAGE(pVCpu);
    264266
    265267    /*
     
    268270     * The version determines the number of LVT entries and size of the APIC ID (8 bits for P4).
    269271     */
     272    PXAPICPAGE pXApicPage = VMCPU_TO_XAPICPAGE(pVCpu);
    270273#if XAPIC_HARDWARE_VERSION == XAPIC_HARDWARE_VERSION_P4
    271274    pXApicPage->version.u.u8MaxLvtEntry = XAPIC_MAX_LVT_ENTRIES_P4 - 1;
     
    276279#endif
    277280
    278     /** @todo It isn't very clear where the default base address is (re)initialized,
    279      *        atm we do it here in Reset. */
     281    /** @todo It isn't clear in the spec. where exactly the default base address
     282     *        is (re)initialized, atm we do it here in Reset. */
    280283    apicR3ResetBaseMsr(pVCpu);
    281284
     
    985988            SupApicPage.Phys = NIL_RTHCPHYS;
    986989
     990            Assert(pVCpu->idCpu == idCpu);
    987991            Assert(pApicCpu->pvApicPageR3 == NIL_RTR0PTR);
    988992            Assert(pApicCpu->pvApicPageR0 == NIL_RTR0PTR);
     
    11541158    pApic->pApicDevRC   = PDMINS_2_DATA_RCPTR(pDevIns);
    11551159
    1156     rc = apicR3InitState(pVM);
    1157     AssertRCReturn(rc, rc);
     1160    apicR3InitState(pVM);
    11581161
    11591162    /*
  • trunk/src/VBox/VMM/include/APICInternal.h

    r60516 r60542  
    441441    /** @} */
    442442
    443     /** @name The APIC pending interrupt bitmap (PIB).
     443    /** @name The APIC pending-interrupt bitmap (PIB).
    444444     * @{ */
    445445    /** The host-context physical address of the PIB. */
     
    519519    /** @} */
    520520
    521     /** @name The pending interrupt bitmaps (PIB).
     521    /** @name The pending-interrupt bitmaps (PIB).
    522522     * @{ */
    523523    /** The host-context physical address of the page. */
  • trunk/src/VBox/VMM/testcase/Makefile.kmk

    r60425 r60542  
    152152  tstVMStructRC_DEFS    += VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
    153153 endif
     154 ifdef VBOX_WITH_NEW_APIC
     155  tstVMStructRC_DEFS    += VBOX_WITH_NEW_APIC
     156 endif
    154157 tstVMStructRC_SOURCES   = tstVMStructRC.cpp
    155158 tstVMStructRC_INCS      = \
     
    177180 tstVMStructSize_DEFS  += VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
    178181endif
     182ifdef VBOX_WITH_NEW_APIC
     183 tstVMStructSize_DEFS  += VBOX_WITH_NEW_APIC
     184endif
    179185
    180186tstAsmStructs_TEMPLATE  = VBOXR3AUTOTST
     
    188194ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
    189195 tstAsmStructs_DEFS    += VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
     196endif
     197ifdef VBOX_WITH_NEW_APIC
     198 tstAsmStructs_DEFS    += VBOX_WITH_NEW_APIC
    190199endif
    191200tstAsmStructs_INCS      = \
     
    203212 ifdef VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
    204213  tstAsmStructsRC_DEFS  += VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
     214 endif
     215 ifdef VBOX_WITH_NEW_APIC
     216  tstAsmStructsRC_DEFS  += VBOX_WITH_NEW_APIC
    205217 endif
    206218 tstAsmStructsRC_INCS    = \
     
    482494  tstVMStructDTrace_DEFS  += VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI
    483495 endif
     496 ifdef VBOX_WITH_NEW_APIC
     497  tstVMStructDTrace_DEFS  += VBOX_WITH_NEW_APIC
     498 endif
    484499
    485500
     
    523538                        $(DEFS.$(KBUILD_TARGET).$(KBUILD_TARGET_ARCH)) \
    524539                        $(if $(VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI),VBOX_WITH_VMMR0_DISABLE_LAPIC_NMI,) \
     540                        $(if $(VBOX_WITH_NEW_APIC),VBOX_WITH_NEW_APIC,) \
    525541                ) \
    526542                -f $(if $(eq $(KBUILD_TARGET),darwin),macho,elf) \
  • trunk/src/VBox/VMM/testcase/tstVMStruct.h

    r60403 r60542  
    88
    99/*
    10  * Copyright (C) 2006-2015 Oracle Corporation
     10 * Copyright (C) 2006-2016 Oracle Corporation
    1111 *
    1212 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    13641364#endif
    13651365
     1366#ifdef VBOX_WITH_NEW_APIC
     1367    GEN_CHECK_SIZE(APIC);
     1368    GEN_CHECK_OFF(APIC, pApicDevR0);
     1369    GEN_CHECK_OFF(APIC, pApicDevR3);
     1370    GEN_CHECK_OFF(APIC, pApicDevRC);
     1371    GEN_CHECK_OFF(APIC, pvApicPibR0);
     1372    GEN_CHECK_OFF(APIC, pvApicPibR3);
     1373    GEN_CHECK_OFF(APIC, pvApicPibRC);
     1374    GEN_CHECK_OFF(APIC, cbApicPib);
     1375    GEN_CHECK_OFF(APIC, enmOriginalMode);
     1376    GEN_CHECK_OFF(APICCPU, pvApicPageR0);
     1377    GEN_CHECK_OFF(APICCPU, pvApicPageR3);
     1378    GEN_CHECK_OFF(APICCPU, pvApicPageRC);
     1379    GEN_CHECK_OFF(APICCPU, pvApicPageRC);
     1380    GEN_CHECK_OFF(APICCPU, cbApicPage);
     1381    GEN_CHECK_OFF(APICCPU, pvApicPibR0);
     1382    GEN_CHECK_OFF(APICCPU, pvApicPibR3);
     1383    GEN_CHECK_OFF(APICCPU, pvApicPibRC);
     1384    GEN_CHECK_OFF(APICCPU, ApicPibLevel);
     1385    GEN_CHECK_OFF(APICCPU, pTimerR0);
     1386    GEN_CHECK_OFF(APICCPU, pTimerR3);
     1387    GEN_CHECK_OFF(APICCPU, pTimerRC);
     1388    GEN_CHECK_OFF(APICCPU, TimerCritSect);
     1389#endif
    13661390
    13671391    GEN_CHECK_SIZE(VM);
     
    14251449    GEN_CHECK_OFF(VM, ftm);
    14261450    GEN_CHECK_OFF(VM, rem);
     1451    GEN_CHECK_OFF(VM, gim);
    14271452    GEN_CHECK_OFF(VM, vm);
    14281453    GEN_CHECK_OFF(VM, cfgm);
     1454#ifdef VBOX_WITH_NEW_APIC
     1455    GEN_CHECK_OFF(VM, apic);
     1456#endif
    14291457    GEN_CHECK_OFF(VM, aCpus);
    14301458
     
    14441472    GEN_CHECK_OFF(VMCPU, uAdHoc);
    14451473    GEN_CHECK_OFF(VMCPU, aStatAdHoc);
    1446     GEN_CHECK_OFF(VMCPU, cpum);
    14471474    GEN_CHECK_OFF(VMCPU, hm);
    14481475    GEN_CHECK_OFF(VMCPU, em);
     
    14541481    GEN_CHECK_OFF(VMCPU, iom);
    14551482    GEN_CHECK_OFF(VMCPU, dbgf);
     1483    GEN_CHECK_OFF(VMCPU, gim);
     1484#ifdef VBOX_WITH_NEW_APIC
     1485    GEN_CHECK_OFF(VMCPU, apic);
     1486#endif
    14561487    GEN_CHECK_OFF(VMCPU, pgm);
     1488    GEN_CHECK_OFF(VMCPU, cpum);
    14571489
    14581490#ifndef VBOX_FOR_DTRACE_LIB
  • trunk/src/VBox/VMM/testcase/tstVMStructDTrace.cpp

    r57358 r60542  
    77
    88/*
    9  * Copyright (C) 2006-2015 Oracle Corporation
     9 * Copyright (C) 2006-2016 Oracle Corporation
    1010 *
    1111 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    4343#include "REMInternal.h"
    4444#include "HMInternal.h"
     45#ifdef VBOX_WITH_NEW_APIC
     46# include "APICInternal.h"
     47#endif
    4548#include "VMMInternal.h"
    4649#include "DBGFInternal.h"
  • trunk/src/VBox/VMM/testcase/tstVMStructRC.cpp

    r57358 r60542  
    99
    1010/*
    11  * Copyright (C) 2006-2015 Oracle Corporation
     11 * Copyright (C) 2006-2016 Oracle Corporation
    1212 *
    1313 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    7171#include "REMInternal.h"
    7272#include "HMInternal.h"
     73#ifdef VBOX_WITH_NEW_APIC
     74# include "APICInternal.h"
     75#endif
    7376#include "PATMInternal.h"
    7477#include "VMMInternal.h"
  • trunk/src/VBox/VMM/testcase/tstVMStructSize.cpp

    r60307 r60542  
    77
    88/*
    9  * Copyright (C) 2006-2015 Oracle Corporation
     9 * Copyright (C) 2006-2016 Oracle Corporation
    1010 *
    1111 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    4646#include "DBGFInternal.h"
    4747#include "GIMInternal.h"
    48 #include "APICInternal.h"
     48#ifdef VBOX_WITH_NEW_APIC
     49# include "APICInternal.h"
     50#endif
    4951#include "STAMInternal.h"
    5052#include "VMInternal.h"
Note: See TracChangeset for help on using the changeset viewer.

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