* hppa-tdep.c (frame_saved_pc): Mask off low two bits when

retrieving the PC from a signal handler caller.  Fix thinko
	in Stan's last change ("frame", should have been "frame->next").
	If the next frame is a signal handler caller and it's a system
	call which has entered the kernel ((PSW & 0x2) != 0), then the
	saved pc is in %r2 instead of %r31.
This commit is contained in:
Jeff Law 1994-11-06 20:02:31 +00:00
parent 8deb5c5fd6
commit 54b2555b0c
2 changed files with 31 additions and 4 deletions

View File

@ -1,3 +1,12 @@
Sun Nov 6 12:54:54 1994 Jeff Law (law@snake.cs.utah.edu)
* hppa-tdep.c (frame_saved_pc): Mask off low two bits when
retrieving the PC from a signal handler caller. Fix thinko
in Stan's last change ("frame", should have been "frame->next").
If the next frame is a signal handler caller and it's a system
call which has entered the kernel ((PSW & 0x2) != 0), then the
saved pc is in %r2 instead of %r31.
Fri Nov 4 23:47:07 1994 Jeff Law (law@snake.cs.utah.edu)
* hppa-tdep.c (hppa_frame_find_saved_regs): Change "frame" to

View File

@ -766,7 +766,7 @@ frame_saved_pc (frame)
{
CORE_ADDR rp;
FRAME_SAVED_PC_IN_SIGTRAMP (frame, &rp);
return rp;
return rp & ~0x3;
}
if (frameless_function_invocation (frame))
@ -785,9 +785,18 @@ frame_saved_pc (frame)
{
struct frame_saved_regs saved_regs;
get_frame_saved_regs (frame, &saved_regs);
get_frame_saved_regs (frame->next, &saved_regs);
if (read_memory_integer (saved_regs.regs[FLAGS_REGNUM], 4) & 0x2)
pc = read_memory_integer (saved_regs.regs[31], 4) & ~0x3;
{
pc = read_memory_integer (saved_regs.regs[31], 4) & ~0x3;
/* Syscalls are really two frames. The syscall stub itself
with a return pointer in %rp and the kernel call with
a return pointer in %r31. We return the %rp variant
if %r31 is the same as frame->pc. */
if (pc == frame->pc)
pc = read_memory_integer (saved_regs.regs[RP_REGNUM], 4) & ~0x3;
}
else
pc = read_memory_integer (saved_regs.regs[RP_REGNUM], 4) & ~0x3;
}
@ -812,7 +821,16 @@ restart:
get_frame_saved_regs (frame->next, &saved_regs);
if (read_memory_integer (saved_regs.regs[FLAGS_REGNUM], 4) & 0x2)
pc = read_memory_integer (saved_regs.regs[31], 4) & ~0x3;
{
pc = read_memory_integer (saved_regs.regs[31], 4) & ~0x3;
/* Syscalls are really two frames. The syscall stub itself
with a return pointer in %rp and the kernel call with
a return pointer in %r31. We return the %rp variant
if %r31 is the same as frame->pc. */
if (pc == frame->pc)
pc = read_memory_integer (saved_regs.regs[RP_REGNUM], 4) & ~0x3;
}
else
pc = read_memory_integer (saved_regs.regs[RP_REGNUM], 4) & ~0x3;
}