VirtualBox

Ignore:
Timestamp:
Dec 4, 2024 3:20:14 PM (6 weeks ago)
Author:
vboxsync
Message:

VMM: Cleaning up ARMv8 / x86 split. jiraref:VBP-1470

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/DBGFR3Flow.cpp

    r106784 r107227  
    232232    if (   uOpc == OP_ARMV8_A64_B
    233233        || uOpc == OP_ARMV8_A64_BC)
    234     {
    235         return    pDis->armv8.enmCond == kDisArmv8InstrCond_Al
    236                || pDis->armv8.enmCond == kDisArmv8InstrCond_Al1;
    237     }
     234        return pDis->armv8.enmCond == kDisArmv8InstrCond_Al
     235            || pDis->armv8.enmCond == kDisArmv8InstrCond_Al1;
    238236
    239237    return false;
     238
     239#elif defined(VBOX_VMM_TARGET_X86)
     240    RT_NOREF_PV(pDis);
     241    return uOpc == OP_JMP;
     242
    240243#else
    241     RT_NOREF(pDis);
    242 
    243     return uOpc == OP_JMP;
     244# error "port me"
    244245#endif
    245246}
     
    269270
    270271    return false;
     272
     273#elif defined(VBOX_VMM_TARGET_X86)
     274    RT_NOREF_PV(fOpType);
     275    return uOpc == OP_CALL;
     276
    271277#else
    272     RT_NOREF(fOpType);
    273     return uOpc == OP_CALL;
     278# error "port me"
    274279#endif
    275280}
     
    285290{
    286291#ifdef VBOX_VMM_TARGET_ARMV8
    287     if (  uOpc == OP_ARMV8_A64_RET
     292    return uOpc == OP_ARMV8_A64_RET
    288293        || uOpc == OP_ARMV8_A64_RETAA
    289294        || uOpc == OP_ARMV8_A64_RETAB
    290295        || uOpc == OP_ARMV8_A64_ERET
    291296        || uOpc == OP_ARMV8_A64_ERETAA
    292         || uOpc == OP_ARMV8_A64_ERETAB)
    293         return true;
    294 
    295     return false;
    296 #else
    297     if (   uOpc == OP_RETN
     297        || uOpc == OP_ARMV8_A64_ERETAB;
     298
     299#elif defined(VBOX_VMM_TARGET_X86)
     300    return uOpc == OP_RETN
    298301        || uOpc == OP_RETF
    299302        || uOpc == OP_IRET
    300303        || uOpc == OP_SYSEXIT
    301         || uOpc == OP_SYSRET)
    302         return true;
    303 
    304     return false;
     304        || uOpc == OP_SYSRET;
     305
     306#else
     307# error "port me"
    305308#endif
    306309}
     
    316319static bool dbgfR3FlowAddrEqual(PDBGFADDRESS pAddr1, PDBGFADDRESS pAddr2)
    317320{
    318     return    pAddr1->Sel == pAddr2->Sel
    319            && pAddr1->off == pAddr2->off;
     321    return pAddr1->Sel == pAddr2->Sel
     322        && pAddr1->off == pAddr2->off;
    320323}
    321324
     
    330333static bool dbgfR3FlowAddrLower(PDBGFADDRESS pAddr1, PDBGFADDRESS pAddr2)
    331334{
    332     return    pAddr1->Sel == pAddr2->Sel
    333            && pAddr1->off < pAddr2->off;
     335    return pAddr1->Sel == pAddr2->Sel
     336        && pAddr1->off < pAddr2->off;
    334337}
    335338
     
    344347static bool dbgfR3FlowAddrIntersect(PDBGFFLOWBBINT pFlowBb, PDBGFADDRESS pAddr)
    345348{
    346     return    (pFlowBb->AddrStart.Sel == pAddr->Sel)
    347            && (pFlowBb->AddrStart.off <= pAddr->off)
    348            && (pFlowBb->AddrEnd.off >= pAddr->off);
     349    return pFlowBb->AddrStart.Sel == pAddr->Sel
     350        && pFlowBb->AddrStart.off <= pAddr->off
     351        && pFlowBb->AddrEnd.off   >= pAddr->off;
    349352}
    350353
     
    363366        if (pAddr1->off >= pAddr2->off)
    364367            return pAddr1->off - pAddr2->off;
    365         else
    366             return pAddr2->off - pAddr1->off;
    367     }
    368     else
    369         AssertFailed();
    370 
     368        return pAddr2->off - pAddr1->off;
     369    }
     370    AssertFailed();
    371371    return 0;
    372372}
     
    774774                                             uint32_t cbInstr, bool fRelJmp, PDBGFADDRESS pAddrJmpTarget)
    775775{
    776     int rc = VINF_SUCCESS;
    777 
    778776    Assert(!dbgfR3FlowBranchTargetIsIndirect(pDisParam));
    779777
    780     /* Relative jumps are always from the beginning of the next instruction. */
    781778    *pAddrJmpTarget = *pAddrInstr;
    782 #ifdef VBOX_VMM_TARGET_ARMV8
    783     /* On ARM relative jumps are always from the beginning of the curent instruction (b #0 will jump to itself for instance). */
     779#ifdef VBOX_VMM_TARGET_X86
     780    /* Relative to the next instruction. */
     781    DBGFR3AddrAdd(pAddrJmpTarget, cbInstr);
     782#elif defined(VBOX_VMM_TARGET_ARMV8)
     783    /* Relative to the start of the instruction. */
    784784    RT_NOREF(cbInstr);
    785785#else
    786     DBGFR3AddrAdd(pAddrJmpTarget, cbInstr);
     786# error "port me"
    787787#endif
    788788
     
    799799            iRel = (int64_t)pDisParam->uValue;
    800800        else
    801             AssertFailedStmt(rc = VERR_NOT_SUPPORTED);
     801            AssertFailedReturn(VERR_NOT_SUPPORTED);
    802802
    803803        if (iRel < 0)
     
    816816        }
    817817        else
    818             AssertFailedStmt(rc = VERR_INVALID_STATE);
    819     }
    820 
    821     return rc;
     818            AssertFailedReturn(VERR_INVALID_STATE);
     819    }
     820
     821    return VINF_SUCCESS;
    822822}
    823823
     
    13861386
    13871387#ifdef VBOX_VMM_TARGET_ARMV8
    1388                         PDISOPPARAM pParam =   uOpc == OP_ARMV8_A64_B || uOpc == OP_ARMV8_A64_BC
    1389                                              ? &DisState.Param1
    1390                                              : uOpc == OP_ARMV8_A64_CBZ || uOpc == OP_ARMV8_A64_CBNZ
    1391                                              ? &DisState.Param2  /* cbz/cbnz. */
    1392                                              : &DisState.Param3; /* tbz/tbnz. */
     1388                        PDISOPPARAM pParam = uOpc == OP_ARMV8_A64_B || uOpc == OP_ARMV8_A64_BC
     1389                                           ? &DisState.Param1
     1390                                           : uOpc == OP_ARMV8_A64_CBZ || uOpc == OP_ARMV8_A64_CBNZ
     1391                                           ? &DisState.Param2  /* cbz/cbnz. */
     1392                                           : &DisState.Param3; /* tbz/tbnz. */
    13931393#else
    13941394                        PDISOPPARAM pParam = &DisState.Param1;
     
    14661466static int dbgfR3FlowPopulate(PUVM pUVM, VMCPUID idCpu, PDBGFFLOWINT pThis, uint32_t cbDisasmMax, uint32_t fFlags)
    14671467{
    1468     int rc = VINF_SUCCESS;
    14691468    PDBGFFLOWBBINT pFlowBb = dbgfR3FlowGetUnpopulatedBb(pThis);
    1470 
    14711469    while (pFlowBb != NULL)
    14721470    {
    1473         rc = dbgfR3FlowBbProcess(pUVM, idCpu, pThis, pFlowBb, cbDisasmMax, fFlags);
    1474         if (RT_FAILURE(rc))
    1475             break;
    1476 
    1477         pFlowBb = dbgfR3FlowGetUnpopulatedBb(pThis);
    1478     }
    1479 
    1480     return rc;
     1471        int rc = dbgfR3FlowBbProcess(pUVM, idCpu, pThis, pFlowBb, cbDisasmMax, fFlags);
     1472        if (RT_SUCCESS(rc))
     1473            pFlowBb = dbgfR3FlowGetUnpopulatedBb(pThis);
     1474        else
     1475            return rc;
     1476    }
     1477
     1478    return VINF_SUCCESS;
    14811479}
    14821480
     
    15061504
    15071505    /* Create the control flow graph container. */
    1508     int rc = VINF_SUCCESS;
     1506    int rc;
    15091507    PDBGFFLOWINT pThis = (PDBGFFLOWINT)RTMemAllocZ(sizeof(DBGFFLOWINT));
    15101508    if (RT_LIKELY(pThis))
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