aarch64: consolidate sticky error handling
[openocd.git] / src / target / armv8.h
index f6859b2993974dc7a2a4c2dee99f6e8211038bf8..85845e63f899427603d4bbb4bbb4c0c3c5aa8ba0 100644 (file)
@@ -26,7 +26,7 @@
 #include "armv8_dpm.h"
 
 enum {
-       ARMV8_R0,
+       ARMV8_R0 = 0,
        ARMV8_R1,
        ARMV8_R2,
        ARMV8_R3,
@@ -57,11 +57,23 @@ enum {
        ARMV8_R28,
        ARMV8_R29,
        ARMV8_R30,
-       ARMV8_R31,
 
+       ARMV8_SP = 31,
        ARMV8_PC = 32,
        ARMV8_xPSR = 33,
 
+       ARMV8_ELR_EL1 = 34,
+       ARMV8_ESR_EL1 = 35,
+       ARMV8_SPSR_EL1 = 36,
+
+       ARMV8_ELR_EL2 = 37,
+       ARMV8_ESR_EL2 = 38,
+       ARMV8_SPSR_EL2 = 39,
+
+       ARMV8_ELR_EL3 = 40,
+       ARMV8_ESR_EL3 = 41,
+       ARMV8_SPSR_EL3 = 42,
+
        ARMV8_LAST_REG,
 };
 
@@ -97,12 +109,22 @@ struct armv8_cachesize {
        uint32_t way_shift;
 };
 
-struct armv8_cache_common {
-       int ctype;
+/* information about one architecture cache at any level */
+struct armv8_arch_cache {
+       int ctype;                              /* cache type, CLIDR encoding */
        struct armv8_cachesize d_u_size;        /* data cache */
        struct armv8_cachesize i_size;          /* instruction cache */
+};
+
+struct armv8_cache_common {
+       int info;
+       int loc;
+       uint32_t iminline;
+       uint32_t dminline;
+       struct armv8_arch_cache arch[6];        /* cache info, L1 - L7 */
        int i_cache_enabled;
        int d_u_cache_enabled;
+
        /* l2 external unified cache if some */
        void *l2_cache;
        int (*flush_all_data_cache)(struct target *target);
@@ -114,7 +136,10 @@ struct armv8_mmu_common {
        /* following field mmu working way */
        int32_t ttbr1_used; /*  -1 not initialized, 0 no ttbr1 1 ttbr1 used and  */
        uint64_t ttbr0_mask;/*  masked to be used  */
-       uint32_t os_border;
+
+       uint32_t ttbcr;     /* cache for ttbcr register */
+       uint32_t ttbr_mask[2];
+       uint32_t ttbr_range[2];
 
        int (*read_physical_memory)(struct target *target, target_addr_t address,
                        uint32_t size, uint32_t count, uint8_t *buffer);
@@ -133,6 +158,8 @@ struct armv8_common {
        uint32_t cti_base;
        struct adiv5_ap *debug_ap;
 
+       const uint32_t *opcodes;
+
        /* mdir */
        uint8_t multi_processor_system;
        uint8_t cluster_id;
@@ -144,12 +171,11 @@ struct armv8_common {
        uint32_t page_size;
        uint64_t ttbr_base;
 
-       /* cache specific to V7 Memory Management Unit compatible with v4_5*/
        struct armv8_mmu_common armv8_mmu;
 
        /* Direct processor core register read and writes */
-       int (*load_core_reg_u64)(struct target *target, uint32_t num, uint64_t *value);
-       int (*store_core_reg_u64)(struct target *target, uint32_t num, uint64_t value);
+       int (*read_reg_u64)(struct armv8_common *armv8, int num, uint64_t *value);
+       int (*write_reg_u64)(struct armv8_common *armv8, int num, uint64_t value);
 
        int (*examine_debug_reason)(struct target *target);
        int (*post_debug_entry)(struct target *target);
@@ -244,7 +270,8 @@ target_to_armv8(struct target *target)
 #define PAGE_SIZE_4KB_TRBBASE_MASK     0xFFFFFFFFF000
 
 int armv8_arch_state(struct target *target);
-int armv8_identify_cache(struct target *target);
+int armv8_read_mpidr(struct armv8_common *armv8);
+int armv8_identify_cache(struct armv8_common *armv8);
 int armv8_init_arch_info(struct target *target, struct armv8_common *armv8);
 int armv8_mmu_translate_va_pa(struct target *target, target_addr_t va,
                target_addr_t *val, int meminfo);
@@ -255,6 +282,32 @@ int armv8_handle_cache_info_command(struct command_context *cmd_ctx,
 
 void armv8_set_cpsr(struct arm *arm, uint32_t cpsr);
 
+static inline unsigned int armv8_curel_from_core_mode(enum arm_mode core_mode)
+{
+       switch (core_mode) {
+       /* Aarch32 modes */
+       case ARM_MODE_USR:
+               return 0;
+       case ARM_MODE_SVC:
+       case ARM_MODE_ABT: /* FIXME: EL3? */
+       case ARM_MODE_IRQ: /* FIXME: EL3? */
+       case ARM_MODE_FIQ: /* FIXME: EL3? */
+       case ARM_MODE_UND: /* FIXME: EL3? */
+       case ARM_MODE_SYS: /* FIXME: EL3? */
+               return 1;
+       /* case ARM_MODE_HYP:
+        *     return 2;
+        */
+       case ARM_MODE_MON:
+               return 3;
+       /* all Aarch64 modes */
+       default:
+               return (core_mode >> 6) & 3;
+       }
+}
+
+void armv8_select_reg_access(struct armv8_common *armv8, bool is_aarch64);
+
 extern const struct command_registration armv8_command_handlers[];
 
 #endif

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)