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