[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openocd-development
Subject:    [PATCH]: f6231e3533 target: aarch64: access reg SPSR_EL3 only in EL3
From:       gerrit () openocd ! org
Date:       2024-05-14 12:52:34
Message-ID: 20240514125234.B85491B2 () openocd ! org
[Download RAW message or body]

This is an automated email from Gerrit.

"Antonio Borneo <borneo.antonio@gmail.com>" just uploaded a new patch set to Gerrit, \
which you can find at https://review.openocd.org/c/openocd/+/8270

-- gerrit

commit f6231e3533dc526fb8d9e88a579edeb48ad08010
Author: Antonio Borneo <borneo.antonio@gmail.com>
Date:   Tue May 14 10:40:32 2024 +0200

    target: aarch64: access reg SPSR_EL3 only in EL3
    
    The register SPSR_EL3 is accessible and it's content is relevant
    only when the target is in EL3.
    Plus, the register is 64 bits wide.
    
    Without this patch, an error:
            Error: Opcode 0xd53e4000, DSCR.ERR=1, DSCR.EL=1
    is triggered by GDB register window or through GDB command
            x/p $SPSR_EL3
    or through OpenOCD command
            reg SPSR_EL3
    
    Detect the EL and return error if the register cannot be accessed.
    Handle the register as 64 bits.
    
    Change-Id: I00849d99feeb96589c426fcafda98127dbd19a67
    Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>

diff --git a/src/target/armv8.c b/src/target/armv8.c
index 383ac3ef4d..e8c189c1c8 100644
--- a/src/target/armv8.c
+++ b/src/target/armv8.c
@@ -361,9 +361,13 @@ static int armv8_read_reg(struct armv8_common *armv8, int \
regnum, uint64_t *regv  value_64 = value;
 		break;
 	case ARMV8_SPSR_EL3:
-		retval = dpm->instr_read_data_r0(dpm,
-				ARMV8_MRS(SYSTEM_SPSR_EL3, 0), &value);
-		value_64 = value;
+		if (curel < SYSTEM_CUREL_EL3) {
+			LOG_DEBUG("SPSR_EL3 not accessible in EL%u", curel);
+			retval = ERROR_FAIL;
+			break;
+		}
+		retval = dpm->instr_read_data_r0_64(dpm,
+				ARMV8_MRS(SYSTEM_SPSR_EL3, 0), &value_64);
 		break;
 	case ARMV8_PAUTH_CMASK:
 	case ARMV8_PAUTH_DMASK:
@@ -492,9 +496,13 @@ static int armv8_write_reg(struct armv8_common *armv8, int \
regnum, uint64_t valu  ARMV8_MSR_GP(SYSTEM_SPSR_EL2, 0), value);
 		break;
 	case ARMV8_SPSR_EL3:
-		value = value_64;
-		retval = dpm->instr_write_data_r0(dpm,
-				ARMV8_MSR_GP(SYSTEM_SPSR_EL3, 0), value);
+		if (curel < SYSTEM_CUREL_EL3) {
+			LOG_DEBUG("SPSR_EL3 not accessible in EL%u", curel);
+			retval = ERROR_FAIL;
+			break;
+		}
+		retval = dpm->instr_write_data_r0_64(dpm,
+				ARMV8_MSR_GP(SYSTEM_SPSR_EL3, 0), value_64);
 		break;
 	default:
 		retval = ERROR_FAIL;
@@ -1544,7 +1552,7 @@ static const struct {
 														NULL},
 	{ ARMV8_ESR_EL3, "ESR_EL3", 64, ARMV8_64_EL3H, REG_TYPE_UINT64, "banked", \
"net.sourceforge.openocd.banked",  NULL},
-	{ ARMV8_SPSR_EL3, "SPSR_EL3", 32, ARMV8_64_EL3H, REG_TYPE_UINT32, "banked", \
"net.sourceforge.openocd.banked", +	{ ARMV8_SPSR_EL3, "SPSR_EL3", 64, ARMV8_64_EL3H, \
REG_TYPE_UINT64, "banked", "net.sourceforge.openocd.banked",  NULL},
 	{ ARMV8_PAUTH_DMASK, "pauth_dmask", 64, ARM_MODE_ANY, REG_TYPE_UINT64, NULL, \
"org.gnu.gdb.aarch64.pauth", NULL},  { ARMV8_PAUTH_CMASK, "pauth_cmask", 64, \
ARM_MODE_ANY, REG_TYPE_UINT64, NULL, "org.gnu.gdb.aarch64.pauth", NULL},

-- 


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic