VirtualBox

Changeset 107030 in vbox for trunk/src/VBox/VMM/VMMR3


Ignore:
Timestamp:
Nov 18, 2024 2:58:29 PM (3 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
165974
Message:

VMM/DBGF: Classify ARMv8 A64 control flow isntructions properly for call/return stepping, bugref:10393

File:
1 edited

Legend:

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

    r106061 r107030  
    15861586static DBGFSTEPINSTRTYPE dbgfStepGetCurInstrType(PVM pVM, PVMCPU pVCpu)
    15871587{
     1588#ifdef VBOX_VMM_TARGET_ARMV8
     1589    /*
     1590     * Read the instruction, this ASSUMES running in A64 mode.
     1591     */
     1592    size_t   cbRead  = 0;
     1593    uint32_t u32Insn = 0;
     1594    int rc = PGMR3DbgReadGCPtr(pVM, &u32Insn, CPUMGetGuestFlatPC(pVCpu), u32Insn, 0 /*fFlags*/, &cbRead);
     1595    if (RT_SUCCESS(rc))
     1596    {
     1597        /*
     1598         * Do minimal parsing.  No real need to involve the disassembler here.
     1599         */
     1600        if (   (u32Insn & 0xfffffc1f) == 0xd65f0000 /* RET */
     1601            || (u32Insn & 0xfffffc1f) == 0xd65f081f /* RETAA */
     1602            || (u32Insn & 0xfffffc1f) == 0xd65f0c1f /* RETAB */
     1603            || (u32Insn & 0xffffffff) == 0xd69f03e0 /* ERET */
     1604            || (u32Insn & 0xffffffff) == 0xd69f0bff /* ERETAA */
     1605            || (u32Insn & 0xffffffff) == 0xd69f0fff /* ERETAB */)
     1606            return DBGFSTEPINSTRTYPE_RET;
     1607        else if (   (u32Insn & 0xfffffc1f) == 0xd63f0000 /* BLR */
     1608                 || (u32Insn & 0xfffffc1f) == 0xd63f081f /* BLRAAZ */
     1609                 || (u32Insn & 0xfffffc1f) == 0xd63f0c1f /* BLRABZ */
     1610                 || (u32Insn & 0xfffffc00) == 0xd73f0800 /* BLRAA */
     1611                 || (u32Insn & 0xfffffc00) == 0xd73f0c00 /* BLRAB */
     1612                 || (u32Insn & 0xfc000000) == 0x14000000 /* BL */
     1613                 || (u32Insn & 0xffe0001f) == 0xd4000001 /* SVC */
     1614                 || (u32Insn & 0xffe0001f) == 0xd4000002 /* HVC */
     1615                 || (u32Insn & 0xffe0001f) == 0xd4000003 /* SMC */
     1616                 || (u32Insn & 0xffe0001f) == 0xd4200000 /* BRK */
     1617                 || (u32Insn & 0xffe0001f) == 0xd4400000 /* HLT */)
     1618            return DBGFSTEPINSTRTYPE_CALL;
     1619        else
     1620            return DBGFSTEPINSTRTYPE_OTHER;
     1621    }
     1622#else
    15881623    /*
    15891624     * Read the instruction.
     
    16591694        }
    16601695    }
     1696#endif
    16611697
    16621698    return DBGFSTEPINSTRTYPE_INVALID;
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