45 LOG_INFO(TLogger,
"Resetting processor");
47 auto sys_ctrl = cpua.template ReadSpecialRegister<SpecialRegisterId::kSysCtrl>();
50 sys_ctrl &= ~static_cast<u32>(SysCtrlRegister::kExecModeMsk);
51 sys_ctrl |=
static_cast<u32
>(SysCtrlRegister::kExecModeThread);
75 sys_ctrl &= ~static_cast<u32>(SysCtrlRegister::kControlSpSelMsk);
76 sys_ctrl &= ~static_cast<u32>(SysCtrlRegister::kControlNPrivMsk);
79 cpua.template WriteSpecialRegister<SpecialRegisterId::kSysCtrl>(sys_ctrl);
83 Exc::InitDefaultExceptionStates(cpua);
94 const auto vtor = cpua.template ReadSpecialRegister<SpecialRegisterId::kVtor>();
95 me_adr_t vectortable = vtor << 7 | 0x0U;
99 bus.template ReadOrRaise<u32>(cpua, vectortable,
100 BusExceptionType::kRaisePreciseDataBusError));
101 cpua.template WriteSpecialRegister<SpecialRegisterId::kSpMain>(sp_main);
104 auto sp_process = cpua.template ReadSpecialRegister<SpecialRegisterId::kSpProcess>();
106 cpua.template WriteSpecialRegister<SpecialRegisterId::kSpProcess>(sp_process);
109 cpua.template WriteRegister<RegisterId::kLr>(0xFFFFFFFFU);
113 bus.template ReadOrRaise<u32>(cpua, vectortable + 0x4U,
114 BusExceptionType::kRaisePreciseDataBusError));
117 auto tbit = tmp & 0x1U;
122 auto ipsr = cpua.template ReadSpecialRegister<SpecialRegisterId::kIpsr>();
123 ipsr &= ~static_cast<u32>(IpsrRegister::kExceptionNumberMsk);
124 cpua.template WriteSpecialRegister<SpecialRegisterId::kIpsr>(ipsr);
128 auto epsr = cpua.template ReadSpecialRegister<SpecialRegisterId::kEpsr>();
129 epsr &= ~static_cast<u32>(EpsrRegister::kItMsk) &
130 ~static_cast<u32>(EpsrRegister::kTMsk);
131 epsr |= tbit << EpsrRegister::kTPos;
132 cpua.template WriteSpecialRegister<SpecialRegisterId::kEpsr>(epsr);
135 auto entry_point = tmp & 0xFFFFFFFEU;
136 Pc::BranchTo(cpua, entry_point);
137 LOG_DEBUG(TLogger,
"Set entry Point to 0x%08X / tbit:%i", entry_point, tbit);
141 auto ccr = cpua.template ReadSpecialRegister<SpecialRegisterId::kCcr>();
142 ccr |=
static_cast<u32
>(CcrRegister::kStkAlignMsk);
143 cpua.template WriteSpecialRegister<SpecialRegisterId::kCcr>(ccr);
144 LOG_TRACE(TLogger,
"CSR: 0x%08X", ccr);
146#if IS_LOGLEVEL_TRACE_ENABLED == true
148 auto apsr = cpua.template ReadSpecialRegister<SpecialRegisterId::kApsr>();
149 auto ipsr = cpua.template ReadSpecialRegister<SpecialRegisterId::kIpsr>();
150 auto epsr = cpua.template ReadSpecialRegister<SpecialRegisterId::kEpsr>();
151 auto xpsr = cpua.template ReadSpecialRegister<SpecialRegisterId::kXpsr>();
152 LOG_DEBUG(TLogger,
"APSR: 0x%08X, IPSR: 0x%08X, EPSR: 0x%08X, XPSR: 0x%08X", apsr, ipsr, epsr,