aarch64: discard async aborts on entering debug state
recommended for Corte-A8 cores, not sure if necessary for ARMv8 based cores as well. Change-Id: Ibcb36170c5fac6a6b132de17f734c70a56919f9b Signed-off-by: Matthias Welwarsky <matthias.welwarsky@sysgo.com>gitignore-build
parent
0a53bae0ea
commit
9f4b5b509f
|
@ -663,11 +663,16 @@ static int aarch64_debug_entry(struct target *target)
|
||||||
/* make sure to clear all sticky errors */
|
/* make sure to clear all sticky errors */
|
||||||
retval = mem_ap_write_atomic_u32(armv8->debug_ap,
|
retval = mem_ap_write_atomic_u32(armv8->debug_ap,
|
||||||
armv8->debug_base + CPUV8_DBG_DRCR, DRCR_CSE);
|
armv8->debug_base + CPUV8_DBG_DRCR, DRCR_CSE);
|
||||||
|
|
||||||
|
/* discard async exceptions */
|
||||||
|
if (retval == ERROR_OK)
|
||||||
|
retval = dpm->instr_cpsr_sync(dpm);
|
||||||
|
|
||||||
if (retval != ERROR_OK)
|
if (retval != ERROR_OK)
|
||||||
return retval;
|
return retval;
|
||||||
|
|
||||||
/* Examine debug reason */
|
/* Examine debug reason */
|
||||||
armv8_dpm_report_dscr(&armv8->dpm, aarch64->cpudbg_dscr);
|
armv8_dpm_report_dscr(dpm, aarch64->cpudbg_dscr);
|
||||||
|
|
||||||
/* save address of instruction that triggered the watchpoint? */
|
/* save address of instruction that triggered the watchpoint? */
|
||||||
if (target->debug_reason == DBG_REASON_WATCHPOINT) {
|
if (target->debug_reason == DBG_REASON_WATCHPOINT) {
|
||||||
|
|
|
@ -360,9 +360,14 @@ static int dpmv8_instr_write_data_r0_64(struct arm_dpm *dpm,
|
||||||
|
|
||||||
static int dpmv8_instr_cpsr_sync(struct arm_dpm *dpm)
|
static int dpmv8_instr_cpsr_sync(struct arm_dpm *dpm)
|
||||||
{
|
{
|
||||||
|
int retval;
|
||||||
struct armv8_common *armv8 = dpm->arm->arch_info;
|
struct armv8_common *armv8 = dpm->arm->arch_info;
|
||||||
|
|
||||||
/* "Prefetch flush" after modifying execution status in CPSR */
|
/* "Prefetch flush" after modifying execution status in CPSR */
|
||||||
return dpmv8_exec_opcode(dpm, armv8_opcode(armv8, ARMV8_OPC_DSB_SY), NULL);
|
retval = dpmv8_exec_opcode(dpm, armv8_opcode(armv8, ARMV8_OPC_DSB_SY), &dpm->dscr);
|
||||||
|
if (retval == ERROR_OK)
|
||||||
|
dpmv8_exec_opcode(dpm, armv8_opcode(armv8, ARMV8_OPC_ISB_SY), &dpm->dscr);
|
||||||
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dpmv8_instr_read_data_dcc(struct arm_dpm *dpm,
|
static int dpmv8_instr_read_data_dcc(struct arm_dpm *dpm,
|
||||||
|
|
|
@ -37,6 +37,7 @@ static const uint32_t a64_opcodes[ARMV8_OPC_NUM] = {
|
||||||
[ARMV8_OPC_DSB_SY] = ARMV8_DSB_SY,
|
[ARMV8_OPC_DSB_SY] = ARMV8_DSB_SY,
|
||||||
[ARMV8_OPC_DCPS] = ARMV8_DCPS(0, 11),
|
[ARMV8_OPC_DCPS] = ARMV8_DCPS(0, 11),
|
||||||
[ARMV8_OPC_DRPS] = ARMV8_DRPS,
|
[ARMV8_OPC_DRPS] = ARMV8_DRPS,
|
||||||
|
[ARMV8_OPC_ISB_SY] = ARMV8_ISB,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const uint32_t t32_opcodes[ARMV8_OPC_NUM] = {
|
static const uint32_t t32_opcodes[ARMV8_OPC_NUM] = {
|
||||||
|
@ -53,6 +54,7 @@ static const uint32_t t32_opcodes[ARMV8_OPC_NUM] = {
|
||||||
[ARMV8_OPC_DSB_SY] = ARMV8_DSB_SY_T1,
|
[ARMV8_OPC_DSB_SY] = ARMV8_DSB_SY_T1,
|
||||||
[ARMV8_OPC_DCPS] = ARMV8_DCPS_T1(0),
|
[ARMV8_OPC_DCPS] = ARMV8_DCPS_T1(0),
|
||||||
[ARMV8_OPC_DRPS] = ARMV8_ERET_T1,
|
[ARMV8_OPC_DRPS] = ARMV8_ERET_T1,
|
||||||
|
[ARMV8_OPC_ISB_SY] = ARMV8_ISB_SY_T1,
|
||||||
};
|
};
|
||||||
|
|
||||||
void armv8_select_opcodes(struct armv8_common *armv8, bool state_is_aarch64)
|
void armv8_select_opcodes(struct armv8_common *armv8, bool state_is_aarch64)
|
||||||
|
|
|
@ -135,6 +135,8 @@
|
||||||
|
|
||||||
#define ARMV8_DSB_SY 0xd5033F9F
|
#define ARMV8_DSB_SY 0xd5033F9F
|
||||||
#define ARMV8_DSB_SY_T1 0xf3bf8f4f
|
#define ARMV8_DSB_SY_T1 0xf3bf8f4f
|
||||||
|
#define ARMV8_ISB 0xd5033fdf
|
||||||
|
#define ARMV8_ISB_SY_T1 0xf3bf8f6f
|
||||||
|
|
||||||
#define ARMV8_MRS(System, Rt) (0xd5300000 | ((System) << 5) | (Rt))
|
#define ARMV8_MRS(System, Rt) (0xd5300000 | ((System) << 5) | (Rt))
|
||||||
/* ARM V8 Move to system register. */
|
/* ARM V8 Move to system register. */
|
||||||
|
@ -173,6 +175,7 @@ enum armv8_opcode {
|
||||||
ARMV8_OPC_DSB_SY,
|
ARMV8_OPC_DSB_SY,
|
||||||
ARMV8_OPC_DCPS,
|
ARMV8_OPC_DCPS,
|
||||||
ARMV8_OPC_DRPS,
|
ARMV8_OPC_DRPS,
|
||||||
|
ARMV8_OPC_ISB_SY,
|
||||||
ARMV8_OPC_NUM,
|
ARMV8_OPC_NUM,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue