diff options
author | Ulrich Weigand <uweigand@de.ibm.com> | 2011-12-06 14:14:50 +0000 |
---|---|---|
committer | Ulrich Weigand <uweigand@de.ibm.com> | 2011-12-06 14:14:50 +0000 |
commit | c642a4345689554fbb6308c27ce59c1e86d87a7c (patch) | |
tree | 3dc2e596ea83f78b02ca132e94e24a2d3da4cace /gdb/gdbserver | |
parent | 355b81d94960ef44b9773b9fe2b6646af2ddd5a2 (diff) | |
download | gdb-c642a4345689554fbb6308c27ce59c1e86d87a7c.zip gdb-c642a4345689554fbb6308c27ce59c1e86d87a7c.tar.gz gdb-c642a4345689554fbb6308c27ce59c1e86d87a7c.tar.bz2 |
ChangeLog:
* s390-tdep.h (S390_ORIG_R2_REGNUM): Define.
(S390_LAST_BREAK_REGNUM): Likewise.
(S390_SYSTEM_CALL_REGNUM): Likewise.
(S390_NUM_REGS): Update.
(s390_regmap_last_break): Add declaration.
(s390x_regmap_last_break): Likewise.
(s390_regmap_system_call): Likewise.
(tdesc_s390_linux32v1): Add declaration.
(tdesc_s390_linux32v2): Likewise.
(tdesc_s390_linux64v1): Likewise.
(tdesc_s390_linux64v2): Likewise.
(tdesc_s390x_linux64v1): Likewise.
(tdesc_s390x_linux64v2): Likewise.
* s390-tdep.c: Include new target description files
"features/s390-linux32v1.c", "features/s390-linux32v2.c",
"features/s390-linux64v1.c", "features/s390-linux64v2.c",
"features/s390x-linux64v1.c", and "features/s390x-linux64v2.c".
(s390_cannot_store_register): New function.
(s390_write_pc): Likewise.
(s390_dwarf_regmap): Add fields for new registers.
(s390_regmap_gregset): Likewise.
(s390x_regmap_gregset): Likewise.
(s390_regmap_fpregset): Likewise.
(s390_regmap_upper): Likewise.
(s390_regmap_last_break): New variable.
(s390x_regmap_last_break): Likewise.
(s390_regmap_system_call): Likewise.
(s390_last_break_regset): Likewise.
(s390x_last_break_regset): Likewise.
(s390_system_call_regset): Likewise.
(s390_upper_regset_sections): Rename to ...
(s390_linux64_regset_sections): ... this.
(s390_linux32_regset_sections): New variable.
(s390x_linux64_regset_sections): Likewise.
(s390_linux32v1_regset_sections): Likewise.
(s390_linux32v2_regset_sections): Likewise.
(s390_linux64v1_regset_sections): Likewise.
(s390_linux64v2_regset_sections): Likewise.
(s390x_linux64v1_regset_sections): Likewise.
(s390x_linux64v2_regset_sections): Likewise.
(s390_regset_from_core_section): Handle .reg-s390-last-break and
.reg-s390-system-call core file sections.
(s390_core_read_description): Check for presence of
.reg-s390-last-break and .reg-s390-system-call core file
sections and return appropriate target description.
(s390_gdbarch_init): Detect Linux-specific registers "orig_r2",
"last_break" and "system_call" in target description. Install
appropriate gdbarch_core_regset_sections array.
Call set_gdbarch_cannot_store_register and set_gdbarch_write_pc.
(_initialize_s390_tdep): Initialize additional target descriptions.
* s390-nat.c: Include "elf/common.h".
(PTRACE_GETREGSET, PTRACE_SETREGSET): Define if undefined.
(have_regset_last_break): New static variable.
(have_regset_system_call): Likewise.
(s390_native_supply): Handle S390_ORIG_R2_REGNUM.
(s390_native_collect): Likewise.
(fetch_regset, store_regset, check_regset): New functions.
(s390_linux_fetch_inferior_registers): Handle S390_LAST_BREAK_REGNUM
and S390_SYSTEM_CALL_REGNUM.
(s390_linux_store_inferior_registers): Likewise.
(s390_read_description): Check for presence of NT_S390_LAST_BREAK
and NT_S390_SYSTEM_CALL regsets and use appropriate description.
* features/Makefile (WHICH): Add s390-linux32v1, s390-linux64v1,
s390x-linux64v1, s390-linux32v2, s390-linux64v2, and s390x-linux64v2.
(s390-linux32v1-expedite): Define.
(s390-linux32v2-expedite): Likewise.
(s390-linux64v1-expedite): Likewise.
(s390-linux64v2-expedite): Likewise.
(s390x-linux64v1-expedite): Likewise.
(s390x-linux64v2-expedite): Likewise.
* features/s390-linux32.xml: Add orig_r2 register.
* features/s390-linux64.xml: Likewise.
* features/s390x-linux64.xml: Likewise.
* features/s390-linux32v1.xml: New file.
* features/s390-linux32v2.xml: Likewise.
* features/s390-linux64v1.xml: Likewise.
* features/s390-linux64v2.xml: Likewise.
* features/s390x-linux64v1.xml: Likewise.
* features/s390x-linux64v2.xml: Likewise.
* features/s390-linux32.c: Regenerate.
* features/s390-linux64.c: Likewise.
* features/s390x-linux64.c: Likewise.
* features/s390-linux32v1.c: New generated file.
* features/s390-linux32v2.c: Likewise.
* features/s390-linux64v1.c: Likewise.
* features/s390-linux64v2.c: Likewise.
* features/s390x-linux64v1.c: Likewise.
* features/s390x-linux64v2.c: Likewise.
* regformats/s390-linux32.dat: Regenerate.
* regformats/s390-linux64.dat: Regenerate.
* regformats/s390x-linux64.dat: Regenerate.
* regformats/s390-linux32v1.dat: New generated file.
* regformats/s390-linux32v2.dat: Likewise.
* regformats/s390-linux64v1.dat: Likewise.
* regformats/s390-linux64v2.dat: Likewise.
* regformats/s390x-linux64v1.dat: Likewise.
* regformats/s390x-linux64v2.dat: Likewise.
gdbserver/ChangeLog:
* Makefile.in (s390-linux32v1.o, s390-linux32v1.c): New rules.
(s390-linux32v2.o, s390-linux32v2.c): Likewise.
(s390-linux64v1.o, s390-linux64v1.c): Likewise.
(s390-linux64v2.o, s390-linux64v2.c): Likewise.
(s390x-linux64v1.o, s390x-linux64v1.c): Likewise.
(s390x-linux64v2.o, s390x-linux64v2.c): Likewise.
* configure.srv [s390*-*-linux*] (srv_regobj): Add new objects.
(srv_xmlfiles): Add new XML files.
* linux-s390-low.c: Include "elf/common.h", <sys/ptrace.h>,
and <sys/uio.h>.
(PTRACE_GETREGSET, PTRACE_SETREGSET): Define if undefined.
(init_registers_s390_linux32v1): Add prototype.
(init_registers_s390_linux32v2): Likewise.
(init_registers_s390_linux64v1): Likewise.
(init_registers_s390_linux64v2): Likewise.
(init_registers_s390x_linux64v1): Likewise.
(init_registers_s390x_linux64v2): Likewise.
(s390_num_regs): Increment to 52.
(s390_regmap): Add orig_r2 register.
(s390_num_regs_3264): Increment to 68.
(s390_regmap_3264): Add orig_r2 register.
(s390_collect_ptrace_register): Handle orig_r2 register.
(s390_supply_ptrace_register): Likewise.
(s390_fill_last_break): New function.
(s390_store_last_break): Likewise.
(s390_fill_system_call): New function.
(s390_store_system_call): Likewise.
(target_regsets): Handle NT_S390_LAST_BREAK and NT_S390_SYSTEM_CALL
register sets.
(s390_check_regset): New function.
(s390_arch_setup): Check for presence of NT_S390_LAST_BREAK and
NT_S390_SYSTEM_CALL regsets and use appropriate description.
Update target_regsets for available register sets.
testsuite/ChangeLog:
* gdb.base/callfuncs.exp (fetch_all_registers): Filter out read-only
last_break register on s390*-*-* targets.
Diffstat (limited to 'gdb/gdbserver')
-rw-r--r-- | gdb/gdbserver/ChangeLog | 37 | ||||
-rw-r--r-- | gdb/gdbserver/Makefile.in | 18 | ||||
-rw-r--r-- | gdb/gdbserver/configure.srv | 12 | ||||
-rw-r--r-- | gdb/gdbserver/linux-s390-low.c | 133 |
4 files changed, 193 insertions, 7 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 3982763..77aca37 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,40 @@ +2011-12-06 Ulrich Weigand <uweigand@de.ibm.com> + + * Makefile.in (s390-linux32v1.o, s390-linux32v1.c): New rules. + (s390-linux32v2.o, s390-linux32v2.c): Likewise. + (s390-linux64v1.o, s390-linux64v1.c): Likewise. + (s390-linux64v2.o, s390-linux64v2.c): Likewise. + (s390x-linux64v1.o, s390x-linux64v1.c): Likewise. + (s390x-linux64v2.o, s390x-linux64v2.c): Likewise. + * configure.srv [s390*-*-linux*] (srv_regobj): Add new objects. + (srv_xmlfiles): Add new XML files. + + * linux-s390-low.c: Include "elf/common.h", <sys/ptrace.h>, + and <sys/uio.h>. + (PTRACE_GETREGSET, PTRACE_SETREGSET): Define if undefined. + (init_registers_s390_linux32v1): Add prototype. + (init_registers_s390_linux32v2): Likewise. + (init_registers_s390_linux64v1): Likewise. + (init_registers_s390_linux64v2): Likewise. + (init_registers_s390x_linux64v1): Likewise. + (init_registers_s390x_linux64v2): Likewise. + (s390_num_regs): Increment to 52. + (s390_regmap): Add orig_r2 register. + (s390_num_regs_3264): Increment to 68. + (s390_regmap_3264): Add orig_r2 register. + (s390_collect_ptrace_register): Handle orig_r2 register. + (s390_supply_ptrace_register): Likewise. + (s390_fill_last_break): New function. + (s390_store_last_break): Likewise. + (s390_fill_system_call): New function. + (s390_store_system_call): Likewise. + (target_regsets): Handle NT_S390_LAST_BREAK and NT_S390_SYSTEM_CALL + register sets. + (s390_check_regset): New function. + (s390_arch_setup): Check for presence of NT_S390_LAST_BREAK and + NT_S390_SYSTEM_CALL regsets and use appropriate description. + Update target_regsets for available register sets. + 2011-12-02 Paul Pluzhnikov <ppluzhnikov@google.com> Jan Kratochvil <jan.kratochvil@redhat.com> diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in index 01729ce..d165990 100644 --- a/gdb/gdbserver/Makefile.in +++ b/gdb/gdbserver/Makefile.in @@ -594,12 +594,30 @@ powerpc-isa205-vsx64l.c : $(srcdir)/../regformats/rs6000/powerpc-isa205-vsx64l.d s390-linux32.o : s390-linux32.c $(regdef_h) s390-linux32.c : $(srcdir)/../regformats/s390-linux32.dat $(regdat_sh) $(SHELL) $(regdat_sh) $(srcdir)/../regformats/s390-linux32.dat s390-linux32.c +s390-linux32v1.o : s390-linux32v1.c $(regdef_h) +s390-linux32v1.c : $(srcdir)/../regformats/s390-linux32v1.dat $(regdat_sh) + $(SHELL) $(regdat_sh) $(srcdir)/../regformats/s390-linux32v1.dat s390-linux32v1.c +s390-linux32v2.o : s390-linux32v2.c $(regdef_h) +s390-linux32v2.c : $(srcdir)/../regformats/s390-linux32v2.dat $(regdat_sh) + $(SHELL) $(regdat_sh) $(srcdir)/../regformats/s390-linux32v2.dat s390-linux32v2.c s390-linux64.o : s390-linux64.c $(regdef_h) s390-linux64.c : $(srcdir)/../regformats/s390-linux64.dat $(regdat_sh) $(SHELL) $(regdat_sh) $(srcdir)/../regformats/s390-linux64.dat s390-linux64.c +s390-linux64v1.o : s390-linux64v1.c $(regdef_h) +s390-linux64v1.c : $(srcdir)/../regformats/s390-linux64v1.dat $(regdat_sh) + $(SHELL) $(regdat_sh) $(srcdir)/../regformats/s390-linux64v1.dat s390-linux64v1.c +s390-linux64v2.o : s390-linux64v2.c $(regdef_h) +s390-linux64v2.c : $(srcdir)/../regformats/s390-linux64v2.dat $(regdat_sh) + $(SHELL) $(regdat_sh) $(srcdir)/../regformats/s390-linux64v2.dat s390-linux64v2.c s390x-linux64.o : s390x-linux64.c $(regdef_h) s390x-linux64.c : $(srcdir)/../regformats/s390x-linux64.dat $(regdat_sh) $(SHELL) $(regdat_sh) $(srcdir)/../regformats/s390x-linux64.dat s390x-linux64.c +s390x-linux64v1.o : s390x-linux64v1.c $(regdef_h) +s390x-linux64v1.c : $(srcdir)/../regformats/s390x-linux64v1.dat $(regdat_sh) + $(SHELL) $(regdat_sh) $(srcdir)/../regformats/s390x-linux64v1.dat s390x-linux64v1.c +s390x-linux64v2.o : s390x-linux64v2.c $(regdef_h) +s390x-linux64v2.c : $(srcdir)/../regformats/s390x-linux64v2.dat $(regdat_sh) + $(SHELL) $(regdat_sh) $(srcdir)/../regformats/s390x-linux64v2.dat s390x-linux64v2.c tic6x-c64xp-linux.o : tic6x-c64xp-linux.c $(regdef_h) tic6x-c64xp-linux.c : $(srcdir)/../regformats/tic6x-c64xp-linux.dat $(regdat_sh) diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv index 5c4900e..7c47c86 100644 --- a/gdb/gdbserver/configure.srv +++ b/gdb/gdbserver/configure.srv @@ -214,12 +214,24 @@ case "${target}" in srv_lynxos=yes ;; s390*-*-linux*) srv_regobj="s390-linux32.o" + srv_regobj="${srv_regobj} s390-linux32v1.o" + srv_regobj="${srv_regobj} s390-linux32v2.o" srv_regobj="${srv_regobj} s390-linux64.o" + srv_regobj="${srv_regobj} s390-linux64v1.o" + srv_regobj="${srv_regobj} s390-linux64v2.o" srv_regobj="${srv_regobj} s390x-linux64.o" + srv_regobj="${srv_regobj} s390x-linux64v1.o" + srv_regobj="${srv_regobj} s390x-linux64v2.o" srv_tgtobj="linux-low.o linux-osdata.o linux-s390-low.o linux-procfs.o" srv_xmlfiles="s390-linux32.xml" + srv_xmlfiles="${srv_xmlfiles} s390-linux32v1.xml" + srv_xmlfiles="${srv_xmlfiles} s390-linux32v2.xml" srv_xmlfiles="${srv_xmlfiles} s390-linux64.xml" + srv_xmlfiles="${srv_xmlfiles} s390-linux64v1.xml" + srv_xmlfiles="${srv_xmlfiles} s390-linux64v2.xml" srv_xmlfiles="${srv_xmlfiles} s390x-linux64.xml" + srv_xmlfiles="${srv_xmlfiles} s390x-linux64v1.xml" + srv_xmlfiles="${srv_xmlfiles} s390x-linux64v2.xml" srv_xmlfiles="${srv_xmlfiles} s390-core32.xml" srv_xmlfiles="${srv_xmlfiles} s390-core64.xml" srv_xmlfiles="${srv_xmlfiles} s390x-core64.xml" diff --git a/gdb/gdbserver/linux-s390-low.c b/gdb/gdbserver/linux-s390-low.c index 898b757..fcebe12 100644 --- a/gdb/gdbserver/linux-s390-low.c +++ b/gdb/gdbserver/linux-s390-low.c @@ -22,22 +22,45 @@ #include "server.h" #include "linux-low.h" +#include "elf/common.h" #include <asm/ptrace.h> +#include <sys/ptrace.h> +#include <sys/uio.h> #include <elf.h> #ifndef HWCAP_S390_HIGH_GPRS #define HWCAP_S390_HIGH_GPRS 512 #endif +#ifndef PTRACE_GETREGSET +#define PTRACE_GETREGSET 0x4204 +#endif + +#ifndef PTRACE_SETREGSET +#define PTRACE_SETREGSET 0x4205 +#endif + /* Defined in auto-generated file s390-linux32.c. */ void init_registers_s390_linux32 (void); +/* Defined in auto-generated file s390-linux32v1.c. */ +void init_registers_s390_linux32v1 (void); +/* Defined in auto-generated file s390-linux32v2.c. */ +void init_registers_s390_linux32v2 (void); /* Defined in auto-generated file s390-linux64.c. */ void init_registers_s390_linux64 (void); +/* Defined in auto-generated file s390-linux64v1.c. */ +void init_registers_s390_linux64v1 (void); +/* Defined in auto-generated file s390-linux64v2.c. */ +void init_registers_s390_linux64v2 (void); /* Defined in auto-generated file s390x-linux64.c. */ void init_registers_s390x_linux64 (void); +/* Defined in auto-generated file s390x-linux64v1.c. */ +void init_registers_s390x_linux64v1 (void); +/* Defined in auto-generated file s390x-linux64v2.c. */ +void init_registers_s390x_linux64v2 (void); -#define s390_num_regs 51 +#define s390_num_regs 52 static int s390_regmap[] = { PT_PSWMASK, PT_PSWADDR, @@ -65,10 +88,12 @@ static int s390_regmap[] = { PT_FPR8, PT_FPR9, PT_FPR10, PT_FPR11, PT_FPR12, PT_FPR13, PT_FPR14, PT_FPR15, #endif + + PT_ORIGGPR2, }; #ifdef __s390x__ -#define s390_num_regs_3264 67 +#define s390_num_regs_3264 68 static int s390_regmap_3264[] = { PT_PSWMASK, PT_PSWADDR, @@ -93,6 +118,8 @@ static int s390_regmap_3264[] = { PT_FPR4, PT_FPR5, PT_FPR6, PT_FPR7, PT_FPR8, PT_FPR9, PT_FPR10, PT_FPR11, PT_FPR12, PT_FPR13, PT_FPR14, PT_FPR15, + + PT_ORIGGPR2, }; #endif @@ -143,7 +170,8 @@ s390_collect_ptrace_register (struct regcache *regcache, int regno, char *buf) collect_register (regcache, regno, buf + sizeof (long) - size); buf[sizeof (long) - size] &= ~0x80; } - else if (regaddr >= PT_GPR0 && regaddr <= PT_GPR15) + else if ((regaddr >= PT_GPR0 && regaddr <= PT_GPR15) + || regaddr == PT_ORIGGPR2) collect_register (regcache, regno, buf + sizeof (long) - size); else collect_register (regcache, regno, buf); @@ -196,7 +224,8 @@ s390_supply_ptrace_register (struct regcache *regcache, addr[0] |= amode; supply_register (regcache, regno, addr); } - else if (regaddr >= PT_GPR0 && regaddr <= PT_GPR15) + else if ((regaddr >= PT_GPR0 && regaddr <= PT_GPR15) + || regaddr == PT_ORIGGPR2) supply_register (regcache, regno, buf + sizeof (long) - size); else supply_register (regcache, regno, buf); @@ -223,8 +252,40 @@ static void s390_fill_gregset (struct regcache *regcache, void *buf) } } +/* Fill and store functions for extended register sets. */ + +static void +s390_fill_last_break (struct regcache *regcache, void *buf) +{ + /* Last break address is read-only. */ +} + +static void +s390_store_last_break (struct regcache *regcache, const void *buf) +{ + supply_register_by_name (regcache, "last_break", + (const char *)buf + 8 - register_size (0)); +} + +static void +s390_fill_system_call (struct regcache *regcache, void *buf) +{ + collect_register_by_name (regcache, "system_call", buf); +} + +static void +s390_store_system_call (struct regcache *regcache, const void *buf) +{ + supply_register_by_name (regcache, "system_call", buf); +} + struct regset_info target_regsets[] = { { 0, 0, 0, 0, GENERAL_REGS, s390_fill_gregset, NULL }, + /* Last break address is read-only; do not attempt PTRACE_SETREGSET. */ + { PTRACE_GETREGSET, PTRACE_GETREGSET, NT_S390_LAST_BREAK, 0, + EXTENDED_REGS, s390_fill_last_break, s390_store_last_break }, + { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_S390_SYSTEM_CALL, 0, + EXTENDED_REGS, s390_fill_system_call, s390_store_system_call }, { 0, 0, 0, -1, -1, NULL, NULL } }; @@ -296,11 +357,56 @@ s390_get_hwcap (void) } #endif +static int +s390_check_regset (int pid, int regset, int regsize) +{ + gdb_byte *buf = alloca (regsize); + struct iovec iov; + + iov.iov_base = buf; + iov.iov_len = regsize; + + if (ptrace (PTRACE_GETREGSET, pid, (long) regset, (long) &iov) < 0) + return 0; + else + return 1; +} + static void s390_arch_setup (void) { + struct regset_info *regset; + + /* Check whether the kernel supports extra register sets. */ + int pid = pid_of (get_thread_lwp (current_inferior)); + int have_regset_last_break + = s390_check_regset (pid, NT_S390_LAST_BREAK, 8); + int have_regset_system_call + = s390_check_regset (pid, NT_S390_SYSTEM_CALL, 4); + + /* Update target_regsets according to available register sets. */ + for (regset = target_regsets; regset->fill_function != NULL; regset++) + if (regset->get_request == PTRACE_GETREGSET) + switch (regset->nt_type) + { + case NT_S390_LAST_BREAK: + regset->size = have_regset_last_break? 8 : 0; + break; + case NT_S390_SYSTEM_CALL: + regset->size = have_regset_system_call? 4 : 0; + break; + default: + break; + } + /* Assume 31-bit inferior process. */ - init_registers_s390_linux32 (); + if (have_regset_system_call) + init_registers_s390_linux32v2 (); + else if (have_regset_last_break) + init_registers_s390_linux32v1 (); + else + init_registers_s390_linux32 (); + the_low_target.num_regs = s390_num_regs; the_low_target.regmap = s390_regmap; @@ -315,13 +421,26 @@ s390_arch_setup (void) free_register_cache (regcache); if (pswm & 1) - init_registers_s390x_linux64 (); + { + if (have_regset_system_call) + init_registers_s390x_linux64v2 (); + else if (have_regset_last_break) + init_registers_s390x_linux64v1 (); + else + init_registers_s390x_linux64 (); + } /* For a 31-bit inferior, check whether the kernel supports using the full 64-bit GPRs. */ else if (s390_get_hwcap () & HWCAP_S390_HIGH_GPRS) { - init_registers_s390_linux64 (); + if (have_regset_system_call) + init_registers_s390_linux64v2 (); + else if (have_regset_last_break) + init_registers_s390_linux64v1 (); + else + init_registers_s390_linux64 (); + the_low_target.num_regs = s390_num_regs_3264; the_low_target.regmap = s390_regmap_3264; } |