ARMv7-A: stop using CP15 ops
The ARMv7-A code uses read_cp15() to access fault registers. Instead, use DPM operations directly, passing in the relevant MRC instructions. This eliminates per-operation overhead (though it'll be hard to observe, this is uncommon) and helps eliminate read_cp15(). Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
This commit is contained in:
parent
fb984a477d
commit
209a0197f0
|
@ -38,17 +38,48 @@ static void armv7a_show_fault_registers(struct target *target)
|
||||||
{
|
{
|
||||||
uint32_t dfsr, ifsr, dfar, ifar;
|
uint32_t dfsr, ifsr, dfar, ifar;
|
||||||
struct armv7a_common *armv7a = target_to_armv7a(target);
|
struct armv7a_common *armv7a = target_to_armv7a(target);
|
||||||
|
struct arm_dpm *dpm = armv7a->armv4_5_common.dpm;
|
||||||
|
int retval;
|
||||||
|
|
||||||
armv7a->read_cp15(target, 0, 0, 5, 0, &dfsr);
|
retval = dpm->prepare(dpm);
|
||||||
armv7a->read_cp15(target, 0, 1, 5, 0, &ifsr);
|
if (retval != ERROR_OK)
|
||||||
armv7a->read_cp15(target, 0, 0, 6, 0, &dfar);
|
return;
|
||||||
armv7a->read_cp15(target, 0, 2, 6, 0, &ifar);
|
|
||||||
|
/* ARMV4_5_MRC(cpnum, op1, r0, CRn, CRm, op2) */
|
||||||
|
|
||||||
|
/* c5/c0 - {data, instruction} fault status registers */
|
||||||
|
retval = dpm->instr_read_data_r0(dpm,
|
||||||
|
ARMV4_5_MRC(15, 0, 0, 5, 0, 0),
|
||||||
|
&dfsr);
|
||||||
|
if (retval != ERROR_OK)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
retval = dpm->instr_read_data_r0(dpm,
|
||||||
|
ARMV4_5_MRC(15, 0, 0, 5, 0, 1),
|
||||||
|
&ifsr);
|
||||||
|
if (retval != ERROR_OK)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
/* c6/c0 - {data, instruction} fault address registers */
|
||||||
|
retval = dpm->instr_read_data_r0(dpm,
|
||||||
|
ARMV4_5_MRC(15, 0, 0, 6, 0, 0),
|
||||||
|
&dfar);
|
||||||
|
if (retval != ERROR_OK)
|
||||||
|
goto done;
|
||||||
|
|
||||||
|
retval = dpm->instr_read_data_r0(dpm,
|
||||||
|
ARMV4_5_MRC(15, 0, 0, 6, 0, 2),
|
||||||
|
&ifar);
|
||||||
|
if (retval != ERROR_OK)
|
||||||
|
goto done;
|
||||||
|
|
||||||
LOG_USER("Data fault registers DFSR: %8.8" PRIx32
|
LOG_USER("Data fault registers DFSR: %8.8" PRIx32
|
||||||
", DFAR: %8.8" PRIx32, dfsr, dfar);
|
", DFAR: %8.8" PRIx32, dfsr, dfar);
|
||||||
LOG_USER("Instruction fault registers IFSR: %8.8" PRIx32
|
LOG_USER("Instruction fault registers IFSR: %8.8" PRIx32
|
||||||
", IFAR: %8.8" PRIx32, ifsr, ifar);
|
", IFAR: %8.8" PRIx32, ifsr, ifar);
|
||||||
|
|
||||||
|
done:
|
||||||
|
/* (void) */ dpm->finish(dpm);
|
||||||
}
|
}
|
||||||
|
|
||||||
int armv7a_arch_state(struct target *target)
|
int armv7a_arch_state(struct target *target)
|
||||||
|
|
Loading…
Reference in New Issue