You copied the Doc URL to your clipboard.
DCPS3
Debug Change PE State to EL3 allows the debugger to move the PE into EL3 from a lower Exception Level or to a specific mode at the current Exception Level.
DCPS3 is undefined if any of:
- The PE is in Non-debug state.
- EL3 is not implemented.
- EDSCR.SDD is set to 1.
When the PE executes DCPS3:
- If EL3 is using AArch32, the PE enters Monitor mode and LR_mon, SPSR_mon, DLR and DSPSR become UNKNOWN. If DCPS3 is executed in Monitor mode, SCR.NS is cleared to 0.
- If EL3 is using AArch64, the PE enters EL3 using AArch64, selects SP_EL3, and ELR_EL3, ESR_EL3, SPSR_EL3, DLR_EL0 and DSPSR_EL0 become UNKNOWN.
For more information on the operation of this instruction, see DCPS.
T1
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
if !HaveEL(EL3) then UNDEFINED;
Operation
if !Halted() || EDSCR.SDD == '1' then UNDEFINED; if ELUsingAArch32(EL3) then from_secure = IsSecure(); if PSTATE.M == M32_Monitor then SCR.NS = '0'; AArch32.WriteMode(M32_Monitor); if HavePANExt() then if !from_secure then PSTATE.PAN = '0'; elsif SCTLR.SPAN == '0' then PSTATE.PAN = '1'; PSTATE.E = SCTLR.EE; LR_mon = bits(32) UNKNOWN; SPSR_mon = bits(32) UNKNOWN; DLR = bits(32) UNKNOWN; DSPSR = bits(32) UNKNOWN; else // Targeting EL3 using AArch64 AArch64.MaybeZeroRegisterUppers(); MaybeZeroSVEUppers(EL3); PSTATE.nRW = '0'; PSTATE.SP = '1'; PSTATE.EL = EL3; if HaveUAOExt() then PSTATE.UAO = '0'; ELR_EL3 = bits(64) UNKNOWN; ESR_EL3 = bits(32) UNKNOWN; SPSR_EL3 = bits(32) UNKNOWN; DLR_EL0 = bits(64) UNKNOWN; DSPSR_EL0 = bits(32) UNKNOWN; sync_errors = HaveIESB() && SCTLR_EL3.IESB == '1'; if HaveDoubleFaultExt() && SCR_EL3.EA == '1' && SCR_EL3.NMEA == '1' then sync_errors = TRUE; // SCTLR_EL3.IESB might be ignored in Debug state. if !ConstrainUnpredictableBool(Unpredictable_IESBinDebug) then sync_errors = FALSE; if sync_errors then SynchronizeErrors(); UpdateEDSCRFields(); // Update EDSCR PE state flags