Changeset 100723 in vbox
- Timestamp:
- Jul 28, 2023 7:23:31 AM (22 months ago)
- svn:sync-xref-src-repo-rev:
- 158582
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/vmm/cpumctx-armv8.h
r100118 r100723 119 119 #ifndef VBOX_FOR_DTRACE_LIB 120 120 AssertCompileSize(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 */ 128 typedef 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. */ 136 typedef CPUMCTXSYSREGDBG *PCPUMCTXSYSREGDBG; 137 /** Pointer to a const debug register state. */ 138 typedef const CPUMCTXSYSREGDBG *PCCPUMCTXSYSREGDBG; 121 139 #endif 122 140 … … 128 146 { 129 147 /** The general purpose register array view. */ 130 CPUMCTXGREG aGRegs[31];148 CPUMCTXGREG aGRegs[31]; 131 149 /** The NEON SIMD & FP register array view. */ 132 CPUMCTXVREG aVRegs[32];150 CPUMCTXVREG aVRegs[32]; 133 151 /** The stack registers (EL0, EL1). */ 134 CPUMCTXSYSREG aSpReg[2];152 CPUMCTXSYSREG aSpReg[2]; 135 153 /** The program counter. */ 136 CPUMCTXSYSREG Pc;154 CPUMCTXSYSREG Pc; 137 155 /** The SPSR (Saved Program Status Register) (EL1 only). */ 138 CPUMCTXSYSREG Spsr;156 CPUMCTXSYSREG Spsr; 139 157 /** The ELR (Exception Link Register) (EL1 only). */ 140 CPUMCTXSYSREG Elr;158 CPUMCTXSYSREG Elr; 141 159 /** The SCTLR_EL1 register. */ 142 CPUMCTXSYSREG Sctlr;160 CPUMCTXSYSREG Sctlr; 143 161 /** THe TCR_EL1 register. */ 144 CPUMCTXSYSREG Tcr;162 CPUMCTXSYSREG Tcr; 145 163 /** The TTBR0_EL1 register. */ 146 CPUMCTXSYSREG Ttbr0;164 CPUMCTXSYSREG Ttbr0; 147 165 /** The TTBR1_EL1 register. */ 148 CPUMCTXSYSREG Ttbr1;166 CPUMCTXSYSREG Ttbr1; 149 167 /** 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]; 151 173 152 174 /** Floating point control register. */ 153 uint64_t fpcr;175 uint64_t fpcr; 154 176 /** Floating point status register. */ 155 uint64_t fpsr;177 uint64_t fpsr; 156 178 /** 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; 160 182 161 183 /** 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]; 165 187 166 188 /** Externalized state tracker, CPUMCTX_EXTRN_XXX. */ 167 uint64_t fExtrn;189 uint64_t fExtrn; 168 190 169 191 /** The CNTV_CTL_EL0 register, always synced during VM-exit. */ 170 uint64_t CntvCtlEl0;192 uint64_t CntvCtlEl0; 171 193 /** 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]; 175 197 } CPUMCTX; 176 198 … … 233 255 #define CPUMCTX_EXTRN_FPSR UINT64_C(0x0000000000008000) 234 256 257 /** Debug system registers are kept externally. */ 258 #define CPUMCTX_EXTRN_SYSREG_DEBUG UINT64_C(0x0000000000010000) 235 259 /** 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) 237 261 238 262 /** Mask of bits the keepers can use for state tracking. */ -
trunk/src/VBox/VMM/VMMR3/NEMR3Native-darwin-armv8.cpp
r100708 r100723 174 174 #undef CPUM_VREG_EMIT 175 175 }; 176 /** Debug system registers. */ 177 static 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 }; 176 222 /** System registers. */ 177 223 static const struct … … 190 236 { HV_SYS_REG_TTBR0_EL1, CPUMCTX_EXTRN_SCTLR_TCR_TTBR, RT_UOFFSETOF(CPUMCTX, Ttbr0.u64) }, 191 237 { 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) }, 193 239 }; 194 240 /** ID registers. */ … … 512 558 513 559 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))) 515 572 { 516 573 /* System registers. */ … … 581 638 582 639 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)) 585 653 { 586 654 /* System registers. */
Note:
See TracChangeset
for help on using the changeset viewer.