aarch64: cache identification for aarch32 state 17/3817/4
authorMatthias Welwarsky <matthias.welwarsky@sysgo.com>
Thu, 20 Oct 2016 11:20:26 +0000 (13:20 +0200)
committerMatthias Welwarsky <matthias.welwarsky@sysgo.com>
Fri, 10 Feb 2017 13:18:34 +0000 (14:18 +0100)
Use proper T32 opcodes for cache identification when the PE is in
Aarch32 state

Change-Id: I9cd9169409889273a3fd61167f388e68d8dde86d
Signed-off-by: Matthias Welwarsky <matthias.welwarsky@sysgo.com>
src/target/armv8_cache.c
src/target/armv8_opcodes.c
src/target/armv8_opcodes.h

index f496c3cf0519cb14c90d63cb2eba74d5855c94e0..31e4c79600ce412b39ddddd68bb5db7ff121ad50 100644 (file)
@@ -266,17 +266,18 @@ static int  armv8_flush_all_data(struct target *target)
 
 static int get_cache_info(struct arm_dpm *dpm, int cl, int ct, uint32_t *cache_reg)
 {
+       struct armv8_common *armv8 = dpm->arm->arch_info;
        int retval = ERROR_OK;
 
        /*  select cache level */
        retval = dpm->instr_write_data_r0(dpm,
-                       ARMV8_MSR_GP(SYSTEM_CSSELR, 0),
+                       armv8_opcode(armv8, WRITE_REG_CSSELR),
                        (cl << 1) | (ct == 1 ? 1 : 0));
        if (retval != ERROR_OK)
                goto done;
 
        retval = dpm->instr_read_data_r0(dpm,
-                       ARMV8_MRS(SYSTEM_CCSIDR, 0),
+                       armv8_opcode(armv8, READ_REG_CCSIDR),
                        cache_reg);
  done:
        return retval;
@@ -319,7 +320,8 @@ int armv8_identify_cache(struct armv8_common *armv8)
                goto done;
 
        /* retrieve CTR */
-       retval = dpm->instr_read_data_r0(dpm, ARMV8_MRS(SYSTEM_CTR, 0), &ctr);
+       retval = dpm->instr_read_data_r0(dpm,
+                       armv8_opcode(armv8, READ_REG_CTR), &ctr);
        if (retval != ERROR_OK)
                goto done;
 
@@ -329,7 +331,8 @@ int armv8_identify_cache(struct armv8_common *armv8)
                 ctr, cache->iminline, cache->dminline);
 
        /*  retrieve CLIDR */
-       retval = dpm->instr_read_data_r0(dpm, ARMV8_MRS(SYSTEM_CLIDR, 0), &clidr);
+       retval = dpm->instr_read_data_r0(dpm,
+                       armv8_opcode(armv8, READ_REG_CLIDR), &clidr);
        if (retval != ERROR_OK)
                goto done;
 
@@ -338,7 +341,8 @@ int armv8_identify_cache(struct armv8_common *armv8)
 
        /*  retrieve selected cache for later restore
         *  MRC p15, 2,<Rd>, c0, c0, 0; Read CSSELR */
-       retval = dpm->instr_read_data_r0(dpm, ARMV8_MRS(SYSTEM_CSSELR, 0), &csselr);
+       retval = dpm->instr_read_data_r0(dpm,
+                       armv8_opcode(armv8, READ_REG_CSSELR), &csselr);
        if (retval != ERROR_OK)
                goto done;
 
@@ -396,7 +400,8 @@ int armv8_identify_cache(struct armv8_common *armv8)
        }
 
        /*  restore selected cache  */
-       dpm->instr_write_data_r0(dpm, ARMV8_MSR_GP(SYSTEM_CSSELR, 0), csselr);
+       dpm->instr_write_data_r0(dpm,
+                       armv8_opcode(armv8, WRITE_REG_CSSELR), csselr);
        if (retval != ERROR_OK)
                goto done;
 
index 75ea946184d30222634d5a2c39894738fa5b2ab4..2b42cdf365cd06d2e12e0b69f811cdaa2b180c51 100644 (file)
@@ -24,6 +24,7 @@
 #include "armv8_opcodes.h"
 
 static const uint32_t a64_opcodes[ARMV8_OPC_NUM] = {
+               [READ_REG_CTR]          = ARMV8_MRS(SYSTEM_CTR, 0),
                [READ_REG_CLIDR]        = ARMV8_MRS(SYSTEM_CLIDR, 0),
                [READ_REG_CSSELR]       = ARMV8_MRS(SYSTEM_CSSELR, 0),
                [READ_REG_CCSIDR]       = ARMV8_MRS(SYSTEM_CCSIDR, 0),
@@ -39,6 +40,7 @@ static const uint32_t a64_opcodes[ARMV8_OPC_NUM] = {
 };
 
 static const uint32_t t32_opcodes[ARMV8_OPC_NUM] = {
+               [READ_REG_CTR]          = ARMV4_5_MRC(15, 0, 0, 0, 0, 1),
                [READ_REG_CLIDR]        = ARMV4_5_MRC(15, 1, 0, 0, 0, 1),
                [READ_REG_CSSELR]       = ARMV4_5_MRC(15, 2, 0, 0, 0, 0),
                [READ_REG_CCSIDR]       = ARMV4_5_MRC(15, 1, 0, 0, 0, 0),
index e57e7e9db747e4bc339a0f868529298cd024a53c..b489d57df329265b1be4c4b9f2882c7f91cde2e7 100644 (file)
 #define ARMV8_SYS(System, Rt) (0xD5080000 | ((System) << 5) | Rt)
 
 enum armv8_opcode {
+       READ_REG_CTR,
        READ_REG_CLIDR,
        READ_REG_CSSELR,
        READ_REG_CCSIDR,

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)