public inbox for git-commits@fedoraproject.org
help / color / mirror / Atom feed
* [rpms/gdb] gdb-17.2-rebase-f44: [aarch64] Fix signal frame unwinding (BZ 1086894, upstream).
@ 2026-06-27 23:56 Jan Kratochvil
0 siblings, 0 replies; only message in thread
From: Jan Kratochvil @ 2026-06-27 23:56 UTC (permalink / raw)
To: git-commits
A new commit has been pushed.
Repo : rpms/gdb
Branch : gdb-17.2-rebase-f44
Commit : c70b5a54fd3fd9623e466ec61979a1f3bd8b2679
Author : Jan Kratochvil <jan.kratochvil@redhat.com>
Date : 2014-05-30T22:57:40+02:00
Stats : +269/-1 in 2 file(s)
URL : https://src.fedoraproject.org/rpms/gdb/c/c70b5a54fd3fd9623e466ec61979a1f3bd8b2679?branch=gdb-17.2-rebase-f44
Log:
[aarch64] Fix signal frame unwinding (BZ 1086894, upstream).
---
diff --git a/gdb-upstream.patch b/gdb-upstream.patch
index 6d82704..538fe35 100644
--- a/gdb-upstream.patch
+++ b/gdb-upstream.patch
@@ -102,3 +102,268 @@ Date: Tue May 13 14:55:53 2014 +0200
}
}
+
+
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1086894
+commit f2205de0080d999c9b67872c9db471c31b53e378
+Author: Hui Zhu <teawater@gmail.com>
+Date: Tue May 20 13:19:06 2014 +0800
+
+ Fix issue #15778: GDB Aarch64 signal frame unwinder issue
+
+ The root cause of this issue is unwinder of "#3 <signal handler called>"
+ doesn't supply right values of registers.
+ When GDB want to get the previous frame of "#3 <signal handler called>",
+ it will call cache init function of unwinder "aarch64_linux_sigframe_init".
+ The address or the value of the registers is get from this function.
+ So the bug is inside thie function.
+
+ I check the asm code of "#3 <signal handler called>":
+ (gdb) frame 3
+ (gdb) p $pc
+ $1 = (void (*)()) 0x7f931fa4d0
+ (gdb) disassemble $pc, +10
+ Dump of assembler code from 0x7f931fa4d0 to 0x7f931fa4da:
+ => 0x0000007f931fa4d0: mov x8, #0x8b // #139
+ 0x0000007f931fa4d4: svc #0x0
+ 0x0000007f931fa4d8: nop
+
+ This is the syscall sys_rt_sigreturn, Linux kernel function "restore_sigframe"
+ will set the frame:
+ for (i = 0; i < 31; i++)
+ __get_user_error(regs->regs[i], &sf->uc.uc_mcontext.regs[i],
+ err);
+ __get_user_error(regs->sp, &sf->uc.uc_mcontext.sp, err);
+ __get_user_error(regs->pc, &sf->uc.uc_mcontext.pc, err);
+ The struct of uc_mcontext is:
+ struct sigcontext {
+ __u64 fault_address;
+ /* AArch64 registers */
+ __u64 regs[31];
+ __u64 sp;
+ __u64 pc;
+ __u64 pstate;
+ /* 4K reserved for FP/SIMD state and future expansion */
+ __u8 __reserved[4096] __attribute__((__aligned__(16)));
+ };
+
+ But in GDB function "aarch64_linux_sigframe_init", the code the get address
+ of registers is:
+ for (i = 0; i < 31; i++)
+ {
+ trad_frame_set_reg_addr (this_cache,
+ AARCH64_X0_REGNUM + i,
+ sigcontext_addr + AARCH64_SIGCONTEXT_XO_OFFSET
+ + i * AARCH64_SIGCONTEXT_REG_SIZE);
+ }
+
+ trad_frame_set_reg_addr (this_cache, AARCH64_FP_REGNUM, fp);
+ trad_frame_set_reg_addr (this_cache, AARCH64_LR_REGNUM, fp + 8);
+ trad_frame_set_reg_addr (this_cache, AARCH64_PC_REGNUM, fp + 8);
+
+ The code that get pc and sp is not right, so I change the code according
+ to Linux kernel code:
+ trad_frame_set_reg_addr (this_cache, AARCH64_SP_REGNUM,
+ sigcontext_addr + AARCH64_SIGCONTEXT_XO_OFFSET
+ + 31 * AARCH64_SIGCONTEXT_REG_SIZE);
+ trad_frame_set_reg_addr (this_cache, AARCH64_PC_REGNUM,
+ sigcontext_addr + AARCH64_SIGCONTEXT_XO_OFFSET
+ + 32 * AARCH64_SIGCONTEXT_REG_SIZE);
+
+ The issue was fixed by this change, and I did the regression test. It
+ also fixed a lot of other XFAIL and FAIL.
+
+ 2014-05-20 Hui Zhu <hui@codesourcery.com>
+ Yao Qi <yao@codesourcery.com>
+
+ PR backtrace/16558
+ * aarch64-linux-tdep.c (aarch64_linux_sigframe_init): Update comments
+ and change address of sp and pc.
+
+### a/gdb/ChangeLog
+### b/gdb/ChangeLog
+## -1,3 +1,10 @@
++2014-05-20 Hui Zhu <hui@codesourcery.com>
++ Yao Qi <yao@codesourcery.com>
++
++ PR backtrace/16558
++ * aarch64-linux-tdep.c (aarch64_linux_sigframe_init): Update comments
++ and change address of sp and pc.
++
+ 2014-05-19 Tom Tromey <tromey@redhat.com>
+
+ * gdbtypes.c (rank_function): Use XNEWVEC.
+--- a/gdb/aarch64-linux-tdep.c
++++ b/gdb/aarch64-linux-tdep.c
+@@ -53,28 +53,30 @@
+
+ /* Signal frame handling.
+
+- +----------+ ^
+- | saved lr | |
+- +->| saved fp |--+
+- | | |
+- | | |
+- | +----------+
+- | | saved lr |
+- +--| saved fp |
+- ^ | |
+- | | |
+- | +----------+
+- ^ | |
+- | | signal |
+- | | |
+- | | saved lr |-->interrupted_function_pc
+- +--| saved fp |
+- | +----------+
+- | | saved lr |--> default_restorer (movz x8, NR_sys_rt_sigreturn; svc 0)
+- +--| saved fp |<- FP
+- | |
+- | |<- SP
+- +----------+
++ +------------+ ^
++ | saved lr | |
++ +->| saved fp |--+
++ | | |
++ | | |
++ | +------------+
++ | | saved lr |
++ +--| saved fp |
++ ^ | |
++ | | |
++ | +------------+
++ ^ | |
++ | | signal |
++ | | | SIGTRAMP_FRAME (struct rt_sigframe)
++ | | saved regs |
++ +--| saved sp |--> interrupted_sp
++ | | saved pc |--> interrupted_pc
++ | | |
++ | +------------+
++ | | saved lr |--> default_restorer (movz x8, NR_sys_rt_sigreturn; svc 0)
++ +--| saved fp |<- FP
++ | | NORMAL_FRAME
++ | |<- SP
++ +------------+
+
+ On signal delivery, the kernel will create a signal handler stack
+ frame and setup the return address in LR to point at restorer stub.
+@@ -123,6 +125,8 @@
+ d28015a8 movz x8, #0xad
+ d4000001 svc #0x0
+
++ This is a system call sys_rt_sigreturn.
++
+ We detect signal frames by snooping the return code for the restorer
+ instruction sequence.
+
+@@ -146,7 +150,6 @@ aarch64_linux_sigframe_init (const struct tramp_frame *self,
+ {
+ struct gdbarch *gdbarch = get_frame_arch (this_frame);
+ CORE_ADDR sp = get_frame_register_unsigned (this_frame, AARCH64_SP_REGNUM);
+- CORE_ADDR fp = get_frame_register_unsigned (this_frame, AARCH64_FP_REGNUM);
+ CORE_ADDR sigcontext_addr =
+ sp
+ + AARCH64_RT_SIGFRAME_UCONTEXT_OFFSET
+@@ -160,12 +163,14 @@ aarch64_linux_sigframe_init (const struct tramp_frame *self,
+ sigcontext_addr + AARCH64_SIGCONTEXT_XO_OFFSET
+ + i * AARCH64_SIGCONTEXT_REG_SIZE);
+ }
+-
+- trad_frame_set_reg_addr (this_cache, AARCH64_FP_REGNUM, fp);
+- trad_frame_set_reg_addr (this_cache, AARCH64_LR_REGNUM, fp + 8);
+- trad_frame_set_reg_addr (this_cache, AARCH64_PC_REGNUM, fp + 8);
+-
+- trad_frame_set_id (this_cache, frame_id_build (fp, func));
++ trad_frame_set_reg_addr (this_cache, AARCH64_SP_REGNUM,
++ sigcontext_addr + AARCH64_SIGCONTEXT_XO_OFFSET
++ + 31 * AARCH64_SIGCONTEXT_REG_SIZE);
++ trad_frame_set_reg_addr (this_cache, AARCH64_PC_REGNUM,
++ sigcontext_addr + AARCH64_SIGCONTEXT_XO_OFFSET
++ + 32 * AARCH64_SIGCONTEXT_REG_SIZE);
++
++ trad_frame_set_id (this_cache, frame_id_build (sp, func));
+ }
+
+ static const struct tramp_frame aarch64_linux_rt_sigframe =
+
+
+
+Bug 1102624 - latest gdb -15 build is FTBFS on aarch64
+https://bugzilla.redhat.com/show_bug.cgi?id=1102624
+commit 036cd38182bde32d8297b630cd5c861d53b8949e
+Author: Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
+Date: Thu May 22 16:07:20 2014 +0100
+
+ Include asm/ptrace.h in aarch64-linux-nat.c
+
+ A recent change to glibc removed asm/ptrace.h from user.h for
+ AArch64. This meant that cross-native builds of gdb using trunk
+ glibc broke because aarch64-linux-nat.c because user_hwdebug_state
+ couldn't be found.
+
+ Fixed by including asm/ptrace.h like other ports.
+
+ 2014-05-22 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
+
+ * aarch64-linux-nat.c (asm/ptrace.h): Include.
+
+### a/gdb/ChangeLog
+### b/gdb/ChangeLog
+## -1,5 +1,9 @@
+ 2014-05-22 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
+
++ * aarch64-linux-nat.c (asm/ptrace.h): Include.
++
++2014-05-22 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
++
+ * MAINTAINERS (Write After Approval): Move self back from
+ paper trail.
+
+--- a/gdb/aarch64-linux-nat.c
++++ b/gdb/aarch64-linux-nat.c
+@@ -33,6 +33,7 @@
+
+ #include <sys/ptrace.h>
+ #include <sys/utsname.h>
++#include <asm/ptrace.h>
+
+ #include "gregset.h"
+
+commit e9dae05e9c32efda9724330c6d5ade3ca848591d
+Author: Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
+Date: Fri May 23 09:01:14 2014 +0100
+
+ Include asm/ptrace.h for linux-aarch64-low.c
+
+ A recent change to glibc removed asm/ptrace.h from user.h for AArch64.
+ This meant that cross-native builds of gdbserver using trunk glibc broke
+ because linux-aarch64-low.c because user_hwdebug_state couldn't be found.
+
+ This is like commit #036cd38182bde32d8297b630cd5c861d53b8949e
+
+ 2014-05-23 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
+
+ * linux-aarch64-low.c (asm/ptrace.h): Include.
+
+### a/gdb/gdbserver/ChangeLog
+### b/gdb/gdbserver/ChangeLog
+## -1,3 +1,7 @@
++2014-05-23 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
++
++ * linux-aarch64-low.c (asm/ptrace.h): Include.
++
+ 2014-05-21 Jan Kratochvil <jan.kratochvil@redhat.com>
+
+ Fix TLS access for -static -pthread.
+--- a/gdb/gdbserver/linux-aarch64-low.c
++++ b/gdb/gdbserver/linux-aarch64-low.c
+@@ -26,6 +26,7 @@
+ #include <signal.h>
+ #include <sys/user.h>
+ #include <sys/ptrace.h>
++#include <asm/ptrace.h>
+ #include <sys/uio.h>
+
+ #include "gdb_proc_service.h"
diff --git a/gdb.spec b/gdb.spec
index 3d50fed..4283a17 100644
--- a/gdb.spec
+++ b/gdb.spec
@@ -27,7 +27,7 @@ Version: 7.7.1
# 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 BSD and Public Domain and GFDL
Group: Development/Debuggers
@@ -1307,6 +1307,9 @@ then
fi
%changelog
+* Fri May 30 2014 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.7.1-16.fc21
+- [aarch64] Fix signal frame unwinding (BZ 1086894, upstream).
+
* Mon May 26 2014 Jan Kratochvil <jan.kratochvil@redhat.com> - 7.7.1-15.fc21
- [testsuite] Drop BuildRequires: gcc-java+libgcj on Fedora (no longer in F21+).
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2026-06-27 23:56 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-06-27 23:56 [rpms/gdb] gdb-17.2-rebase-f44: [aarch64] Fix signal frame unwinding (BZ 1086894, upstream) Jan Kratochvil
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox