X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fgdbserver%2Flinux-sparc-low.c;h=796af8aa5764e3b1c26795601f4f672e5d01dbd9;hb=94585166dfea8232c248044f9f4b1c217dc4ac2e;hp=530b4f1a101d54f99378e5568819d3d5d4652833;hpb=7b6bb8daaceb9ecf3f42dea57ae82733d6a3b2f6;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/gdbserver/linux-sparc-low.c b/gdb/gdbserver/linux-sparc-low.c index 530b4f1a10..796af8aa57 100644 --- a/gdb/gdbserver/linux-sparc-low.c +++ b/gdb/gdbserver/linux-sparc-low.c @@ -1,6 +1,5 @@ /* Low level interface to ptrace, for the remote server for GDB. - Copyright (C) 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, - 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. + Copyright (C) 1995-2015 Free Software Foundation, Inc. This file is part of GDB. @@ -20,7 +19,7 @@ #include "server.h" #include "linux-low.h" -#include +#include "nat/gdb_ptrace.h" #include "gdb_proc_service.h" @@ -40,7 +39,8 @@ #define SPARC_F_REGS_NUM 48 #define SPARC_CONTROL_REGS_NUM 6 -#define sparc_num_regs (SPARC_R_REGS_NUM + SPARC_F_REGS_NUM + SPARC_CONTROL_REGS_NUM) +#define sparc_num_regs \ + (SPARC_R_REGS_NUM + SPARC_F_REGS_NUM + SPARC_CONTROL_REGS_NUM) /* Each offset is multiplied by 8, because of the register size. These offsets apply to the buffer sent/filled by ptrace. @@ -49,10 +49,10 @@ static int sparc_regmap[] = { /* These offsets correspond to GET/SETREGSET. */ - -1, 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, /* g0 .. g7 */ - 7*8, 8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, /* o0 .. o5, sp, o7 */ - -1, -1, -1, -1, -1, -1, -1, -1, /* l0 .. l7 */ - -1, -1, -1, -1, -1, -1, -1, -1, /* i0 .. i5, fp, i7 */ + -1, 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, /* g0 .. g7 */ + 7*8, 8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8, /* o0 .. o5, sp, o7 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* l0 .. l7 */ + -1, -1, -1, -1, -1, -1, -1, -1, /* i0 .. i5, fp, i7 */ /* Floating point registers offsets correspond to GET/SETFPREGSET. */ 0*4, 1*4, 2*4, 3*4, 4*4, 5*4, 6*4, 7*4, /* f0 .. f7 */ @@ -67,7 +67,8 @@ static int sparc_regmap[] = { 17 *8, /* pc */ 18 *8, /* npc */ 16 *8, /* state */ - /* FSR offset also corresponds to GET/SETFPREGSET, ans is placed next to f62. */ + /* FSR offset also corresponds to GET/SETFPREGSET, ans is placed + next to f62. */ 32 *8, /* fsr */ -1, /* fprs */ /* Y register is 32-bits length, but gdb takes care of that. */ @@ -99,6 +100,7 @@ static const struct regs_range_t fpregs_ranges[] = { /* Defined in auto-generated file reg-sparc64.c. */ void init_registers_sparc64 (void); +extern const struct target_desc *tdesc_sparc64; static int sparc_cannot_store_register (int regno) @@ -118,19 +120,21 @@ sparc_fill_gregset_to_stack (struct regcache *regcache, const void *buf) int i; CORE_ADDR addr = 0; unsigned char tmp_reg_buf[8]; - const int l0_regno = find_regno("l0"); + const int l0_regno = find_regno (regcache->tdesc, "l0"); const int i7_regno = l0_regno + 15; /* These registers have to be stored in the stack. */ - memcpy(&addr, ((char *) buf) + sparc_regmap[find_regno("sp")], sizeof(addr)); + memcpy (&addr, + ((char *) buf) + sparc_regmap[find_regno (regcache->tdesc, "sp")], + sizeof (addr)); addr += BIAS; for (i = l0_regno; i <= i7_regno; i++) { collect_register (regcache, i, tmp_reg_buf); - (*the_target->write_memory) (addr, tmp_reg_buf, sizeof(tmp_reg_buf)); - addr += sizeof(tmp_reg_buf); + (*the_target->write_memory) (addr, tmp_reg_buf, sizeof (tmp_reg_buf)); + addr += sizeof (tmp_reg_buf); } } @@ -141,7 +145,8 @@ sparc_fill_gregset (struct regcache *regcache, void *buf) int range; for (range = 0; range < N_GREGS_RANGES; range++) - for (i = gregs_ranges[range].regno_start; i <= gregs_ranges[range].regno_end; i++) + for (i = gregs_ranges[range].regno_start; + i <= gregs_ranges[range].regno_end; i++) if (sparc_regmap[i] != -1) collect_register (regcache, i, ((char *) buf) + sparc_regmap[i]); @@ -155,7 +160,8 @@ sparc_fill_fpregset (struct regcache *regcache, void *buf) int range; for (range = 0; range < N_FPREGS_RANGES; range++) - for (i = fpregs_ranges[range].regno_start; i <= fpregs_ranges[range].regno_end; i++) + for (i = fpregs_ranges[range].regno_start; + i <= fpregs_ranges[range].regno_end; i++) collect_register (regcache, i, ((char *) buf) + sparc_regmap[i]); } @@ -166,19 +172,21 @@ sparc_store_gregset_from_stack (struct regcache *regcache, const void *buf) int i; CORE_ADDR addr = 0; unsigned char tmp_reg_buf[8]; - const int l0_regno = find_regno("l0"); + const int l0_regno = find_regno (regcache->tdesc, "l0"); const int i7_regno = l0_regno + 15; /* These registers have to be obtained from the stack. */ - memcpy(&addr, ((char *) buf) + sparc_regmap[find_regno("sp")], sizeof(addr)); + memcpy (&addr, + ((char *) buf) + sparc_regmap[find_regno (regcache->tdesc, "sp")], + sizeof (addr)); addr += BIAS; for (i = l0_regno; i <= i7_regno; i++) { - (*the_target->read_memory) (addr, tmp_reg_buf, sizeof(tmp_reg_buf)); + (*the_target->read_memory) (addr, tmp_reg_buf, sizeof (tmp_reg_buf)); supply_register (regcache, i, tmp_reg_buf); - addr += sizeof(tmp_reg_buf); + addr += sizeof (tmp_reg_buf); } } @@ -189,10 +197,11 @@ sparc_store_gregset (struct regcache *regcache, const void *buf) char zerobuf[8]; int range; - memset (zerobuf, 0, sizeof(zerobuf)); + memset (zerobuf, 0, sizeof (zerobuf)); for (range = 0; range < N_GREGS_RANGES; range++) - for (i = gregs_ranges[range].regno_start; i <= gregs_ranges[range].regno_end; i++) + for (i = gregs_ranges[range].regno_start; + i <= gregs_ranges[range].regno_end; i++) if (sparc_regmap[i] != -1) supply_register (regcache, i, ((char *) buf) + sparc_regmap[i]); else @@ -222,11 +231,13 @@ sparc_get_pc (struct regcache *regcache) unsigned long pc; collect_register_by_name (regcache, "pc", &pc); if (debug_threads) - fprintf (stderr, "stop pc is %08lx\n", pc); + debug_printf ("stop pc is %08lx\n", pc); return pc; } -static const unsigned char sparc_breakpoint[INSN_SIZE] = { 0x91, 0xd0, 0x20, 0x01 }; +static const unsigned char sparc_breakpoint[INSN_SIZE] = { + 0x91, 0xd0, 0x20, 0x01 +}; #define sparc_breakpoint_len INSN_SIZE @@ -235,12 +246,13 @@ sparc_breakpoint_at (CORE_ADDR where) { unsigned char insn[INSN_SIZE]; - (*the_target->read_memory) (where, (unsigned char *) insn, sizeof(insn)); + (*the_target->read_memory) (where, (unsigned char *) insn, sizeof (insn)); - if (memcmp(sparc_breakpoint, insn, sizeof(insn)) == 0) + if (memcmp (sparc_breakpoint, insn, sizeof (insn)) == 0) return 1; - /* If necessary, recognize more trap instructions here. GDB only uses TRAP Always. */ + /* If necessary, recognize more trap instructions here. GDB only + uses TRAP Always. */ return 0; } @@ -251,15 +263,20 @@ sparc_breakpoint_at (CORE_ADDR where) static CORE_ADDR sparc_reinsert_addr (void) { - struct regcache *regcache = get_thread_regcache (current_inferior, 1); + struct regcache *regcache = get_thread_regcache (current_thread, 1); CORE_ADDR lr; /* O7 is the equivalent to the 'lr' of other archs. */ collect_register_by_name (regcache, "o7", &lr); return lr; } +static void +sparc_arch_setup (void) +{ + current_process ()->tdesc = tdesc_sparc64; +} -struct regset_info target_regsets[] = { +static struct regset_info sparc_regsets[] = { { PTRACE_GETREGS, PTRACE_SETREGS, 0, sizeof (elf_gregset_t), GENERAL_REGS, sparc_fill_gregset, sparc_store_gregset }, @@ -269,13 +286,40 @@ struct regset_info target_regsets[] = { { 0, 0, 0, -1, -1, NULL, NULL } }; +static struct regsets_info sparc_regsets_info = + { + sparc_regsets, /* regsets */ + 0, /* num_regsets */ + NULL, /* disabled_regsets */ + }; + +static struct usrregs_info sparc_usrregs_info = + { + sparc_num_regs, + /* No regmap needs to be provided since this impl. doesn't use + USRREGS. */ + NULL + }; + +static struct regs_info regs_info = + { + NULL, /* regset_bitmap */ + &sparc_usrregs_info, + &sparc_regsets_info + }; + +static const struct regs_info * +sparc_regs_info (void) +{ + return ®s_info; +} + struct linux_target_ops the_low_target = { - init_registers_sparc64, - sparc_num_regs, - /* No regmap needs to be provided since this impl. doesn't use USRREGS. */ - NULL, + sparc_arch_setup, + sparc_regs_info, sparc_cannot_fetch_register, sparc_cannot_store_register, + NULL, /* fetch_register */ sparc_get_pc, /* No sparc_set_pc is needed. */ NULL, @@ -284,6 +328,16 @@ struct linux_target_ops the_low_target = { sparc_reinsert_addr, 0, sparc_breakpoint_at, + NULL, /* supports_z_point_type */ NULL, NULL, NULL, NULL, NULL, NULL }; + +void +initialize_low_arch (void) +{ + /* Initialize the Linux target descriptions. */ + init_registers_sparc64 (); + + initialize_regsets_info (&sparc_regsets_info); +}