diff options
Diffstat (limited to 'gdb/xtensa-tdep.h')
-rw-r--r-- | gdb/xtensa-tdep.h | 89 |
1 files changed, 75 insertions, 14 deletions
diff --git a/gdb/xtensa-tdep.h b/gdb/xtensa-tdep.h index a8f7c9f..dc3a646 100644 --- a/gdb/xtensa-tdep.h +++ b/gdb/xtensa-tdep.h @@ -59,6 +59,7 @@ typedef enum xtRegisterGroupVectra = 0x0800, /* Vectra. */ xtRegisterGroupSystem = 0x1000, /* System. */ + xtRegisterGroupNCP = 0x00800000, /* Non-CP non-base opt/custom. */ xtRegisterGroupCP0 = 0x01000000, /* CP0. */ xtRegisterGroupCP1 = 0x02000000, /* CP1. */ xtRegisterGroupCP2 = 0x04000000, /* CP2. */ @@ -87,24 +88,20 @@ typedef unsigned long xtensa_elf_greg_t; typedef struct { - xtensa_elf_greg_t xchal_config_id0; - xtensa_elf_greg_t xchal_config_id1; - xtensa_elf_greg_t cpux; - xtensa_elf_greg_t cpuy; xtensa_elf_greg_t pc; xtensa_elf_greg_t ps; - xtensa_elf_greg_t exccause; - xtensa_elf_greg_t excvaddr; - xtensa_elf_greg_t windowbase; - xtensa_elf_greg_t windowstart; xtensa_elf_greg_t lbeg; xtensa_elf_greg_t lend; xtensa_elf_greg_t lcount; xtensa_elf_greg_t sar; - xtensa_elf_greg_t syscall; - xtensa_elf_greg_t ar[0]; /* variable size (per config). */ + xtensa_elf_greg_t windowstart; + xtensa_elf_greg_t windowbase; + xtensa_elf_greg_t reserved[8+48]; + xtensa_elf_greg_t ar[64]; } xtensa_elf_gregset_t; +#define XTENSA_ELF_NGREG (sizeof (xtensa_elf_gregset_t) \ + / sizeof (xtensa_elf_greg_t)) /* Mask. */ @@ -138,19 +135,24 @@ typedef struct unsigned int target_number; /* Register target number. */ int flags; /* Flags. */ + int coprocessor; /* Coprocessor num, -1 for non-CP, else -2. */ const xtensa_mask_t *mask; /* Register is a compilation of other regs. */ const char *fetch; /* Instruction sequence to fetch register. */ const char *store; /* Instruction sequence to store register. */ } xtensa_register_t; +/* For xtensa-config.c to expand to the structure above. */ +#define XTREG(index,ofs,bsz,sz,al,tnum,flg,cp,ty,gr,name,fet,sto,mas,ct,x,y) \ + {#name, ofs, ty, ((gr)|((xtRegisterGroupNCP>>2)<<(cp+2))), \ + ct, bsz, sz, al, tnum, flg, cp, mas, fet, sto}, +#define XTREG_END {0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0}, -#define XTENSA_REGISTER_FLAGS_PRIVILEDGED 0x0001 +#define XTENSA_REGISTER_FLAGS_PRIVILEGED 0x0001 #define XTENSA_REGISTER_FLAGS_READABLE 0x0002 #define XTENSA_REGISTER_FLAGS_WRITABLE 0x0004 #define XTENSA_REGISTER_FLAGS_VOLATILE 0x0008 - /* Call-ABI for stack frame. */ typedef enum @@ -194,7 +196,8 @@ struct gdbarch_tdep xtensa_register_t* regmap; - unsigned int num_regs; /* Number of registers in regmap. */ + unsigned int num_regs; /* Number of registers in register map. */ + unsigned int num_nopriv_regs; /* Number of non-privileged registers. */ unsigned int num_pseudo_regs; /* Number of pseudo registers. */ unsigned int num_aregs; /* Size of register file. */ unsigned int num_contexts; @@ -225,7 +228,65 @@ struct gdbarch_tdep unsigned long *gregmap; }; - +/* Macro to instantiate a gdbarch_tdep structure. */ + +#define XTENSA_GDBARCH_TDEP_INSTANTIATE(rmap,spillsz) \ + { \ + .target_flags = 0, \ + .spill_location = -1, \ + .spill_size = (spillsz), \ + .unused = 0, \ + .call_abi = 0, \ + .debug_interrupt_level = XCHAL_DEBUGLEVEL, \ + .icache_line_bytes = XCHAL_ICACHE_LINESIZE, \ + .dcache_line_bytes = XCHAL_DCACHE_LINESIZE, \ + .dcache_writeback = XCHAL_DCACHE_IS_WRITEBACK, \ + .isa_use_windowed_registers = (XSHAL_ABI != XTHAL_ABI_CALL0), \ + .isa_use_density_instructions = XCHAL_HAVE_DENSITY, \ + .isa_use_exceptions = XCHAL_HAVE_EXCEPTIONS, \ + .isa_use_ext_l32r = XSHAL_USE_ABSOLUTE_LITERALS, \ + .isa_max_insn_size = XCHAL_MAX_INSTRUCTION_SIZE, \ + .debug_num_ibreaks = XCHAL_NUM_IBREAK, \ + .debug_num_dbreaks = XCHAL_NUM_DBREAK, \ + .regmap = rmap, \ + .num_regs = 0, \ + .num_nopriv_regs = 0, \ + .num_pseudo_regs = 0, \ + .num_aregs = XCHAL_NUM_AREGS, \ + .num_contexts = XCHAL_NUM_CONTEXTS, \ + .ar_base = -1, \ + .a0_base = -1, \ + .wb_regnum = -1, \ + .ws_regnum = -1, \ + .pc_regnum = -1, \ + .ps_regnum = -1, \ + .lbeg_regnum = -1, \ + .lend_regnum = -1, \ + .lcount_regnum = -1, \ + .sar_regnum = -1, \ + .litbase_regnum = -1, \ + .interrupt_regnum = -1, \ + .interrupt2_regnum = -1, \ + .cpenable_regnum = -1, \ + .debugcause_regnum = -1, \ + .exccause_regnum = -1, \ + .excvaddr_regnum = -1, \ + .max_register_raw_size = 0, \ + .max_register_virtual_size = 0, \ + .fp_layout = 0, \ + .fp_layout_bytes = 0, \ + .gregmap = 0, \ + } +#define XTENSA_CONFIG_INSTANTIATE(rmap,spill_size) \ + struct gdbarch_tdep xtensa_tdep = \ + XTENSA_GDBARCH_TDEP_INSTANTIATE(rmap,spill_size); + +#ifndef XCHAL_NUM_CONTEXTS +#define XCHAL_NUM_CONTEXTS 0 +#endif +#ifndef XCHAL_HAVE_EXCEPTIONS +#define XCHAL_HAVE_EXCEPTIONS 1 +#endif #define WB_SHIFT 2 /* We assign fixed numbers to the registers of the "current" window |