aboutsummaryrefslogtreecommitdiff
path: root/gdb/xtensa-tdep.h
diff options
context:
space:
mode:
authorMaxim Grigoriev <maxim2405@gmail.com>2008-02-11 21:58:41 +0000
committerMaxim Grigoriev <maxim2405@gmail.com>2008-02-11 21:58:41 +0000
commit94a0e877111421d300d26b858bd3a0a27078d1e8 (patch)
treef34169ef9230d5d48df5cfb3979774e416dd99e9 /gdb/xtensa-tdep.h
parent6c7d412cf3470258471ef41332d68e17c0127c26 (diff)
downloadgdb-94a0e877111421d300d26b858bd3a0a27078d1e8.zip
gdb-94a0e877111421d300d26b858bd3a0a27078d1e8.tar.gz
gdb-94a0e877111421d300d26b858bd3a0a27078d1e8.tar.bz2
2008-02-11 Maxim Grigoriev <maxim2405@gmail.com>
* NEWS (New native configurations): Xtensa GNU/Linux. (New targets): Xtensa GNU/Linux. * Makefile.in (ALL_TARGET_OBS): Add xtensa-linux-nat.o and xtensa-linux-tdep.o (ALLDEPFILES): Add xtensa-linux-tdep.c and xtensa-linux-nat.c (xtensa-linux-nat.o, xtensa-linux-tdep.o): New dependencies. * configure.tgt (xtensa*-*-linux*): New entry. * xtensa-config.c (xtensa_tdep): New variable. (xtensa_config_byte_order, xtensa_config_tdep): Removed. (rmap): Change format based on new macro XTREG. (XTENSA_CONFIG_INSTANTIATE): Use new macro defined in xtensa-tdep.h. * xtensa-linux-nat.c: New. * xtensa-linux-tdep.c: New. * xtensa-xtregs.c: New. * xtensa-tdep.h (xtensa_elf_gregset_t): Update. (XTENSA_ELF_NGREG, XTREG, XTREG_END, XTENSA_GDBARCH_TDEP_INSTANTIATE) (XCHAL_NUM_CONTEXTS, XCHAL_HAVE_EXCEPTIONS): New macros. (xtensa_register_t): New field coprocessor. (XTENSA_REGISTER_FLAGS_PRIVILEGED): Name spelling corrected. * xtensa-tdep.c (xtensa_config_tdep, xtensa_config_byte_order): Removed. (xtensa_pseudo_register_read, xtensa_pseudo_register_write): Update to handle privileged registers. (xtensa_supply_gregset) Remove exccause and excvaddr registers. (xtensa_push_dummy_call): Set windowstart register correctly. (call0_analyze_prologue): Initialize xtensa_default_isa. (xtensa_derive_tdep): New. (xtensa_gdbarch_init): Get rid of xtensa_config_byte_order and xtensa_config_tdep, use XCHAL_HAVE_BE and xtensa_tdep instead. Call xtensa_derive_tdep(). * config/xtensa/linux.mh: New. * regformats/reg-xtensa.dat: New.
Diffstat (limited to 'gdb/xtensa-tdep.h')
-rw-r--r--gdb/xtensa-tdep.h89
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