diff options
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/gdbserver/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/gdbserver/linux-s390-low.c | 48 | ||||
-rw-r--r-- | gdb/s390-linux-nat.c | 5 |
4 files changed, 44 insertions, 20 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 45f92e8..a282b82 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2013-11-06 Andreas Arnez <arnez@linux.vnet.ibm.com> + + * s390-linux-nat.c (s390_read_description): Consider the TE field + in the HWCAP for determining 'have_regset_tdb'. + 2013-11-06 Will Newton <will.newton@linaro.org> PR gdb/12866 diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 4f15cfb..9d514e5 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,9 @@ +2013-11-06 Andreas Arnez <arnez@linux.vnet.ibm.com> + + * linux-s390-low.c (HWCAP_S390_TE): New define. + (s390_arch_setup): Consider the TE field in the HWCAP for + determining 'have_regset_tdb'. + 2013-10-16 Sergio Durigan Junior <sergiodj@redhat.com> PR gdb/16014 diff --git a/gdb/gdbserver/linux-s390-low.c b/gdb/gdbserver/linux-s390-low.c index a2df037..ae8204b 100644 --- a/gdb/gdbserver/linux-s390-low.c +++ b/gdb/gdbserver/linux-s390-low.c @@ -32,6 +32,10 @@ #define HWCAP_S390_HIGH_GPRS 512 #endif +#ifndef HWCAP_S390_TE +#define HWCAP_S390_TE 1024 +#endif + #ifndef PTRACE_GETREGSET #define PTRACE_GETREGSET 0x4204 #endif @@ -425,23 +429,6 @@ s390_arch_setup (void) = s390_check_regset (pid, NT_S390_SYSTEM_CALL, 4); int have_regset_tdb = s390_check_regset (pid, NT_S390_TDB, 256); - /* Update target_regsets according to available register sets. */ - for (regset = s390_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; - case NT_S390_TDB: - regset->size = have_regset_tdb ? 256 : 0; - default: - break; - } - /* Assume 31-bit inferior process. */ if (have_regset_system_call) tdesc = tdesc_s390_linux32v2; @@ -456,6 +443,7 @@ s390_arch_setup (void) { unsigned int pswm; struct regcache *regcache = new_register_cache (tdesc); + fetch_inferior_registers (regcache, find_regno (tdesc, "pswm")); collect_register_by_name (regcache, "pswm", &pswm); free_register_cache (regcache); @@ -463,8 +451,12 @@ s390_arch_setup (void) if (pswm & 1) { if (have_regset_tdb) + have_regset_tdb = + (s390_get_hwcap (tdesc_s390x_linux64v2) & HWCAP_S390_TE) != 0; + + if (have_regset_tdb) tdesc = tdesc_s390x_te_linux64; - if (have_regset_system_call) + else if (have_regset_system_call) tdesc = tdesc_s390x_linux64v2; else if (have_regset_last_break) tdesc = tdesc_s390x_linux64v1; @@ -477,6 +469,8 @@ s390_arch_setup (void) else if (s390_get_hwcap (tdesc) & HWCAP_S390_HIGH_GPRS) { have_hwcap_s390_high_gprs = 1; + if (have_regset_tdb) + have_regset_tdb = (s390_get_hwcap (tdesc) & HWCAP_S390_TE) != 0; if (have_regset_tdb) tdesc = tdesc_s390_te_linux64; @@ -489,6 +483,24 @@ s390_arch_setup (void) } } #endif + + /* Update target_regsets according to available register sets. */ + for (regset = s390_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; + case NT_S390_TDB: + regset->size = have_regset_tdb ? 256 : 0; + default: + break; + } + current_process ()->tdesc = tdesc; } diff --git a/gdb/s390-linux-nat.c b/gdb/s390-linux-nat.c index 67f97f9..cf3f7d7 100644 --- a/gdb/s390-linux-nat.c +++ b/gdb/s390-linux-nat.c @@ -632,8 +632,6 @@ s390_read_description (struct target_ops *ops) = check_regset (tid, NT_S390_LAST_BREAK, 8); have_regset_system_call = check_regset (tid, NT_S390_SYSTEM_CALL, 4); - have_regset_tdb - = check_regset (tid, NT_S390_TDB, s390_sizeof_tdbregset); #ifdef __s390x__ /* If GDB itself is compiled as 64-bit, we are running on a machine in @@ -642,6 +640,9 @@ s390_read_description (struct target_ops *ops) addressing mode, but the kernel supports using 64-bit registers in that mode, report s390 architecture with 64-bit GPRs. */ + have_regset_tdb = (s390_get_hwcap () & HWCAP_S390_TE) ? + check_regset (tid, NT_S390_TDB, s390_sizeof_tdbregset) : 0; + if (s390_target_wordsize () == 8) return (have_regset_tdb ? tdesc_s390x_te_linux64 : have_regset_system_call? tdesc_s390x_linux64v2 : |