From 522d2b3fccdaea685db88d1533789e42f61511a6 Mon Sep 17 00:00:00 2001 From: Kaz Kojima <kkojima@gcc.gnu.org> Date: Mon, 6 Oct 2003 01:24:53 +0000 Subject: [PATCH] linux.h (MD_FALLBACK_FRAME_STATE_FOR): Handle new signal trampoline codes. * config/sh/linux.h (MD_FALLBACK_FRAME_STATE_FOR): Handle new signal trampoline codes. From-SVN: r72128 --- gcc/ChangeLog | 5 +++++ gcc/config/sh/linux.h | 23 +++++++++++++++++------ 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5b3dd9699e09..ac396db1b11b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2003-10-05 Kaz Kojima <kkojima@gcc.gnu.org> + + * config/sh/linux.h (MD_FALLBACK_FRAME_STATE_FOR): Handle new + signal trampoline codes. + 2003-10-05 Chris Demetriou <cgd@broadcom.com> * config/mips/mips.md (*divsf3): Move description of diff --git a/gcc/config/sh/linux.h b/gcc/config/sh/linux.h index 42603c10d2bd..da423516b16a 100644 --- a/gcc/config/sh/linux.h +++ b/gcc/config/sh/linux.h @@ -220,13 +220,24 @@ do { \ \ /* mov.w 1f,r3; trapa #0x10; 1: .short 0x77 (sigreturn) */ \ /* mov.w 1f,r3; trapa #0x10; 1: .short 0xad (rt_sigreturn) */ \ - if ((*(unsigned short *) (pc_+0) == 0x9300) \ - && (*(unsigned short *) (pc_+2) == 0xc310) \ - && (*(unsigned short *) (pc_+4) == 0x0077)) \ + /* Newer kernel uses pad instructions to avoid an SH-4 core bug. */\ + /* mov.w 1f,r3; trapa #0x10; or r0,r0; or r0,r0; or r0,r0; or r0,r0;\ + or r0,r0; 1: .short 0x77 (sigreturn) */ \ + /* mov.w 1f,r3; trapa #0x10; or r0,r0; or r0,r0; or r0,r0; or r0,r0;\ + or r0,r0; 1: .short 0xad (rt_sigreturn) */ \ + if (((*(unsigned short *) (pc_+0) == 0x9300) \ + && (*(unsigned short *) (pc_+2) == 0xc310) \ + && (*(unsigned short *) (pc_+4) == 0x0077)) \ + || (((*(unsigned short *) (pc_+0) == 0x9305) \ + && (*(unsigned short *) (pc_+2) == 0xc310) \ + && (*(unsigned short *) (pc_+14) == 0x0077)))) \ sc_ = (CONTEXT)->cfa; \ - else if ((*(unsigned short *) (pc_+0) == 0x9300) \ - && (*(unsigned short *) (pc_+2) == 0xc310) \ - && (*(unsigned short *) (pc_+4) == 0x00ad)) \ + else if (((*(unsigned short *) (pc_+0) == 0x9300) \ + && (*(unsigned short *) (pc_+2) == 0xc310) \ + && (*(unsigned short *) (pc_+4) == 0x00ad)) \ + || (((*(unsigned short *) (pc_+0) == 0x9305) \ + && (*(unsigned short *) (pc_+2) == 0xc310) \ + && (*(unsigned short *) (pc_+14) == 0x00ad)))) \ { \ struct rt_sigframe { \ struct siginfo info; \ -- GitLab