forked from auracaster/openocd
target: aarch64: access reg ESR_EL2 only in EL2 and EL3
The register ESR_EL2 is accessible and it's content is relevant
only when the target is in EL2 or EL3.
Virtualization SW in EL1 can also access it, but this either
triggers a trap to EL2 or returns ESR_EL1. Debugger should not mix
the real ESR_EL2 with the virtual register.
Plus, the register is 64 bits wide.
Without this patch, an error:
Error: Opcode 0xd53c5200, DSCR.ERR=1, DSCR.EL=1
is triggered by GDB register window or through GDB command
x/p $ESR_EL2
or through OpenOCD command
reg ESR_EL2
Detect the EL and return error if the register cannot be accessed.
Handle the register as 64 bits.
Change-Id: Icb32b44886d50907f29b068ce61e4be8bed10208
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reviewed-on: https://review.openocd.org/c/openocd/+/8272
Tested-by: jenkins
This commit is contained in:
@@ -342,9 +342,13 @@ static int armv8_read_reg(struct armv8_common *armv8, int regnum, uint64_t *regv
|
||||
value_64 = value;
|
||||
break;
|
||||
case ARMV8_ESR_EL2:
|
||||
retval = dpm->instr_read_data_r0(dpm,
|
||||
ARMV8_MRS(SYSTEM_ESR_EL2, 0), &value);
|
||||
value_64 = value;
|
||||
if (curel < SYSTEM_CUREL_EL2) {
|
||||
LOG_DEBUG("ESR_EL2 not accessible in EL%u", curel);
|
||||
retval = ERROR_FAIL;
|
||||
break;
|
||||
}
|
||||
retval = dpm->instr_read_data_r0_64(dpm,
|
||||
ARMV8_MRS(SYSTEM_ESR_EL2, 0), &value_64);
|
||||
break;
|
||||
case ARMV8_ESR_EL3:
|
||||
if (curel < SYSTEM_CUREL_EL3) {
|
||||
@@ -482,9 +486,13 @@ static int armv8_write_reg(struct armv8_common *armv8, int regnum, uint64_t valu
|
||||
ARMV8_MSR_GP(SYSTEM_ESR_EL1, 0), value);
|
||||
break;
|
||||
case ARMV8_ESR_EL2:
|
||||
value = value_64;
|
||||
retval = dpm->instr_write_data_r0(dpm,
|
||||
ARMV8_MSR_GP(SYSTEM_ESR_EL2, 0), value);
|
||||
if (curel < SYSTEM_CUREL_EL2) {
|
||||
LOG_DEBUG("ESR_EL2 not accessible in EL%u", curel);
|
||||
retval = ERROR_FAIL;
|
||||
break;
|
||||
}
|
||||
retval = dpm->instr_write_data_r0_64(dpm,
|
||||
ARMV8_MSR_GP(SYSTEM_ESR_EL2, 0), value_64);
|
||||
break;
|
||||
case ARMV8_ESR_EL3:
|
||||
if (curel < SYSTEM_CUREL_EL3) {
|
||||
@@ -1553,7 +1561,7 @@ static const struct {
|
||||
|
||||
{ ARMV8_ELR_EL2, "ELR_EL2", 64, ARMV8_64_EL2H, REG_TYPE_CODE_PTR, "banked", "net.sourceforge.openocd.banked",
|
||||
NULL},
|
||||
{ ARMV8_ESR_EL2, "ESR_EL2", 32, ARMV8_64_EL2H, REG_TYPE_UINT32, "banked", "net.sourceforge.openocd.banked",
|
||||
{ ARMV8_ESR_EL2, "ESR_EL2", 64, ARMV8_64_EL2H, REG_TYPE_UINT64, "banked", "net.sourceforge.openocd.banked",
|
||||
NULL},
|
||||
{ ARMV8_SPSR_EL2, "SPSR_EL2", 32, ARMV8_64_EL2H, REG_TYPE_UINT32, "banked", "net.sourceforge.openocd.banked",
|
||||
NULL},
|
||||
|
||||
Reference in New Issue
Block a user