aarch64: handle exceptions taken in debug state
When an armv8-a PE causes an exception while halted, e.g. by performing a prohibited memory or register access, its state is affected in the same way as if it was running. That means, a number of registers is overwritten (notably DLR and DSPSR, but also others) and also potentially the exception level and therefore also the PE state can change. This state must be restored before resuming normal operation. This is done by marking the relevant cached registers "dirty" so that they are written back before resume. Change-Id: I9b6967a62d7cb23a477a9f7839f8d2b7087eed09 Signed-off-by: Matthias Welwarsky <matthias.welwarsky@sysgo.com>
This commit is contained in:
@@ -1492,6 +1492,7 @@ static int aarch64_write_apb_ap_memory(struct target *target,
|
||||
LOG_ERROR("abort occurred - dscr = 0x%08" PRIx32, dscr);
|
||||
mem_ap_write_atomic_u32(armv8->debug_ap,
|
||||
armv8->debug_base + CPUV8_DBG_DRCR, 1<<2);
|
||||
armv8_dpm_handle_exception(dpm);
|
||||
goto error_free_buff_w;
|
||||
}
|
||||
|
||||
@@ -1657,6 +1658,7 @@ static int aarch64_read_apb_ap_memory(struct target *target,
|
||||
LOG_ERROR("abort occurred - dscr = 0x%08" PRIx32, dscr);
|
||||
mem_ap_write_atomic_u32(armv8->debug_ap,
|
||||
armv8->debug_base + CPUV8_DBG_DRCR, DRCR_CSE);
|
||||
armv8_dpm_handle_exception(dpm);
|
||||
goto error_free_buff_r;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user