import gdb-8.2-16.el8
This commit is contained in:
parent
d375b82ad1
commit
869c48217b
@ -751,3 +751,35 @@ Patch183: gdb-rhbz1905701-DWARF-data_location.patch
|
||||
# Andreas Arnaz (RH BZ 1903374)
|
||||
Patch184: gdb-rhbz1903374-s390x-store-on-condition.patch
|
||||
|
||||
# Fix segfault with nameless fortran modules.
|
||||
# Bernhard Heckel, RH BZ 1943673
|
||||
Patch185: gdb-rhbz1934673-fortran-nameless-modules.patch
|
||||
|
||||
# Backport "Add low_new_clone method to linux_nat_target."
|
||||
# (Pedro Franco de Carvalho, RH BZ 1854784)
|
||||
Patch186: gdb-rhbz1854784-powerpc-remove-region-limit-dawr-1of7.patch
|
||||
|
||||
# Backport "Add linux_get_hwcap"
|
||||
# (Alan Hayward, RH BZ 1854784)
|
||||
Patch187: gdb-rhbz1854784-powerpc-remove-region-limit-dawr-2of7.patch
|
||||
|
||||
# Backport "[PowerPC] Move up some register access routines"
|
||||
# (Pedro Franco de Carvalho, RH BZ 1854784)
|
||||
Patch188: gdb-rhbz1854784-powerpc-remove-region-limit-dawr-3of7.patch
|
||||
|
||||
# Backport "[PowerPC] Fix debug register issues in ppc-linux-nat"
|
||||
# (Pedro Franco de Carvalho, RH BZ 1854784)
|
||||
Patch189: gdb-rhbz1854784-powerpc-remove-region-limit-dawr-4of7.patch
|
||||
|
||||
# Backport "[PowerPC] Use < 0 and >= 0 for watchpoint ptrace calls"
|
||||
# (Pedro Franco de Carvalho, RH BZ 1854784)
|
||||
Patch190: gdb-rhbz1854784-powerpc-remove-region-limit-dawr-5of7.patch
|
||||
|
||||
# Backport "[PowerPC] Always clear watchpoint with PTRACE_SET_DEBUGREG"
|
||||
# (Pedro Franco de Carvalho, RH BZ 1854784)
|
||||
Patch191: gdb-rhbz1854784-powerpc-remove-region-limit-dawr-6of7.patch
|
||||
|
||||
# Backport "PowerPC remove 512 bytes region limit if 2nd DAWR is available."
|
||||
# (Rogerio Alves, RH BZ 1854784)
|
||||
Patch192: gdb-rhbz1854784-powerpc-remove-region-limit-dawr-7of7.patch
|
||||
|
||||
|
@ -182,3 +182,11 @@
|
||||
%patch182 -p1
|
||||
%patch183 -p1
|
||||
%patch184 -p1
|
||||
%patch185 -p1
|
||||
%patch186 -p1
|
||||
%patch187 -p1
|
||||
%patch188 -p1
|
||||
%patch189 -p1
|
||||
%patch190 -p1
|
||||
%patch191 -p1
|
||||
%patch192 -p1
|
||||
|
@ -0,0 +1,49 @@
|
||||
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
|
||||
From: Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
|
||||
Date: Wed, 7 Jul 2021 15:44:29 -0400
|
||||
Subject: gdb-rhbz1854784-powerpc-remove-region-limit-dawr-1of7.patch
|
||||
|
||||
;; Backport "Add low_new_clone method to linux_nat_target."
|
||||
;; (Pedro Franco de Carvalho, RH BZ 1854784)
|
||||
|
||||
This patch adds a low_new_clone method to linux_nat_target, called after
|
||||
a PTRACE_EVENT_CLONE is detected, similar to how low_new_fork is called
|
||||
after PTRACE_EVENT_(V)FORK.
|
||||
|
||||
This is useful for targets that need to copy state associated with a
|
||||
thread that is inherited across clones.
|
||||
|
||||
gdb/ChangeLog:
|
||||
2020-03-30 Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
|
||||
|
||||
* linux-nat.h (low_new_clone): New method.
|
||||
* linux-nat.c (linux_handle_extended_wait): Call low_new_clone.
|
||||
|
||||
diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
|
||||
--- a/gdb/linux-nat.c
|
||||
+++ b/gdb/linux-nat.c
|
||||
@@ -2020,6 +2020,10 @@ linux_handle_extended_wait (struct lwp_info *lp, int status)
|
||||
inferior. */
|
||||
linux_target->low_new_fork (lp, new_pid);
|
||||
}
|
||||
+ else if (event == PTRACE_EVENT_CLONE)
|
||||
+ {
|
||||
+ linux_target->low_new_clone (lp, new_pid);
|
||||
+ }
|
||||
|
||||
if (event == PTRACE_EVENT_FORK
|
||||
&& linux_fork_checkpointing_p (lp->ptid.pid ()))
|
||||
diff --git a/gdb/linux-nat.h b/gdb/linux-nat.h
|
||||
--- a/gdb/linux-nat.h
|
||||
+++ b/gdb/linux-nat.h
|
||||
@@ -160,6 +160,10 @@ public:
|
||||
virtual void low_new_fork (struct lwp_info *parent, pid_t child_pid)
|
||||
{}
|
||||
|
||||
+ /* The method to call, if any, when a new clone event is detected. */
|
||||
+ virtual void low_new_clone (struct lwp_info *parent, pid_t child_lwp)
|
||||
+ {}
|
||||
+
|
||||
/* The method to call, if any, when a process is no longer
|
||||
attached. */
|
||||
virtual void low_forget_process (pid_t pid)
|
@ -0,0 +1,311 @@
|
||||
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
|
||||
From: Alan Hayward <alan.hayward@arm.com>
|
||||
Date: Wed, 7 Jul 2021 18:13:44 -0400
|
||||
Subject: gdb-rhbz1854784-powerpc-remove-region-limit-dawr-2of7.patch
|
||||
|
||||
;; Backport "Add linux_get_hwcap"
|
||||
;; (Alan Hayward, RH BZ 1854784)
|
||||
|
||||
Tidy up calls to read HWCAP (and HWCAP2) by adding common functions,
|
||||
removing the PPC and AArch64 specific versions.
|
||||
|
||||
The only function difference is in aarch64_linux_core_read_description - if
|
||||
the hwcap read fails it now return a valid description instead of nullptr.
|
||||
|
||||
gdb/ChangeLog:
|
||||
|
||||
2019-03-25 Alan Hayward <alan.hayward@arm.com>
|
||||
|
||||
* aarch64-linux-nat.c (aarch64_linux_nat_target::read_description):
|
||||
Call linux_get_hwcap.
|
||||
* aarch64-linux-tdep.c (aarch64_linux_core_read_description):
|
||||
Likewise.
|
||||
(aarch64_linux_get_hwcap): Remove function.
|
||||
* aarch64-linux-tdep.h (aarch64_linux_get_hwcap): Remove
|
||||
declaration.
|
||||
* arm-linux-nat.c (arm_linux_nat_target::read_description):Call
|
||||
linux_get_hwcap.
|
||||
* arm-linux-tdep.c (arm_linux_core_read_description): Likewise.
|
||||
* linux-tdep.c (linux_get_hwcap): Add function.
|
||||
(linux_get_hwcap2): Likewise.
|
||||
* linux-tdep.h (linux_get_hwcap): Add declaration.
|
||||
(linux_get_hwcap2): Likewise.
|
||||
* ppc-linux-nat.c (ppc_linux_get_hwcap): Remove function.
|
||||
(ppc_linux_get_hwcap2): Likewise.
|
||||
(ppc_linux_nat_target::region_ok_for_hw_watchpoint): Call
|
||||
linux_get_hwcap.
|
||||
(ppc_linux_nat_target::insert_watchpoint): Likewise.
|
||||
(ppc_linux_nat_target::watchpoint_addr_within_range): Likewise.
|
||||
(ppc_linux_nat_target::read_description): Likewise.
|
||||
* ppc-linux-tdep.c (ppc_linux_core_read_description): Likewise.
|
||||
* s390-linux-nat.c: Likewise.
|
||||
* s390-linux-tdep.c (s390_core_read_description): Likewise.
|
||||
|
||||
diff --git a/gdb/aarch64-linux-nat.c b/gdb/aarch64-linux-nat.c
|
||||
--- a/gdb/aarch64-linux-nat.c
|
||||
+++ b/gdb/aarch64-linux-nat.c
|
||||
@@ -42,6 +42,7 @@
|
||||
#include <asm/ptrace.h>
|
||||
|
||||
#include "gregset.h"
|
||||
+#include "linux-tdep.h"
|
||||
|
||||
/* Defines ps_err_e, struct ps_prochandle. */
|
||||
#include "gdb_proc_service.h"
|
||||
@@ -605,8 +606,7 @@ aarch64_linux_nat_target::read_description ()
|
||||
ret = ptrace (PTRACE_GETREGSET, tid, NT_ARM_VFP, &iovec);
|
||||
if (ret == 0)
|
||||
return tdesc_arm_with_neon;
|
||||
- else
|
||||
- return aarch64_read_description (aarch64_sve_get_vq (tid));
|
||||
+ else return aarch64_read_description (aarch64_sve_get_vq (tid));
|
||||
}
|
||||
|
||||
/* Convert a native/host siginfo object, into/from the siginfo in the
|
||||
diff --git a/gdb/aarch64-linux-tdep.c b/gdb/aarch64-linux-tdep.c
|
||||
--- a/gdb/aarch64-linux-tdep.c
|
||||
+++ b/gdb/aarch64-linux-tdep.c
|
||||
@@ -442,10 +442,7 @@ static const struct target_desc *
|
||||
aarch64_linux_core_read_description (struct gdbarch *gdbarch,
|
||||
struct target_ops *target, bfd *abfd)
|
||||
{
|
||||
- CORE_ADDR aarch64_hwcap = 0;
|
||||
-
|
||||
- if (target_auxv_search (target, AT_HWCAP, &aarch64_hwcap) != 1)
|
||||
- return NULL;
|
||||
+ CORE_ADDR hwcap = linux_get_hwcap (target);
|
||||
|
||||
return aarch64_read_description (aarch64_linux_core_read_vq (gdbarch, abfd));
|
||||
}
|
||||
diff --git a/gdb/arm-linux-nat.c b/gdb/arm-linux-nat.c
|
||||
--- a/gdb/arm-linux-nat.c
|
||||
+++ b/gdb/arm-linux-nat.c
|
||||
@@ -533,7 +533,7 @@ ps_get_thread_area (struct ps_prochandle *ph,
|
||||
const struct target_desc *
|
||||
arm_linux_nat_target::read_description ()
|
||||
{
|
||||
- CORE_ADDR arm_hwcap = 0;
|
||||
+ CORE_ADDR arm_hwcap = linux_get_hwcap (this);
|
||||
|
||||
if (have_ptrace_getregset == TRIBOOL_UNKNOWN)
|
||||
{
|
||||
@@ -551,11 +551,6 @@ arm_linux_nat_target::read_description ()
|
||||
have_ptrace_getregset = TRIBOOL_TRUE;
|
||||
}
|
||||
|
||||
- if (target_auxv_search (this, AT_HWCAP, &arm_hwcap) != 1)
|
||||
- {
|
||||
- return this->beneath ()->read_description ();
|
||||
- }
|
||||
-
|
||||
if (arm_hwcap & HWCAP_IWMMXT)
|
||||
return tdesc_arm_with_iwmmxt;
|
||||
|
||||
diff --git a/gdb/arm-linux-tdep.c b/gdb/arm-linux-tdep.c
|
||||
--- a/gdb/arm-linux-tdep.c
|
||||
+++ b/gdb/arm-linux-tdep.c
|
||||
@@ -730,10 +730,7 @@ arm_linux_core_read_description (struct gdbarch *gdbarch,
|
||||
struct target_ops *target,
|
||||
bfd *abfd)
|
||||
{
|
||||
- CORE_ADDR arm_hwcap = 0;
|
||||
-
|
||||
- if (target_auxv_search (target, AT_HWCAP, &arm_hwcap) != 1)
|
||||
- return NULL;
|
||||
+ CORE_ADDR arm_hwcap = linux_get_hwcap (target);
|
||||
|
||||
if (arm_hwcap & HWCAP_VFP)
|
||||
{
|
||||
diff --git a/gdb/linux-tdep.c b/gdb/linux-tdep.c
|
||||
--- a/gdb/linux-tdep.c
|
||||
+++ b/gdb/linux-tdep.c
|
||||
@@ -2567,6 +2567,28 @@ linux_displaced_step_location (struct gdbarch *gdbarch)
|
||||
return addr;
|
||||
}
|
||||
|
||||
+/* See linux-tdep.h. */
|
||||
+
|
||||
+CORE_ADDR
|
||||
+linux_get_hwcap (struct target_ops *target)
|
||||
+{
|
||||
+ CORE_ADDR field;
|
||||
+ if (target_auxv_search (target, AT_HWCAP, &field) != 1)
|
||||
+ return 0;
|
||||
+ return field;
|
||||
+}
|
||||
+
|
||||
+/* See linux-tdep.h. */
|
||||
+
|
||||
+CORE_ADDR
|
||||
+linux_get_hwcap2 (struct target_ops *target)
|
||||
+{
|
||||
+ CORE_ADDR field;
|
||||
+ if (target_auxv_search (target, AT_HWCAP2, &field) != 1)
|
||||
+ return 0;
|
||||
+ return field;
|
||||
+}
|
||||
+
|
||||
/* Display whether the gcore command is using the
|
||||
/proc/PID/coredump_filter file. */
|
||||
|
||||
diff --git a/gdb/linux-tdep.h b/gdb/linux-tdep.h
|
||||
--- a/gdb/linux-tdep.h
|
||||
+++ b/gdb/linux-tdep.h
|
||||
@@ -61,4 +61,12 @@ extern void linux_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch);
|
||||
|
||||
extern int linux_is_uclinux (void);
|
||||
|
||||
+/* Fetch the AT_HWCAP entry from the auxv vector for the given TARGET. On
|
||||
+ error, 0 is returned. */
|
||||
+extern CORE_ADDR linux_get_hwcap (struct target_ops *target);
|
||||
+
|
||||
+/* Fetch the AT_HWCAP2 entry from the auxv vector for the given TARGET. On
|
||||
+ error, 0 is returned. */
|
||||
+extern CORE_ADDR linux_get_hwcap2 (struct target_ops *target);
|
||||
+
|
||||
#endif /* linux-tdep.h */
|
||||
diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c
|
||||
--- a/gdb/ppc-linux-nat.c
|
||||
+++ b/gdb/ppc-linux-nat.c
|
||||
@@ -50,6 +50,7 @@
|
||||
#include "arch/ppc-linux-common.h"
|
||||
#include "arch/ppc-linux-tdesc.h"
|
||||
#include "nat/ppc-linux.h"
|
||||
+#include "linux-tdep.h"
|
||||
|
||||
/* Similarly for the hardware watchpoint support. These requests are used
|
||||
when the PowerPC HWDEBUG ptrace interface is not available. */
|
||||
@@ -1560,31 +1561,6 @@ store_ppc_registers (const struct regcache *regcache, int tid)
|
||||
function to fail most of the time, so we ignore them. */
|
||||
}
|
||||
|
||||
-/* Fetch the AT_HWCAP entry from the aux vector. */
|
||||
-static CORE_ADDR
|
||||
-ppc_linux_get_hwcap (void)
|
||||
-{
|
||||
- CORE_ADDR field;
|
||||
-
|
||||
- if (target_auxv_search (current_top_target (), AT_HWCAP, &field) != 1)
|
||||
- return 0;
|
||||
-
|
||||
- return field;
|
||||
-}
|
||||
-
|
||||
-/* Fetch the AT_HWCAP2 entry from the aux vector. */
|
||||
-
|
||||
-static CORE_ADDR
|
||||
-ppc_linux_get_hwcap2 (void)
|
||||
-{
|
||||
- CORE_ADDR field;
|
||||
-
|
||||
- if (target_auxv_search (current_top_target (), AT_HWCAP2, &field) != 1)
|
||||
- return 0;
|
||||
-
|
||||
- return field;
|
||||
-}
|
||||
-
|
||||
/* The cached DABR value, to install in new threads.
|
||||
This variable is used when the PowerPC HWDEBUG ptrace
|
||||
interface is not available. */
|
||||
@@ -1741,7 +1717,7 @@ ppc_linux_nat_target::region_ok_for_hw_watchpoint (CORE_ADDR addr, LONGEST len)
|
||||
takes two hardware watchpoints though. */
|
||||
if (len > 1
|
||||
&& hwdebug_info.features & PPC_DEBUG_FEATURE_DATA_BP_RANGE
|
||||
- && ppc_linux_get_hwcap () & PPC_FEATURE_BOOKE)
|
||||
+ && linux_get_hwcap (current_top_target ()) & PPC_FEATURE_BOOKE)
|
||||
return 2;
|
||||
/* Check if the processor provides DAWR interface. */
|
||||
if (hwdebug_info.features & PPC_DEBUG_FEATURE_DATA_BP_DAWR)
|
||||
@@ -1761,7 +1737,7 @@ ppc_linux_nat_target::region_ok_for_hw_watchpoint (CORE_ADDR addr, LONGEST len)
|
||||
ptrace interface, DAC-based processors (i.e., embedded processors) will
|
||||
use addresses aligned to 4-bytes due to the way the read/write flags are
|
||||
passed in the old ptrace interface. */
|
||||
- else if (((ppc_linux_get_hwcap () & PPC_FEATURE_BOOKE)
|
||||
+ else if (((linux_get_hwcap (current_top_target ()) & PPC_FEATURE_BOOKE)
|
||||
&& (addr + len) > (addr & ~3) + 4)
|
||||
|| (addr + len) > (addr & ~7) + 8)
|
||||
return 0;
|
||||
@@ -2303,7 +2279,7 @@ ppc_linux_nat_target::insert_watchpoint (CORE_ADDR addr, int len,
|
||||
long dabr_value;
|
||||
long read_mode, write_mode;
|
||||
|
||||
- if (ppc_linux_get_hwcap () & PPC_FEATURE_BOOKE)
|
||||
+ if (linux_get_hwcap (current_top_target ()) & PPC_FEATURE_BOOKE)
|
||||
{
|
||||
/* PowerPC 440 requires only the read/write flags to be passed
|
||||
to the kernel. */
|
||||
@@ -2506,9 +2482,9 @@ ppc_linux_nat_target::watchpoint_addr_within_range (CORE_ADDR addr,
|
||||
int mask;
|
||||
|
||||
if (have_ptrace_hwdebug_interface ()
|
||||
- && ppc_linux_get_hwcap () & PPC_FEATURE_BOOKE)
|
||||
+ && linux_get_hwcap (current_top_target ()) & PPC_FEATURE_BOOKE)
|
||||
return start <= addr && start + length >= addr;
|
||||
- else if (ppc_linux_get_hwcap () & PPC_FEATURE_BOOKE)
|
||||
+ else if (linux_get_hwcap (current_top_target ()) & PPC_FEATURE_BOOKE)
|
||||
mask = 3;
|
||||
else
|
||||
mask = 7;
|
||||
@@ -2646,8 +2622,8 @@ ppc_linux_nat_target::read_description ()
|
||||
|
||||
features.wordsize = ppc_linux_target_wordsize (tid);
|
||||
|
||||
- CORE_ADDR hwcap = ppc_linux_get_hwcap ();
|
||||
- CORE_ADDR hwcap2 = ppc_linux_get_hwcap2 ();
|
||||
+ CORE_ADDR hwcap = linux_get_hwcap (current_top_target ());
|
||||
+ CORE_ADDR hwcap2 = linux_get_hwcap2 (current_top_target ());
|
||||
|
||||
if (have_ptrace_getsetvsxregs
|
||||
&& (hwcap & PPC_FEATURE_HAS_VSX))
|
||||
diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c
|
||||
--- a/gdb/ppc-linux-tdep.c
|
||||
+++ b/gdb/ppc-linux-tdep.c
|
||||
@@ -1602,10 +1602,7 @@ ppc_linux_core_read_description (struct gdbarch *gdbarch,
|
||||
if (vsx)
|
||||
features.vsx = true;
|
||||
|
||||
- CORE_ADDR hwcap;
|
||||
-
|
||||
- if (target_auxv_search (target, AT_HWCAP, &hwcap) != 1)
|
||||
- hwcap = 0;
|
||||
+ CORE_ADDR hwcap = linux_get_hwcap (target);
|
||||
|
||||
features.isa205 = ppc_linux_has_isa205 (hwcap);
|
||||
|
||||
diff --git a/gdb/s390-linux-nat.c b/gdb/s390-linux-nat.c
|
||||
--- a/gdb/s390-linux-nat.c
|
||||
+++ b/gdb/s390-linux-nat.c
|
||||
@@ -42,6 +42,7 @@
|
||||
#include <elf.h>
|
||||
#include <algorithm>
|
||||
#include "inf-ptrace.h"
|
||||
+#include "linux-tdep.h"
|
||||
|
||||
/* Per-thread arch-specific data. */
|
||||
|
||||
@@ -1018,9 +1019,8 @@ s390_linux_nat_target::read_description ()
|
||||
that mode, report s390 architecture with 64-bit GPRs. */
|
||||
#ifdef __s390x__
|
||||
{
|
||||
- CORE_ADDR hwcap = 0;
|
||||
+ CORE_ADDR hwcap = linux_get_hwcap (current_top_target ());
|
||||
|
||||
- target_auxv_search (current_top_target (), AT_HWCAP, &hwcap);
|
||||
have_regset_tdb = (hwcap & HWCAP_S390_TE)
|
||||
&& check_regset (tid, NT_S390_TDB, s390_sizeof_tdbregset);
|
||||
|
||||
diff --git a/gdb/s390-linux-tdep.c b/gdb/s390-linux-tdep.c
|
||||
--- a/gdb/s390-linux-tdep.c
|
||||
+++ b/gdb/s390-linux-tdep.c
|
||||
@@ -332,10 +332,9 @@ s390_core_read_description (struct gdbarch *gdbarch,
|
||||
struct target_ops *target, bfd *abfd)
|
||||
{
|
||||
asection *section = bfd_get_section_by_name (abfd, ".reg");
|
||||
- CORE_ADDR hwcap = 0;
|
||||
+ CORE_ADDR hwcap = linux_get_hwcap (target);
|
||||
bool high_gprs, v1, v2, te, vx, gs;
|
||||
|
||||
- target_auxv_search (target, AT_HWCAP, &hwcap);
|
||||
if (!section)
|
||||
return NULL;
|
||||
|
@ -0,0 +1,368 @@
|
||||
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
|
||||
From: Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
|
||||
Date: Wed, 7 Jul 2021 18:45:37 -0400
|
||||
Subject: gdb-rhbz1854784-powerpc-remove-region-limit-dawr-3of7.patch
|
||||
|
||||
;; Backport "[PowerPC] Move up some register access routines"
|
||||
;; (Pedro Franco de Carvalho, RH BZ 1854784)
|
||||
|
||||
Keep the routines related to register access grouped together.
|
||||
|
||||
gdb/ChangeLog:
|
||||
2020-03-30 Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
|
||||
|
||||
* ppc-linux-nat.c (ppc_linux_nat_target::store_registers)
|
||||
(ppc_linux_nat_target::auxv_parse)
|
||||
(ppc_linux_nat_target::read_description)
|
||||
(supply_gregset, fill_gregset, supply_fpregset, fill_fpregset):
|
||||
Move up.
|
||||
|
||||
diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c
|
||||
--- a/gdb/ppc-linux-nat.c
|
||||
+++ b/gdb/ppc-linux-nat.c
|
||||
@@ -1561,6 +1561,170 @@ store_ppc_registers (const struct regcache *regcache, int tid)
|
||||
function to fail most of the time, so we ignore them. */
|
||||
}
|
||||
|
||||
+void
|
||||
+ppc_linux_nat_target::store_registers (struct regcache *regcache, int regno)
|
||||
+{
|
||||
+ pid_t tid = get_ptrace_pid (regcache->ptid ());
|
||||
+
|
||||
+ if (regno >= 0)
|
||||
+ store_register (regcache, tid, regno);
|
||||
+ else
|
||||
+ store_ppc_registers (regcache, tid);
|
||||
+}
|
||||
+
|
||||
+/* Functions for transferring registers between a gregset_t or fpregset_t
|
||||
+ (see sys/ucontext.h) and gdb's regcache. The word size is that used
|
||||
+ by the ptrace interface, not the current program's ABI. Eg. if a
|
||||
+ powerpc64-linux gdb is being used to debug a powerpc32-linux app, we
|
||||
+ read or write 64-bit gregsets. This is to suit the host libthread_db. */
|
||||
+
|
||||
+void
|
||||
+supply_gregset (struct regcache *regcache, const gdb_gregset_t *gregsetp)
|
||||
+{
|
||||
+ const struct regset *regset = ppc_linux_gregset (sizeof (long));
|
||||
+
|
||||
+ ppc_supply_gregset (regset, regcache, -1, gregsetp, sizeof (*gregsetp));
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+fill_gregset (const struct regcache *regcache,
|
||||
+ gdb_gregset_t *gregsetp, int regno)
|
||||
+{
|
||||
+ const struct regset *regset = ppc_linux_gregset (sizeof (long));
|
||||
+
|
||||
+ if (regno == -1)
|
||||
+ memset (gregsetp, 0, sizeof (*gregsetp));
|
||||
+ ppc_collect_gregset (regset, regcache, regno, gregsetp, sizeof (*gregsetp));
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+supply_fpregset (struct regcache *regcache, const gdb_fpregset_t * fpregsetp)
|
||||
+{
|
||||
+ const struct regset *regset = ppc_linux_fpregset ();
|
||||
+
|
||||
+ ppc_supply_fpregset (regset, regcache, -1,
|
||||
+ fpregsetp, sizeof (*fpregsetp));
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+fill_fpregset (const struct regcache *regcache,
|
||||
+ gdb_fpregset_t *fpregsetp, int regno)
|
||||
+{
|
||||
+ const struct regset *regset = ppc_linux_fpregset ();
|
||||
+
|
||||
+ ppc_collect_fpregset (regset, regcache, regno,
|
||||
+ fpregsetp, sizeof (*fpregsetp));
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+ppc_linux_nat_target::auxv_parse (gdb_byte **readptr,
|
||||
+ gdb_byte *endptr, CORE_ADDR *typep,
|
||||
+ CORE_ADDR *valp)
|
||||
+{
|
||||
+ int tid = inferior_ptid.lwp ();
|
||||
+ if (tid == 0)
|
||||
+ tid = inferior_ptid.pid ();
|
||||
+
|
||||
+ int sizeof_auxv_field = ppc_linux_target_wordsize (tid);
|
||||
+
|
||||
+ enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
|
||||
+ gdb_byte *ptr = *readptr;
|
||||
+
|
||||
+ if (endptr == ptr)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (endptr - ptr < sizeof_auxv_field * 2)
|
||||
+ return -1;
|
||||
+
|
||||
+ *typep = extract_unsigned_integer (ptr, sizeof_auxv_field, byte_order);
|
||||
+ ptr += sizeof_auxv_field;
|
||||
+ *valp = extract_unsigned_integer (ptr, sizeof_auxv_field, byte_order);
|
||||
+ ptr += sizeof_auxv_field;
|
||||
+
|
||||
+ *readptr = ptr;
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+const struct target_desc *
|
||||
+ppc_linux_nat_target::read_description ()
|
||||
+{
|
||||
+ int tid = inferior_ptid.lwp ();
|
||||
+ if (tid == 0)
|
||||
+ tid = inferior_ptid.pid ();
|
||||
+
|
||||
+ if (have_ptrace_getsetevrregs)
|
||||
+ {
|
||||
+ struct gdb_evrregset_t evrregset;
|
||||
+
|
||||
+ if (ptrace (PTRACE_GETEVRREGS, tid, 0, &evrregset) >= 0)
|
||||
+ return tdesc_powerpc_e500l;
|
||||
+
|
||||
+ /* EIO means that the PTRACE_GETEVRREGS request isn't supported.
|
||||
+ Anything else needs to be reported. */
|
||||
+ else if (errno != EIO)
|
||||
+ perror_with_name (_("Unable to fetch SPE registers"));
|
||||
+ }
|
||||
+
|
||||
+ struct ppc_linux_features features = ppc_linux_no_features;
|
||||
+
|
||||
+ features.wordsize = ppc_linux_target_wordsize (tid);
|
||||
+
|
||||
+ CORE_ADDR hwcap = linux_get_hwcap (current_top_target ());
|
||||
+ CORE_ADDR hwcap2 = linux_get_hwcap2 (current_top_target ());
|
||||
+
|
||||
+ if (have_ptrace_getsetvsxregs
|
||||
+ && (hwcap & PPC_FEATURE_HAS_VSX))
|
||||
+ {
|
||||
+ gdb_vsxregset_t vsxregset;
|
||||
+
|
||||
+ if (ptrace (PTRACE_GETVSXREGS, tid, 0, &vsxregset) >= 0)
|
||||
+ features.vsx = true;
|
||||
+
|
||||
+ /* EIO means that the PTRACE_GETVSXREGS request isn't supported.
|
||||
+ Anything else needs to be reported. */
|
||||
+ else if (errno != EIO)
|
||||
+ perror_with_name (_("Unable to fetch VSX registers"));
|
||||
+ }
|
||||
+
|
||||
+ if (have_ptrace_getvrregs
|
||||
+ && (hwcap & PPC_FEATURE_HAS_ALTIVEC))
|
||||
+ {
|
||||
+ gdb_vrregset_t vrregset;
|
||||
+
|
||||
+ if (ptrace (PTRACE_GETVRREGS, tid, 0, &vrregset) >= 0)
|
||||
+ features.altivec = true;
|
||||
+
|
||||
+ /* EIO means that the PTRACE_GETVRREGS request isn't supported.
|
||||
+ Anything else needs to be reported. */
|
||||
+ else if (errno != EIO)
|
||||
+ perror_with_name (_("Unable to fetch AltiVec registers"));
|
||||
+ }
|
||||
+
|
||||
+ features.isa205 = ppc_linux_has_isa205 (hwcap);
|
||||
+
|
||||
+ if ((hwcap2 & PPC_FEATURE2_DSCR)
|
||||
+ && check_regset (tid, NT_PPC_PPR, PPC_LINUX_SIZEOF_PPRREGSET)
|
||||
+ && check_regset (tid, NT_PPC_DSCR, PPC_LINUX_SIZEOF_DSCRREGSET))
|
||||
+ {
|
||||
+ features.ppr_dscr = true;
|
||||
+ if ((hwcap2 & PPC_FEATURE2_ARCH_2_07)
|
||||
+ && (hwcap2 & PPC_FEATURE2_TAR)
|
||||
+ && (hwcap2 & PPC_FEATURE2_EBB)
|
||||
+ && check_regset (tid, NT_PPC_TAR, PPC_LINUX_SIZEOF_TARREGSET)
|
||||
+ && check_regset (tid, NT_PPC_EBB, PPC_LINUX_SIZEOF_EBBREGSET)
|
||||
+ && check_regset (tid, NT_PPC_PMU, PPC_LINUX_SIZEOF_PMUREGSET))
|
||||
+ {
|
||||
+ features.isa207 = true;
|
||||
+ if ((hwcap2 & PPC_FEATURE2_HTM)
|
||||
+ && check_regset (tid, NT_PPC_TM_SPR,
|
||||
+ PPC_LINUX_SIZEOF_TM_SPRREGSET))
|
||||
+ features.htm = true;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return ppc_linux_match_description (features);
|
||||
+}
|
||||
+
|
||||
/* The cached DABR value, to install in new threads.
|
||||
This variable is used when the PowerPC HWDEBUG ptrace
|
||||
interface is not available. */
|
||||
@@ -2514,173 +2678,7 @@ ppc_linux_nat_target::masked_watch_num_registers (CORE_ADDR addr, CORE_ADDR mask
|
||||
return 2;
|
||||
}
|
||||
|
||||
-void
|
||||
-ppc_linux_nat_target::store_registers (struct regcache *regcache, int regno)
|
||||
-{
|
||||
- pid_t tid = get_ptrace_pid (regcache->ptid ());
|
||||
-
|
||||
- if (regno >= 0)
|
||||
- store_register (regcache, tid, regno);
|
||||
- else
|
||||
- store_ppc_registers (regcache, tid);
|
||||
-}
|
||||
-
|
||||
-/* Functions for transferring registers between a gregset_t or fpregset_t
|
||||
- (see sys/ucontext.h) and gdb's regcache. The word size is that used
|
||||
- by the ptrace interface, not the current program's ABI. Eg. if a
|
||||
- powerpc64-linux gdb is being used to debug a powerpc32-linux app, we
|
||||
- read or write 64-bit gregsets. This is to suit the host libthread_db. */
|
||||
-
|
||||
-void
|
||||
-supply_gregset (struct regcache *regcache, const gdb_gregset_t *gregsetp)
|
||||
-{
|
||||
- const struct regset *regset = ppc_linux_gregset (sizeof (long));
|
||||
-
|
||||
- ppc_supply_gregset (regset, regcache, -1, gregsetp, sizeof (*gregsetp));
|
||||
-}
|
||||
-
|
||||
-void
|
||||
-fill_gregset (const struct regcache *regcache,
|
||||
- gdb_gregset_t *gregsetp, int regno)
|
||||
-{
|
||||
- const struct regset *regset = ppc_linux_gregset (sizeof (long));
|
||||
-
|
||||
- if (regno == -1)
|
||||
- memset (gregsetp, 0, sizeof (*gregsetp));
|
||||
- ppc_collect_gregset (regset, regcache, regno, gregsetp, sizeof (*gregsetp));
|
||||
-}
|
||||
-
|
||||
-void
|
||||
-supply_fpregset (struct regcache *regcache, const gdb_fpregset_t * fpregsetp)
|
||||
-{
|
||||
- const struct regset *regset = ppc_linux_fpregset ();
|
||||
-
|
||||
- ppc_supply_fpregset (regset, regcache, -1,
|
||||
- fpregsetp, sizeof (*fpregsetp));
|
||||
-}
|
||||
-
|
||||
-void
|
||||
-fill_fpregset (const struct regcache *regcache,
|
||||
- gdb_fpregset_t *fpregsetp, int regno)
|
||||
-{
|
||||
- const struct regset *regset = ppc_linux_fpregset ();
|
||||
-
|
||||
- ppc_collect_fpregset (regset, regcache, regno,
|
||||
- fpregsetp, sizeof (*fpregsetp));
|
||||
-}
|
||||
-
|
||||
-int
|
||||
-ppc_linux_nat_target::auxv_parse (gdb_byte **readptr,
|
||||
- gdb_byte *endptr, CORE_ADDR *typep,
|
||||
- CORE_ADDR *valp)
|
||||
-{
|
||||
- int tid = inferior_ptid.lwp ();
|
||||
- if (tid == 0)
|
||||
- tid = inferior_ptid.pid ();
|
||||
-
|
||||
- int sizeof_auxv_field = ppc_linux_target_wordsize (tid);
|
||||
-
|
||||
- enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
|
||||
- gdb_byte *ptr = *readptr;
|
||||
-
|
||||
- if (endptr == ptr)
|
||||
- return 0;
|
||||
-
|
||||
- if (endptr - ptr < sizeof_auxv_field * 2)
|
||||
- return -1;
|
||||
-
|
||||
- *typep = extract_unsigned_integer (ptr, sizeof_auxv_field, byte_order);
|
||||
- ptr += sizeof_auxv_field;
|
||||
- *valp = extract_unsigned_integer (ptr, sizeof_auxv_field, byte_order);
|
||||
- ptr += sizeof_auxv_field;
|
||||
-
|
||||
- *readptr = ptr;
|
||||
- return 1;
|
||||
-}
|
||||
-
|
||||
-const struct target_desc *
|
||||
-ppc_linux_nat_target::read_description ()
|
||||
-{
|
||||
- int tid = inferior_ptid.lwp ();
|
||||
- if (tid == 0)
|
||||
- tid = inferior_ptid.pid ();
|
||||
-
|
||||
- if (have_ptrace_getsetevrregs)
|
||||
- {
|
||||
- struct gdb_evrregset_t evrregset;
|
||||
-
|
||||
- if (ptrace (PTRACE_GETEVRREGS, tid, 0, &evrregset) >= 0)
|
||||
- return tdesc_powerpc_e500l;
|
||||
-
|
||||
- /* EIO means that the PTRACE_GETEVRREGS request isn't supported.
|
||||
- Anything else needs to be reported. */
|
||||
- else if (errno != EIO)
|
||||
- perror_with_name (_("Unable to fetch SPE registers"));
|
||||
- }
|
||||
-
|
||||
- struct ppc_linux_features features = ppc_linux_no_features;
|
||||
-
|
||||
- features.wordsize = ppc_linux_target_wordsize (tid);
|
||||
-
|
||||
- CORE_ADDR hwcap = linux_get_hwcap (current_top_target ());
|
||||
- CORE_ADDR hwcap2 = linux_get_hwcap2 (current_top_target ());
|
||||
-
|
||||
- if (have_ptrace_getsetvsxregs
|
||||
- && (hwcap & PPC_FEATURE_HAS_VSX))
|
||||
- {
|
||||
- gdb_vsxregset_t vsxregset;
|
||||
-
|
||||
- if (ptrace (PTRACE_GETVSXREGS, tid, 0, &vsxregset) >= 0)
|
||||
- features.vsx = true;
|
||||
-
|
||||
- /* EIO means that the PTRACE_GETVSXREGS request isn't supported.
|
||||
- Anything else needs to be reported. */
|
||||
- else if (errno != EIO)
|
||||
- perror_with_name (_("Unable to fetch VSX registers"));
|
||||
- }
|
||||
-
|
||||
- if (have_ptrace_getvrregs
|
||||
- && (hwcap & PPC_FEATURE_HAS_ALTIVEC))
|
||||
- {
|
||||
- gdb_vrregset_t vrregset;
|
||||
-
|
||||
- if (ptrace (PTRACE_GETVRREGS, tid, 0, &vrregset) >= 0)
|
||||
- features.altivec = true;
|
||||
-
|
||||
- /* EIO means that the PTRACE_GETVRREGS request isn't supported.
|
||||
- Anything else needs to be reported. */
|
||||
- else if (errno != EIO)
|
||||
- perror_with_name (_("Unable to fetch AltiVec registers"));
|
||||
- }
|
||||
-
|
||||
- if (hwcap & PPC_FEATURE_CELL)
|
||||
- features.cell = true;
|
||||
-
|
||||
- features.isa205 = ppc_linux_has_isa205 (hwcap);
|
||||
-
|
||||
- if ((hwcap2 & PPC_FEATURE2_DSCR)
|
||||
- && check_regset (tid, NT_PPC_PPR, PPC_LINUX_SIZEOF_PPRREGSET)
|
||||
- && check_regset (tid, NT_PPC_DSCR, PPC_LINUX_SIZEOF_DSCRREGSET))
|
||||
- {
|
||||
- features.ppr_dscr = true;
|
||||
- if ((hwcap2 & PPC_FEATURE2_ARCH_2_07)
|
||||
- && (hwcap2 & PPC_FEATURE2_TAR)
|
||||
- && (hwcap2 & PPC_FEATURE2_EBB)
|
||||
- && check_regset (tid, NT_PPC_TAR, PPC_LINUX_SIZEOF_TARREGSET)
|
||||
- && check_regset (tid, NT_PPC_EBB, PPC_LINUX_SIZEOF_EBBREGSET)
|
||||
- && check_regset (tid, NT_PPC_PMU, PPC_LINUX_SIZEOF_PMUREGSET))
|
||||
- {
|
||||
- features.isa207 = true;
|
||||
- if ((hwcap2 & PPC_FEATURE2_HTM)
|
||||
- && check_regset (tid, NT_PPC_TM_SPR,
|
||||
- PPC_LINUX_SIZEOF_TM_SPRREGSET))
|
||||
- features.htm = true;
|
||||
- }
|
||||
- }
|
||||
-
|
||||
- return ppc_linux_match_description (features);
|
||||
-}
|
||||
-
|
||||
+void _initialize_ppc_linux_nat ();
|
||||
void
|
||||
_initialize_ppc_linux_nat (void)
|
||||
{
|
2312
SOURCES/gdb-rhbz1854784-powerpc-remove-region-limit-dawr-4of7.patch
Normal file
2312
SOURCES/gdb-rhbz1854784-powerpc-remove-region-limit-dawr-4of7.patch
Normal file
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,58 @@
|
||||
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
|
||||
From: Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
|
||||
Date: Wed, 7 Jul 2021 19:03:16 -0400
|
||||
Subject: gdb-rhbz1854784-powerpc-remove-region-limit-dawr-5of7.patch
|
||||
|
||||
;; Backport "[PowerPC] Use < 0 and >= 0 for watchpoint ptrace calls"
|
||||
;; (Pedro Franco de Carvalho, RH BZ 1854784)
|
||||
|
||||
In commit 227c0bf4b3dd0cf65dceb58e729e9da81b38b5a7, which fixed some
|
||||
watchpoint bugs, I compared the return value of some ptrace calls with ==
|
||||
-1 and != -1. Althought this should be correct, since the rest of the
|
||||
file uses < 0 and >= 0, I have modified this for consistency.
|
||||
|
||||
gdb/ChangeLog:
|
||||
|
||||
* ppc-linux-nat.c (ppc_linux_dreg_interface::detect)
|
||||
(ppc_linux_nat_target::low_prepare_to_resume): Use ptrace () < 0
|
||||
and >= to check return value instead of == -1 and != -1.
|
||||
|
||||
diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c
|
||||
--- a/gdb/ppc-linux-nat.c
|
||||
+++ b/gdb/ppc-linux-nat.c
|
||||
@@ -385,7 +385,7 @@ public:
|
||||
bool no_features = false;
|
||||
|
||||
if (ptrace (PPC_PTRACE_GETHWDBGINFO, ptid.lwp (), 0, &m_hwdebug_info)
|
||||
- != -1)
|
||||
+ >= 0)
|
||||
{
|
||||
/* If there are no advertised features, we don't use the
|
||||
HWDEBUG interface and try the DEBUGREG interface instead.
|
||||
@@ -431,7 +431,7 @@ public:
|
||||
{
|
||||
unsigned long wp;
|
||||
|
||||
- if (ptrace (PTRACE_GET_DEBUGREG, ptid.lwp (), 0, &wp) != -1)
|
||||
+ if (ptrace (PTRACE_GET_DEBUGREG, ptid.lwp (), 0, &wp) >= 0)
|
||||
{
|
||||
m_interface.emplace (DEBUGREG);
|
||||
return;
|
||||
@@ -2880,7 +2880,7 @@ ppc_linux_nat_target::low_prepare_to_resume (struct lwp_info *lp)
|
||||
the debug register state when fork and clone events are
|
||||
detected. */
|
||||
if (ptrace (PPC_PTRACE_DELHWDEBUG, lp->ptid.lwp (), 0,
|
||||
- bp_it->first) == -1)
|
||||
+ bp_it->first) < 0)
|
||||
if (errno != ENOENT)
|
||||
perror_with_name (_("Error deleting hardware "
|
||||
"breakpoint or watchpoint"));
|
||||
@@ -2934,7 +2934,7 @@ ppc_linux_nat_target::low_prepare_to_resume (struct lwp_info *lp)
|
||||
long ret = ptrace (PTRACE_SET_DEBUGREG, lp->ptid.lwp (),
|
||||
0, wp);
|
||||
|
||||
- if (ret == -1)
|
||||
+ if (ret < 0)
|
||||
perror_with_name (_("Error setting hardware watchpoint"));
|
||||
}
|
||||
|
@ -0,0 +1,86 @@
|
||||
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
|
||||
From: Pedro Franco de Carvalho <pedromfc@linux.ibm.com>
|
||||
Date: Wed, 7 Jul 2021 19:05:04 -0400
|
||||
Subject: gdb-rhbz1854784-powerpc-remove-region-limit-dawr-6of7.patch
|
||||
|
||||
;; Backport "[PowerPC] Always clear watchpoint with PTRACE_SET_DEBUGREG"
|
||||
;; (Pedro Franco de Carvalho, RH BZ 1854784)
|
||||
|
||||
This patches changes low_prepare_to_resume in the ppc linux native target
|
||||
to always clear the watchpoint when the old PTRACE_SET_DEBUGREG interface
|
||||
is used, even if another watchpoint GDB requested to the target is
|
||||
written right after using the same call.
|
||||
|
||||
The reason for this is that there were some older kernel versions for
|
||||
which overwriting a watchpoint with PTRACE_SET_DEBUGREG would not
|
||||
re-activate the watchpoint if it was previouly disabled following a hit.
|
||||
This happened when the kernel was configured with CONFIG_HW_BREAKPOINT on
|
||||
and uses perf events to install watchpoints.
|
||||
|
||||
Previously, the ppc linux native target would immediately remove or
|
||||
insert watchpoints following a request from the upper layers. This was
|
||||
changed in commit 227c0bf4b3dd0cf65dceb58e729e9da81b38b5a7 to fix other
|
||||
issues, which caused watchpoint requests to be applied to the inferior
|
||||
only in low_prepare_to_resume, right before the inferior is resumed.
|
||||
|
||||
Usually, but maybe not always, after a hit, GDB will remove the
|
||||
watchpoint, resume the inferior for a single-step, possibly report the
|
||||
watchpoint hit to the user, and then re-insert the watchpoint before the
|
||||
inferior is next resumed. In this case there would be no problems, but
|
||||
since I can't guarantee that there aren't other paths in GDB that allow
|
||||
the user to set a new watchpoint after the first one hit, and after its
|
||||
deletion by GDB, but before the inferior is resumed, there is a chance
|
||||
that PTRACE_SET_DEBUGREG could be called directly without the watchpoint
|
||||
first having been cleared, which could cause a false negative with the
|
||||
older kernel versions.
|
||||
|
||||
This issue would affect kernel versions starting from this commit:
|
||||
|
||||
5aae8a53708025d4e718f0d2e7c2f766779ddc71
|
||||
|
||||
Up to the fix in this commit:
|
||||
|
||||
a53fd61ac2f411745471c1c877d5e072fbbf0e5c
|
||||
|
||||
gdb/ChangeLog:
|
||||
|
||||
PR breakpoints/26385
|
||||
* ppc-linux-nat.c (ppc_linux_nat_target::low_prepare_to_resume):
|
||||
Always clear watchpoint with PTRACE_SET_DEBUGREG.
|
||||
|
||||
diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c
|
||||
--- a/gdb/ppc-linux-nat.c
|
||||
+++ b/gdb/ppc-linux-nat.c
|
||||
@@ -2922,20 +2922,23 @@ ppc_linux_nat_target::low_prepare_to_resume (struct lwp_info *lp)
|
||||
{
|
||||
gdb_assert (m_dreg_interface.debugreg_p ());
|
||||
|
||||
- /* Passing 0 to PTRACE_SET_DEBUGREG will clear the
|
||||
- watchpoint. */
|
||||
- long wp = 0;
|
||||
+ /* Passing 0 to PTRACE_SET_DEBUGREG will clear the watchpoint. We
|
||||
+ always clear the watchpoint instead of just overwriting it, in
|
||||
+ case there is a request for a new watchpoint, because on some
|
||||
+ older kernel versions and configurations simply overwriting the
|
||||
+ watchpoint after it was hit would not re-enable it. */
|
||||
+ if (ptrace (PTRACE_SET_DEBUGREG, lp->ptid.lwp (), 0, 0) < 0)
|
||||
+ perror_with_name (_("Error clearing hardware watchpoint"));
|
||||
|
||||
/* GDB requested a watchpoint to be installed. */
|
||||
if (process_it != m_process_info.end ()
|
||||
&& process_it->second.requested_wp_val.has_value ())
|
||||
- wp = *(process_it->second.requested_wp_val);
|
||||
-
|
||||
- long ret = ptrace (PTRACE_SET_DEBUGREG, lp->ptid.lwp (),
|
||||
- 0, wp);
|
||||
+ {
|
||||
+ long wp = *(process_it->second.requested_wp_val);
|
||||
|
||||
- if (ret < 0)
|
||||
- perror_with_name (_("Error setting hardware watchpoint"));
|
||||
+ if (ptrace (PTRACE_SET_DEBUGREG, lp->ptid.lwp (), 0, wp) < 0)
|
||||
+ perror_with_name (_("Error setting hardware watchpoint"));
|
||||
+ }
|
||||
}
|
||||
|
||||
lp_arch_info->debug_regs_stale = false;
|
@ -0,0 +1,73 @@
|
||||
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
|
||||
From: Rogerio Alves <rcardoso@linux.ibm.com>
|
||||
Date: Wed, 7 Jul 2021 19:06:52 -0400
|
||||
Subject: gdb-rhbz1854784-powerpc-remove-region-limit-dawr-7of7.patch
|
||||
|
||||
;; Backport "PowerPC remove 512 bytes region limit if 2nd DAWR is available."
|
||||
;; (Rogerio Alves, RH BZ 1854784)
|
||||
|
||||
Power 10 introduces the 2nd DAWR (second watchpoint) and also removed
|
||||
a restriction that limit the watch region to 512 bytes.
|
||||
|
||||
2020-11-08 Rogerio A. Cardoso <rcardoso@linux.ibm.com>
|
||||
|
||||
/gdb
|
||||
|
||||
* ppc-linux-nat.c: (PPC_DEBUG_FEATURE_DATA_BP_ARCH_31): New define.
|
||||
(region_ok_for_hw_watchpoint): Check if 2nd DAWR is avaliable before
|
||||
set region.
|
||||
|
||||
diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c
|
||||
--- a/gdb/ppc-linux-nat.c
|
||||
+++ b/gdb/ppc-linux-nat.c
|
||||
@@ -144,6 +144,11 @@ struct ppc_hw_breakpoint
|
||||
#define PPC_DEBUG_FEATURE_DATA_BP_DAWR 0x10
|
||||
#endif /* PPC_DEBUG_FEATURE_DATA_BP_DAWR */
|
||||
|
||||
+/* Feature defined on Linux kernel v5.1: Second watchpoint support. */
|
||||
+#ifndef PPC_DEBUG_FEATURE_DATA_BP_ARCH_31
|
||||
+#define PPC_DEBUG_FEATURE_DATA_BP_ARCH_31 0x20
|
||||
+#endif /* PPC_DEBUG_FEATURE_DATA_BP_ARCH_31 */
|
||||
+
|
||||
/* The version of the PowerPC HWDEBUG kernel interface that we will use, if
|
||||
available. */
|
||||
#define PPC_DEBUG_CURRENT_VERSION 1
|
||||
@@ -2121,9 +2126,10 @@ ppc_linux_nat_target::region_ok_for_hw_watchpoint (CORE_ADDR addr, int len)
|
||||
watchpoints. */
|
||||
if (m_dreg_interface.hwdebug_p ())
|
||||
{
|
||||
- int region_size;
|
||||
const struct ppc_debug_info &hwdebug_info = (m_dreg_interface
|
||||
.hwdebug_info ());
|
||||
+ int region_size = hwdebug_info.data_bp_alignment;
|
||||
+ int region_align = region_size;
|
||||
|
||||
/* Embedded DAC-based processors, like the PowerPC 440 have ranged
|
||||
watchpoints and can watch any access within an arbitrary memory
|
||||
@@ -2135,15 +2141,19 @@ ppc_linux_nat_target::region_ok_for_hw_watchpoint (CORE_ADDR addr, int len)
|
||||
return 2;
|
||||
/* Check if the processor provides DAWR interface. */
|
||||
if (hwdebug_info.features & PPC_DEBUG_FEATURE_DATA_BP_DAWR)
|
||||
- /* DAWR interface allows to watch up to 512 byte wide ranges which
|
||||
- can't cross a 512 byte boundary. */
|
||||
- region_size = 512;
|
||||
- else
|
||||
- region_size = hwdebug_info.data_bp_alignment;
|
||||
+ {
|
||||
+ /* DAWR interface allows to watch up to 512 byte wide ranges. */
|
||||
+ region_size = 512;
|
||||
+ /* DAWR interface allows to watch up to 512 byte wide ranges which
|
||||
+ can't cross a 512 byte bondary on machines that doesn't have a
|
||||
+ second DAWR (P9 or less). */
|
||||
+ if (!(hwdebug_info.features & PPC_DEBUG_FEATURE_DATA_BP_ARCH_31))
|
||||
+ region_align = 512;
|
||||
+ }
|
||||
/* Server processors provide one hardware watchpoint and addr+len should
|
||||
fall in the watchable region provided by the ptrace interface. */
|
||||
- if (region_size
|
||||
- && (addr + len > (addr & ~(region_size - 1)) + region_size))
|
||||
+ if (region_align
|
||||
+ && (addr + len > (addr & ~(region_align - 1)) + region_size))
|
||||
return 0;
|
||||
}
|
||||
/* addr+len must fall in the 8 byte watchable region for DABR-based
|
206
SOURCES/gdb-rhbz1934673-fortran-nameless-modules.patch
Normal file
206
SOURCES/gdb-rhbz1934673-fortran-nameless-modules.patch
Normal file
@ -0,0 +1,206 @@
|
||||
From FEDORA_PATCHES Mon Sep 17 00:00:00 2001
|
||||
From: Keith Seitz <keiths@redhat.com>
|
||||
Date: Wed, 5 May 2021 13:57:13 -0700
|
||||
Subject: gdb-rhbz1934673-fortran-nameless-modules.patch
|
||||
|
||||
;; Fix segfault with nameless fortran modules.
|
||||
;; Bernhard Heckel, RH BZ 1943673
|
||||
|
||||
Dwarf: Don't add nameless modules to partial symbol table
|
||||
|
||||
A name for BLOCK DATA in Fortran is optional. If no name has been
|
||||
assigned, GDB crashes during read-in of DWARF when BLOCK DATA is
|
||||
represented via DW_TAG_module. BLOCK DATA is used for one-time
|
||||
initialization of non-pointer variables in named common blocks.
|
||||
|
||||
As of now there is no issue when gfortran is used as DW_TAG_module is
|
||||
not emitted. However, with Intel ifort the nameless DW_TAG_module is
|
||||
present and has the following form:
|
||||
|
||||
...
|
||||
<1><dd>: Abbrev Number: 7 (DW_TAG_module)
|
||||
<de> DW_AT_decl_line : 46
|
||||
<df> DW_AT_decl_file : 1
|
||||
<e0> DW_AT_description : (indirect string, offset: 0x110): block
|
||||
data
|
||||
<e4> DW_AT_high_pc : 0x402bb7
|
||||
<ec> DW_AT_low_pc : 0x402bb7
|
||||
...
|
||||
|
||||
The missing name leads to a crash in add_partial_symbol, during length
|
||||
calculation.
|
||||
|
||||
gdb/ChangeLog:
|
||||
2019-06-11 Bernhard Heckel <bernhard.heckel@intel.com>
|
||||
|
||||
* dwarf2read.c (add_partial_symbol): Skip nameless modules.
|
||||
|
||||
gdb/testsuite/Changelog:
|
||||
2019-06-11 Bernhard Heckel <bernhard.heckel@intel.com>
|
||||
|
||||
* gdb.fortran/block-data.f: New.
|
||||
* gdb.fortran/block-data.exp: New.
|
||||
|
||||
diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c
|
||||
--- a/gdb/dwarf2read.c
|
||||
+++ b/gdb/dwarf2read.c
|
||||
@@ -8936,11 +8936,15 @@ add_partial_symbol (struct partial_die_info *pdi, struct dwarf2_cu *cu)
|
||||
0, cu->language, objfile);
|
||||
break;
|
||||
case DW_TAG_module:
|
||||
- add_psymbol_to_list (actual_name, strlen (actual_name),
|
||||
- built_actual_name != NULL,
|
||||
- MODULE_DOMAIN, LOC_TYPEDEF,
|
||||
- &objfile->global_psymbols,
|
||||
- 0, cu->language, objfile);
|
||||
+ /* With Fortran 77 there might be a "BLOCK DATA" module
|
||||
+ available without any name. If so, we skip the module as it
|
||||
+ doesn't bring any value. */
|
||||
+ if (actual_name != nullptr)
|
||||
+ add_psymbol_to_list (actual_name, strlen (actual_name),
|
||||
+ built_actual_name != NULL,
|
||||
+ MODULE_DOMAIN, LOC_TYPEDEF,
|
||||
+ &objfile->global_psymbols,
|
||||
+ 0, cu->language, objfile);
|
||||
break;
|
||||
case DW_TAG_class_type:
|
||||
case DW_TAG_interface_type:
|
||||
@@ -16777,9 +16781,6 @@ read_module_type (struct die_info *die, struct dwarf2_cu *cu)
|
||||
struct type *type;
|
||||
|
||||
module_name = dwarf2_name (die, cu);
|
||||
- if (!module_name)
|
||||
- complaint (_("DW_TAG_module has no name, offset %s"),
|
||||
- sect_offset_str (die->sect_off));
|
||||
type = init_type (objfile, TYPE_CODE_MODULE, 0, module_name);
|
||||
|
||||
return set_die_type (die, type, cu);
|
||||
diff --git a/gdb/testsuite/gdb.fortran/block-data.exp b/gdb/testsuite/gdb.fortran/block-data.exp
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.fortran/block-data.exp
|
||||
@@ -0,0 +1,63 @@
|
||||
+# Copyright 2016-2019 Free Software Foundation, Inc.
|
||||
+#
|
||||
+# This program is free software; you can redistribute it and/or modify
|
||||
+# it under the terms of the GNU General Public License as published by
|
||||
+# the Free Software Foundation; either version 3 of the License, or
|
||||
+# (at your option) any later version.
|
||||
+#
|
||||
+# This program is distributed in the hope that it will be useful,
|
||||
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+# GNU General Public License for more details.
|
||||
+#
|
||||
+# You should have received a copy of the GNU General Public License
|
||||
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
+
|
||||
+# Test anonymous block-data statements.
|
||||
+
|
||||
+# A name for BLOCK DATA in Fortran is optional. BLOCK DATA is used
|
||||
+# for one-time initialization of non-pointer variables in named common
|
||||
+# blocks. GDB used to crash with 'Intel ifort'-generated code, which
|
||||
+# outputs nameless DW_TAG_module, unlike with gfortran which just
|
||||
+# doesn't emit DW_TAG_module in this case.
|
||||
+
|
||||
+if { [skip_fortran_tests] } { return -1 }
|
||||
+
|
||||
+standard_testfile .f
|
||||
+load_lib "fortran.exp"
|
||||
+
|
||||
+if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug f90}]} {
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+if ![runto MAIN__] then {
|
||||
+ untested "couldn't run to breakpoint MAIN__"
|
||||
+ return -1
|
||||
+}
|
||||
+
|
||||
+with_test_prefix "default values" {
|
||||
+ gdb_test "print doub1" "= 1\.11\\d+"
|
||||
+ gdb_test "print doub2" "= 2\.22\\d+"
|
||||
+ gdb_test "print char1" "= 'abcdef'"
|
||||
+ gdb_test "print char2" "= 'ghijkl'"
|
||||
+}
|
||||
+
|
||||
+gdb_breakpoint [gdb_get_line_number "! BP_BEFORE_SUB"]
|
||||
+gdb_continue_to_breakpoint "! BP_BEFORE_SUB" ".*! BP_BEFORE_SUB.*"
|
||||
+
|
||||
+with_test_prefix "before sub" {
|
||||
+ gdb_test "print doub1" "= 11\.11\\d+"
|
||||
+ gdb_test "print doub2" "= 22\.22\\d+"
|
||||
+ gdb_test "print char1" "= 'ABCDEF'"
|
||||
+ gdb_test "print char2" "= 'GHIJKL'"
|
||||
+}
|
||||
+
|
||||
+gdb_breakpoint [gdb_get_line_number "! BP_SUB"]
|
||||
+gdb_continue_to_breakpoint "! BP_SUB" ".*! BP_SUB.*"
|
||||
+
|
||||
+with_test_prefix "in sub" {
|
||||
+ gdb_test "print doub1" "= 11\.11\\d+"
|
||||
+ gdb_test "print doub2" "= 22\.22\\d+"
|
||||
+ gdb_test "print char1" "= 'ABCDEF'"
|
||||
+ gdb_test "print char2" "= 'GHIJKL'"
|
||||
+}
|
||||
diff --git a/gdb/testsuite/gdb.fortran/block-data.f b/gdb/testsuite/gdb.fortran/block-data.f
|
||||
new file mode 100644
|
||||
--- /dev/null
|
||||
+++ b/gdb/testsuite/gdb.fortran/block-data.f
|
||||
@@ -0,0 +1,56 @@
|
||||
+! Copyright 2016-2019 Free Software Foundation, Inc.
|
||||
+!
|
||||
+! This program is free software; you can redistribute it and/or modify
|
||||
+! it under the terms of the GNU General Public License as published by
|
||||
+! the Free Software Foundation; either version 3 of the License, or
|
||||
+! (at your option) any later version.
|
||||
+!
|
||||
+! This program is distributed in the hope that it will be useful,
|
||||
+! but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+! GNU General Public License for more details.
|
||||
+!
|
||||
+! You should have received a copy of the GNU General Public License
|
||||
+! along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
+!
|
||||
+! Check that GDB can handle block data with no global name.
|
||||
+!
|
||||
+! MAIN
|
||||
+ PROGRAM bdata
|
||||
+ DOUBLE PRECISION doub1, doub2
|
||||
+ CHARACTER*6 char1, char2
|
||||
+
|
||||
+ COMMON /BLK1/ doub1, char1
|
||||
+ COMMON /BLK2/ doub2, char2
|
||||
+
|
||||
+ doub1 = 11.111
|
||||
+ doub2 = 22.222
|
||||
+ char1 = 'ABCDEF'
|
||||
+ char2 = 'GHIJKL'
|
||||
+ CALL sub_block_data ! BP_BEFORE_SUB
|
||||
+ STOP
|
||||
+ END
|
||||
+
|
||||
+! BLOCK DATA
|
||||
+ BLOCK DATA
|
||||
+
|
||||
+ DOUBLE PRECISION doub1, doub2
|
||||
+ CHARACTER*6 char1, char2
|
||||
+
|
||||
+ COMMON /BLK1/ doub1, char1
|
||||
+ COMMON /BLK2/ doub2, char2
|
||||
+ DATA doub1, doub2 /1.111, 2.222/
|
||||
+ DATA char1, char2 /'abcdef', 'ghijkl'/
|
||||
+ END
|
||||
+
|
||||
+! SUBROUTINE
|
||||
+ SUBROUTINE sub_block_data
|
||||
+
|
||||
+ DOUBLE PRECISION doub1, doub2
|
||||
+ CHARACTER*6 char1, char2
|
||||
+
|
||||
+ COMMON /BLK1/ doub1, char1
|
||||
+ COMMON /BLK2/ doub2, char2
|
||||
+
|
||||
+ char1 = char2; ! BP_SUB
|
||||
+ END
|
@ -26,7 +26,7 @@ Version: 8.2
|
||||
|
||||
# The release always contains a leading reserved number, start it at 1.
|
||||
# `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing.
|
||||
Release: 15%{?dist}
|
||||
Release: 16%{?dist}
|
||||
|
||||
License: GPLv3+ and GPLv3+ with exceptions and GPLv2+ and GPLv2+ with exceptions and GPL+ and LGPLv2+ and LGPLv3+ and BSD and Public Domain and GFDL
|
||||
Group: Development/Debuggers
|
||||
@ -1062,6 +1062,13 @@ fi
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
* Wed Jul 14 2021 Keith Seitz <keiths@redhat.com> - 8.2-16.el8
|
||||
- Backport "Fix segfault with nameless fortran modules."
|
||||
(Bernhard Heckel, RH BZ 1934673)
|
||||
- Backport "PowerPC remove 512 bytes region limit if 2nd DAWR is available"
|
||||
and related patches.
|
||||
(Rogerio Alves et al RH BZ 1854784)
|
||||
|
||||
* Fri Dec 11 2020 Keith Seitz <keiths@redhat.com> - 8.2-15.el8
|
||||
- Backport "Correct recording of 'store on condition' insns"
|
||||
(Andreas Arnaz, RH BZ 1903374)
|
||||
|
Loading…
Reference in New Issue
Block a user