VirtualBox

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


Ignore:
Timestamp:
Jan 22, 2025 3:31:45 PM (2 weeks ago)
Author:
vboxsync
Message:

VMM,VBox/types.h,VBox/err.h: Added VM target platform arch members to the VM structures (mostly for ring-0). Also added the structure sizes and svn revision to VMMR0_DO_GVMM_CREATE_VM. jiraref:VBP-1470

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

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/Makefile.kmk

    r107876 r107893  
    11211121
    11221122#
    1123 # For vmmGetSvnRev.
     1123# For VMMGetSvnRev.
    11241124#
    11251125VMMAll/VMMAll.cpp_DEFS = VBOX_SVN_REV=$(VBOX_SVN_REV)
  • trunk/src/VBox/VMM/VMMR0/GVMMR0.cpp

    r107194 r107893  
    344344*   Internal Functions                                                                                                           *
    345345*********************************************************************************************************************************/
    346 static void gvmmR0InitPerVMData(PGVM pGVM, int16_t hSelf, VMCPUID cCpus, PSUPDRVSESSION pSession);
     346static void gvmmR0InitPerVMData(PGVM pGVM, int16_t hSelf, VMTARGET enmTarget, VMCPUID cCpus, PSUPDRVSESSION pSession);
    347347static DECLCALLBACK(void) gvmmR0HandleObjDestructor(void *pvObj, void *pvGVMM, void *pvHandle);
    348348static int gvmmR0ByGVM(PGVM pGVM, PGVMM *ppGVMM, bool fTakeUsedLock);
     
    800800        return VERR_INVALID_POINTER;
    801801
     802    /* Check that VBoxVMM and VMMR0 are likely to have the same idea about the structures. */
     803    if (pReq->cbVM != sizeof(VM))
     804    {
     805        LogRel(("GVMMR0CreateVMReq: cbVM=%#x, expcted %#x\n", pReq->cbVM, sizeof(VM)));
     806        return VINF_GVM_MISMATCH_VM_SIZE;
     807    }
     808    if (pReq->cbVCpu != sizeof(VMCPU))
     809    {
     810        LogRel(("GVMMR0CreateVMReq: cbVCpu=%#x, expcted %#x\n", pReq->cbVCpu, sizeof(VMCPU)));
     811        return VINF_GVM_MISMATCH_VMCPU_SIZE;
     812    }
     813    if (pReq->uStructVersion != 1)
     814    {
     815        LogRel(("GVMMR0CreateVMReq: uStructVersion=%#x, expcted %#x\n", pReq->uStructVersion, 1));
     816        return VINF_GVM_MISMATCH_VM_STRUCT_VER;
     817    }
     818    if (pReq->uSvnRevision != VMMGetSvnRev())
     819    {
     820        LogRel(("GVMMR0CreateVMReq: uSvnRevision=%u, expcted %u\n", pReq->uSvnRevision, VMMGetSvnRev()));
     821        return VINF_GVM_MISMATCH_VMCPU_SIZE;
     822    }
     823
    802824    /*
    803825     * Execute it.
     
    806828    pReq->pVMR0 = NULL;
    807829    pReq->pVMR3 = NIL_RTR3PTR;
    808     int rc = GVMMR0CreateVM(pSession, pReq->cCpus, &pGVM);
     830    int rc = GVMMR0CreateVM(pSession, pReq->enmTarget, pReq->cCpus, &pGVM);
    809831    if (RT_SUCCESS(rc))
    810832    {
     
    828850 * @thread  EMT.
    829851 */
    830 GVMMR0DECL(int) GVMMR0CreateVM(PSUPDRVSESSION pSession, uint32_t cCpus, PGVM *ppGVM)
     852GVMMR0DECL(int) GVMMR0CreateVM(PSUPDRVSESSION pSession, VMTARGET enmTarget, uint32_t cCpus, PGVM *ppGVM)
    831853{
    832854    LogFlow(("GVMMR0CreateVM: pSession=%p\n", pSession));
     
    839861    if (    cCpus == 0
    840862        ||  cCpus > VMM_MAX_CPU_COUNT)
     863        return VERR_INVALID_PARAMETER;
     864    if (   enmTarget != VMTARGET_X86
     865        && enmTarget != VMTARGET_ARMV8)
    841866        return VERR_INVALID_PARAMETER;
    842867
     
    915940                         */
    916941                        RT_BZERO(pGVM, cPages << HOST_PAGE_SHIFT);
    917                         gvmmR0InitPerVMData(pGVM, iHandle, cCpus, pSession);
     942                        gvmmR0InitPerVMData(pGVM, iHandle, enmTarget, cCpus, pSession);
    918943                        pGVM->gvmm.s.VMMemObj  = hVMMemObj;
    919944#ifndef VBOX_WITH_MINIMAL_R0
     
    11161141 * @param   pGVM        Pointer to the global VM structure.
    11171142 * @param   hSelf       The handle.
     1143 * @param   enmTarget   The target platform architecture of the VM.
    11181144 * @param   cCpus       The CPU count.
    11191145 * @param   pSession    The session this VM is associated with.
    11201146 */
    1121 static void gvmmR0InitPerVMData(PGVM pGVM, int16_t hSelf, VMCPUID cCpus, PSUPDRVSESSION pSession)
     1147static void gvmmR0InitPerVMData(PGVM pGVM, int16_t hSelf, VMTARGET enmTarget, VMCPUID cCpus, PSUPDRVSESSION pSession)
    11221148{
    11231149    AssertCompile(RT_SIZEOFMEMB(GVM,gvmm.s) <= RT_SIZEOFMEMB(GVM,gvmm.padding));
     
    11301156    pGVM->hSelf            = hSelf;
    11311157    pGVM->cCpus            = cCpus;
     1158    pGVM->enmTarget        = enmTarget;
    11321159    pGVM->pSession         = pSession;
    11331160    pGVM->pSelf            = pGVM;
     
    11431170    pGVM->cbSelf           = sizeof(VM);
    11441171    pGVM->cbVCpu           = sizeof(VMCPU);
     1172    pGVM->enmTargetUnsafe  = enmTarget;
    11451173
    11461174    /* GVMM: */
     
    11721200        pGVM->aCpus[i].idCpu                 = i;
    11731201        pGVM->aCpus[i].idCpuUnsafe           = i;
     1202        pGVM->aCpus[i].enmTarget             = enmTarget;
     1203        pGVM->aCpus[i].enmTargetUnsafe       = enmTarget;
    11741204        pGVM->aCpus[i].gvmm.s.HaltEventMulti = NIL_RTSEMEVENTMULTI;
    11751205        pGVM->aCpus[i].gvmm.s.VMCpuMapObj    = NIL_RTR0MEMOBJ;
  • trunk/src/VBox/VMM/VMMR3/GVMMR3.cpp

    r106061 r107893  
    4646 * @returns VBox status code.
    4747 * @param   pUVM        The user mode VM handle.
     48 * @param   enmTarget   The target platform architecture of the VM.
    4849 * @param   cCpus       The number of CPUs to create the VM for.
    4950 * @param   pSession    The support driver session handle.
     
    5253 *                      for use in VMMR0 calls.
    5354 */
    54 VMMR3_INT_DECL(int) GVMMR3CreateVM(PUVM pUVM, uint32_t cCpus, PSUPDRVSESSION pSession, PVM *ppVM, PRTR0PTR ppVMR0)
     55VMMR3_INT_DECL(int) GVMMR3CreateVM(PUVM pUVM, VMTARGET enmTarget, uint32_t cCpus, PSUPDRVSESSION pSession,
     56                                   PVM *ppVM, PRTR0PTR ppVMR0)
    5557{
    5658    AssertReturn(cCpus >= VMM_MIN_CPU_COUNT && cCpus <= VMM_MAX_CPU_COUNT, VERR_INVALID_PARAMETER);
     59    AssertReturn(enmTarget == VMTARGET_X86 || enmTarget == VMTARGET_ARMV8, VERR_INVALID_PARAMETER);
    5760    AssertCompile((sizeof(VM)    & HOST_PAGE_OFFSET_MASK) == 0);
    5861    AssertCompile((sizeof(VMCPU) & HOST_PAGE_OFFSET_MASK) == 0);
     
    6568        CreateVMReq.Hdr.cbReq       = sizeof(CreateVMReq);
    6669        CreateVMReq.pSession        = pSession;
     70        CreateVMReq.enmTarget       = enmTarget;
     71        CreateVMReq.cCpus           = cCpus;
     72        CreateVMReq.cbVM            = sizeof(VM);
     73        CreateVMReq.cbVCpu          = sizeof(VMCPU);
     74        CreateVMReq.uStructVersion  = 1;
     75        CreateVMReq.uSvnRevision    = VMMGetSvnRev();
    6776        CreateVMReq.pVMR0           = NIL_RTR0PTR;
    6877        CreateVMReq.pVMR3           = NULL;
    69         CreateVMReq.cCpus           = cCpus;
    7078        rc = SUPR3CallVMMR0Ex(NIL_RTR0PTR, NIL_VMCPUID, VMMR0_DO_GVMM_CREATE_VM, 0, &CreateVMReq.Hdr);
    7179        if (RT_SUCCESS(rc))
     
    7381            *ppVM   = CreateVMReq.pVMR3;
    7482            *ppVMR0 = CreateVMReq.pVMR0;
     83            Assert(CreateVMReq.pVMR3->enmTarget == enmTarget);
    7584        }
    7685    }
     
    101110        pVM->cbVCpu               = sizeof(VMCPU);
    102111        pVM->uStructVersion       = 1;
     112        pVM->enmTarget            = enmTarget;
    103113
    104114        /* CPUs: */
  • trunk/src/VBox/VMM/VMMR3/VM.cpp

    r107661 r107893  
    598598     */
    599599    RTR0PTR pVMR0;
    600     int rc = GVMMR3CreateVM(pUVM, cCpus, pUVM->vm.s.pSession, &pUVM->pVM, &pVMR0);
     600    int rc = GVMMR3CreateVM(pUVM, VMTARGET_DEFAULT, cCpus, pUVM->vm.s.pSession, &pUVM->pVM, &pVMR0);
    601601    if (RT_SUCCESS(rc))
    602602    {
     
    607607        AssertRelease(pVM->cCpus == cCpus);
    608608        AssertRelease(pVM->uCpuExecutionCap == 100);
     609        AssertRelease(pVM->enmTarget == VMTARGET_DEFAULT);
    609610        AssertCompileMemberAlignment(VM, cpum, 64);
    610611        AssertCompileMemberAlignment(VM, tm, 64);
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