From 94a0e877111421d300d26b858bd3a0a27078d1e8 Mon Sep 17 00:00:00 2001 From: Maxim Grigoriev Date: Mon, 11 Feb 2008 21:58:41 +0000 Subject: 2008-02-11 Maxim Grigoriev * 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. --- gdb/xtensa-tdep.h | 89 ++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 75 insertions(+), 14 deletions(-) (limited to 'gdb/xtensa-tdep.h') 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 -- cgit v1.1