sigtramp offset on Linux/Alpha
Bharadwaj Yadavalli
sby@ives.lkg.dec.com
Tue May 1 08:53:00 GMT 2001
Hi!
The function long alpha_linux_sigtramp_offset PARAMS ((CORE_ADDR pc))
in gdb/alpha-tdep.c considers the following three instructions
as "signal trampoline":
bis $30,$30,$16 (0x47de0410)
addq $31,0x67,$0 (0x43ecf400)
call_pal callsys (0x00000083)
A quick look in rt_sigaction.S in
glibc sources glibc-2.2.2/sysdeps/unix/sysv/linux/alpha/ reveals the
following code for sigreturn
.align 5
.ent sigreturn
sigreturn:
.prologue 0
mov sp,a0
ldi v0,__NR_sigreturn
callsys
.end sigreturn
which assembles as
<sigreturn>: mov sp,a0 (0x47fe0410)
<sigreturn+4>: lda v0,103(zero) (0x201f0067)
<sigreturn+8>: callsys (0x00000083)
<sigreturn+12>: unop (0x2fe00000)
I realize that the second instruction in the version gdb is working
with and that in rt_sigaction.S do the same thing - load an
immediate value into v0 - but their encodings are different.
So, Question 1:
Shouldn't the function alpha_linux_sigtramp_offset() be looking
for the encoding 0x201f0067 instead of 0x43ecf400 in the second
instruction?
Further, the "trampoline" for signals with siginfo_t table is different
according to p. 268 of the book "Understanding Linux Kernel". The return
enters at rt_sigreturn instead of sigreturn as far as I understand. The
existence of rt_sigreturn seems to indicate the same.
So, Question 2:
Shouldn't gdb be checking for the pc to be in the chunk as well?
(Basically difference is in the second instruction).
<rt_sigreturn>: mov sp,a0 (0x47fe0410)
<rt_sigreturn+4>: lda v0,351(zero) (0x201f015f)
<rt_sigreturn+8>: callsys (0x00000083)
Am I missing something that led me to the above question? Thanks
in advance for any clarifications from folks in the know of the
internals.
Bharadwaj
More information about the Gdb
mailing list