VirtualBox

Changeset 100723 in vbox


Ignore:
Timestamp:
Jul 28, 2023 7:23:31 AM (22 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
158582
Message:

VMM/ARM: Add debug system registers in the vCPU state, bugref:10387, bugref:10390

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vmm/cpumctx-armv8.h

    r100118 r100723  
    119119#ifndef VBOX_FOR_DTRACE_LIB
    120120AssertCompileSize(CPUMCTXSYSREG, 8);
     121
     122
     123/**
     124 * A debug register state (control and value), these are held together
     125 * because they will be accessed together very often and thus minimizes
     126 * stress on the cache.
     127 */
     128typedef struct CPUMCTXSYSREGDBG
     129{
     130    /** The control register. */
     131    CPUMCTXSYSREG   Ctrl;
     132    /** The value register. */
     133    CPUMCTXSYSREG   Value;
     134} CPUMCTXSYSREGDBG;
     135/** Pointer to a debug register state. */
     136typedef CPUMCTXSYSREGDBG *PCPUMCTXSYSREGDBG;
     137/** Pointer to a const debug register state. */
     138typedef const CPUMCTXSYSREGDBG *PCCPUMCTXSYSREGDBG;
    121139#endif
    122140
     
    128146{
    129147    /** The general purpose register array view. */
    130     CPUMCTXGREG     aGRegs[31];
     148    CPUMCTXGREG         aGRegs[31];
    131149    /** The NEON SIMD & FP register array view. */
    132     CPUMCTXVREG     aVRegs[32];
     150    CPUMCTXVREG         aVRegs[32];
    133151    /** The stack registers (EL0, EL1). */
    134     CPUMCTXSYSREG   aSpReg[2];
     152    CPUMCTXSYSREG       aSpReg[2];
    135153    /** The program counter. */
    136     CPUMCTXSYSREG   Pc;
     154    CPUMCTXSYSREG       Pc;
    137155    /** The SPSR (Saved Program Status Register) (EL1 only). */
    138     CPUMCTXSYSREG   Spsr;
     156    CPUMCTXSYSREG       Spsr;
    139157    /** The ELR (Exception Link Register) (EL1 only). */
    140     CPUMCTXSYSREG   Elr;
     158    CPUMCTXSYSREG       Elr;
    141159    /** The SCTLR_EL1 register. */
    142     CPUMCTXSYSREG   Sctlr;
     160    CPUMCTXSYSREG       Sctlr;
    143161    /** THe TCR_EL1 register. */
    144     CPUMCTXSYSREG   Tcr;
     162    CPUMCTXSYSREG       Tcr;
    145163    /** The TTBR0_EL1 register. */
    146     CPUMCTXSYSREG   Ttbr0;
     164    CPUMCTXSYSREG       Ttbr0;
    147165    /** The TTBR1_EL1 register. */
    148     CPUMCTXSYSREG   Ttbr1;
     166    CPUMCTXSYSREG       Ttbr1;
    149167    /** The VBAR_EL1 register. */
    150     CPUMCTXSYSREG   VBar;
     168    CPUMCTXSYSREG       VBar;
     169    /** Breakpoint registers, DBGB{C,V}<n>_EL1. */
     170    CPUMCTXSYSREGDBG    aBp[16];
     171    /** Watchpoint registers, DBGW{C,V}<n>_EL1. */
     172    CPUMCTXSYSREGDBG    aWp[16];
    151173
    152174    /** Floating point control register. */
    153     uint64_t        fpcr;
     175    uint64_t            fpcr;
    154176    /** Floating point status register. */
    155     uint64_t        fpsr;
     177    uint64_t            fpsr;
    156178    /** The internal PSTATE state (as given from SPSR_EL2). */
    157     uint64_t        fPState;
    158 
    159     uint32_t        fPadding0;
     179    uint64_t            fPState;
     180
     181    uint32_t            fPadding0;
    160182
    161183    /** OS lock status accessed through OSLAR_EL1 and OSLSR_EL1. */
    162     bool            fOsLck;
    163 
    164     uint8_t         afPadding1[7];
     184    bool                fOsLck;
     185
     186    uint8_t             afPadding1[7];
    165187
    166188    /** Externalized state tracker, CPUMCTX_EXTRN_XXX. */
    167     uint64_t        fExtrn;
     189    uint64_t            fExtrn;
    168190
    169191    /** The CNTV_CTL_EL0 register, always synced during VM-exit. */
    170     uint64_t        CntvCtlEl0;
     192    uint64_t            CntvCtlEl0;
    171193    /** The CNTV_CVAL_EL0 register, always synced during VM-exit. */
    172     uint64_t        CntvCValEl0;
    173 
    174     uint64_t        au64Padding2[6];
     194    uint64_t            CntvCValEl0;
     195
     196    uint64_t            au64Padding2[6];
    175197} CPUMCTX;
    176198
     
    233255#define CPUMCTX_EXTRN_FPSR                      UINT64_C(0x0000000000008000)
    234256
     257/** Debug system registers are kept externally. */
     258#define CPUMCTX_EXTRN_SYSREG_DEBUG              UINT64_C(0x0000000000010000)
    235259/** Various system registers (rarely accessed) are kept externally. */
    236 #define CPUMCTX_EXTRN_SYSREG                    UINT64_C(0x0000000000010000)
     260#define CPUMCTX_EXTRN_SYSREG_MISC               UINT64_C(0x0000000000020000)
    237261
    238262/** Mask of bits the keepers can use for state tracking. */
  • trunk/src/VBox/VMM/VMMR3/NEMR3Native-darwin-armv8.cpp

    r100708 r100723  
    174174#undef CPUM_VREG_EMIT
    175175};
     176/** Debug system registers. */
     177static const struct
     178{
     179    hv_sys_reg_t        enmHvReg;
     180    uint32_t            offCpumCtx;
     181} s_aCpumDbgRegs[] =
     182{
     183#define CPUM_DBGREG_EMIT(a_BorW, a_Idx) \
     184    { HV_SYS_REG_DBG ## a_BorW ## CR ## a_Idx ## _EL1, RT_UOFFSETOF(CPUMCTX, a ## a_BorW ## p[a_Idx].Ctrl.u64) }, \
     185    { HV_SYS_REG_DBG ## a_BorW ## VR ## a_Idx ## _EL1, RT_UOFFSETOF(CPUMCTX, a ## a_BorW ## p[a_Idx].Value.u64) }
     186    /* Breakpoint registers. */
     187    CPUM_DBGREG_EMIT(B, 0),
     188    CPUM_DBGREG_EMIT(B, 1),
     189    CPUM_DBGREG_EMIT(B, 2),
     190    CPUM_DBGREG_EMIT(B, 3),
     191    CPUM_DBGREG_EMIT(B, 4),
     192    CPUM_DBGREG_EMIT(B, 5),
     193    CPUM_DBGREG_EMIT(B, 6),
     194    CPUM_DBGREG_EMIT(B, 7),
     195    CPUM_DBGREG_EMIT(B, 8),
     196    CPUM_DBGREG_EMIT(B, 9),
     197    CPUM_DBGREG_EMIT(B, 10),
     198    CPUM_DBGREG_EMIT(B, 11),
     199    CPUM_DBGREG_EMIT(B, 12),
     200    CPUM_DBGREG_EMIT(B, 13),
     201    CPUM_DBGREG_EMIT(B, 14),
     202    CPUM_DBGREG_EMIT(B, 15),
     203    /* Watchpoint registers. */
     204    CPUM_DBGREG_EMIT(W, 0),
     205    CPUM_DBGREG_EMIT(W, 1),
     206    CPUM_DBGREG_EMIT(W, 2),
     207    CPUM_DBGREG_EMIT(W, 3),
     208    CPUM_DBGREG_EMIT(W, 4),
     209    CPUM_DBGREG_EMIT(W, 5),
     210    CPUM_DBGREG_EMIT(W, 6),
     211    CPUM_DBGREG_EMIT(W, 7),
     212    CPUM_DBGREG_EMIT(W, 8),
     213    CPUM_DBGREG_EMIT(W, 9),
     214    CPUM_DBGREG_EMIT(W, 10),
     215    CPUM_DBGREG_EMIT(W, 11),
     216    CPUM_DBGREG_EMIT(W, 12),
     217    CPUM_DBGREG_EMIT(W, 13),
     218    CPUM_DBGREG_EMIT(W, 14),
     219    CPUM_DBGREG_EMIT(W, 15)
     220#undef CPUM_DBGREG_EMIT
     221};
    176222/** System registers. */
    177223static const struct
     
    190236    { HV_SYS_REG_TTBR0_EL1, CPUMCTX_EXTRN_SCTLR_TCR_TTBR,   RT_UOFFSETOF(CPUMCTX, Ttbr0.u64)        },
    191237    { HV_SYS_REG_TTBR1_EL1, CPUMCTX_EXTRN_SCTLR_TCR_TTBR,   RT_UOFFSETOF(CPUMCTX, Ttbr1.u64)        },
    192     { HV_SYS_REG_VBAR_EL1,  CPUMCTX_EXTRN_SYSREG,           RT_UOFFSETOF(CPUMCTX, VBar.u64)         },
     238    { HV_SYS_REG_VBAR_EL1,  CPUMCTX_EXTRN_SYSREG_MISC,      RT_UOFFSETOF(CPUMCTX, VBar.u64)         },
    193239};
    194240/** ID registers. */
     
    512558
    513559    if (   hrc == HV_SUCCESS
    514         && (fWhat & (CPUMCTX_EXTRN_SPSR | CPUMCTX_EXTRN_ELR | CPUMCTX_EXTRN_SP | CPUMCTX_EXTRN_SCTLR_TCR_TTBR | CPUMCTX_EXTRN_SYSREG)))
     560        && (fWhat & CPUMCTX_EXTRN_SYSREG_DEBUG))
     561    {
     562        /* Debug registers. */
     563        for (uint32_t i = 0; i < RT_ELEMENTS(s_aCpumDbgRegs); i++)
     564        {
     565            uint64_t *pu64 = (uint64_t *)((uint8_t *)&pVCpu->cpum.GstCtx + s_aCpumDbgRegs[i].offCpumCtx);
     566            hrc |= hv_vcpu_get_sys_reg(pVCpu->nem.s.hVCpu, s_aCpumDbgRegs[i].enmHvReg, pu64);
     567        }
     568    }
     569
     570    if (   hrc == HV_SUCCESS
     571        && (fWhat & (CPUMCTX_EXTRN_SPSR | CPUMCTX_EXTRN_ELR | CPUMCTX_EXTRN_SP | CPUMCTX_EXTRN_SCTLR_TCR_TTBR | CPUMCTX_EXTRN_SYSREG_MISC)))
    515572    {
    516573        /* System registers. */
     
    581638
    582639    if (   hrc == HV_SUCCESS
    583         &&     (pVCpu->cpum.GstCtx.fExtrn & (CPUMCTX_EXTRN_SPSR | CPUMCTX_EXTRN_ELR | CPUMCTX_EXTRN_SP | CPUMCTX_EXTRN_SCTLR_TCR_TTBR | CPUMCTX_EXTRN_SYSREG))
    584             !=                              (CPUMCTX_EXTRN_SPSR | CPUMCTX_EXTRN_ELR | CPUMCTX_EXTRN_SP | CPUMCTX_EXTRN_SCTLR_TCR_TTBR | CPUMCTX_EXTRN_SYSREG))
     640        && !(pVCpu->cpum.GstCtx.fExtrn & CPUMCTX_EXTRN_SYSREG_DEBUG))
     641    {
     642        /* Debug registers. */
     643        for (uint32_t i = 0; i < RT_ELEMENTS(s_aCpumDbgRegs); i++)
     644        {
     645            uint64_t *pu64 = (uint64_t *)((uint8_t *)&pVCpu->cpum.GstCtx + s_aCpumDbgRegs[i].offCpumCtx);
     646            hrc |= hv_vcpu_set_sys_reg(pVCpu->nem.s.hVCpu, s_aCpumDbgRegs[i].enmHvReg, *pu64);
     647        }
     648    }
     649
     650    if (   hrc == HV_SUCCESS
     651        &&     (pVCpu->cpum.GstCtx.fExtrn & (CPUMCTX_EXTRN_SPSR | CPUMCTX_EXTRN_ELR | CPUMCTX_EXTRN_SP | CPUMCTX_EXTRN_SCTLR_TCR_TTBR | CPUMCTX_EXTRN_SYSREG_MISC))
     652            !=                              (CPUMCTX_EXTRN_SPSR | CPUMCTX_EXTRN_ELR | CPUMCTX_EXTRN_SP | CPUMCTX_EXTRN_SCTLR_TCR_TTBR | CPUMCTX_EXTRN_SYSREG_MISC))
    585653    {
    586654        /* System registers. */
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