All of lore.kernel.org
 help / color / mirror / Atom feed
From: Maxim Kuvyrkov <maxim@codesourcery.com>
To: Geert Uytterhoeven <geert@linux-m68k.org>
Cc: Andreas Schwab <schwab@linux-m68k.org>, linux-m68k@vger.kernel.org
Subject: Re: [PATCH] Define sigcontext ABI of ColdFire
Date: Wed, 23 Sep 2009 01:37:31 +0400	[thread overview]
Message-ID: <4AB9439B.6050006@codesourcery.com> (raw)
In-Reply-To: <4AB360DC.9030902@codesourcery.com>

[-- Attachment #1: Type: text/plain, Size: 1379 bytes --]

Maxim Kuvyrkov wrote:
> The following patch define sigcontext ABI of ColdFire.
...
> --- a/arch/m68k/kernel/signal.c
> +++ b/arch/m68k/kernel/signal.c
> @@ -897,9 +897,15 @@ static void setup_rt_frame (int sig, struct k_sigaction *ka, siginfo_t *info,
>  
>  	/* Set up to return from userspace.  */
>  	err |= __put_user(frame->retcode, &frame->pretcode);
> +#ifdef __mcoldfire__
> +	/* move.w #,d0; trap #0 */
> +	err |= __put_user(0x303c0000 + __NR_rt_sigreturn,
> +			  (long __user *)(frame->retcode + 0));
> +#else
>  	/* moveq #,d0; notb d0; trap #0 */
>  	err |= __put_user(0x70004600 + ((__NR_rt_sigreturn ^ 0xff) << 16),
>  			  (long __user *)(frame->retcode + 0));
> +#endif
>  	err |= __put_user(0x4e40, (short __user *)(frame->retcode + 4));
>  
>  	if (err)

This turned out to be buggy: move.w will only set the lower 16 bits of 
%d0 so if the signal handler leaves something in the high-order bits, 
then the trampoline will trap into a non-existent syscall.  The attached 
patch fixes this; nothing else in it has changed since the initial revision.

I was lured into thinking that the above sequence is OK by m68knommu's 
version of the trampoline.  Arch/m68knommu/kernel/entry.S uses "move 
#__NR_rt_sigreturn,%d0" which assembles into "move.w".  This is too is 
buggy and I'm also attaching the fix for the nommu version.

Regards,

--
Maxim K.
CodeSourcery

[-- Attachment #2: 0001-Define-sigcontext-ABI-of-ColdFire.patch --]
[-- Type: text/plain, Size: 2963 bytes --]

>From bafb4e11ac13ea3095d9e8510f9a58c4cdc0481d Mon Sep 17 00:00:00 2001
From: Maxim Kuvyrkov <maxim@codesourcery.com>
Date: Wed, 23 Sep 2009 01:22:43 +0400
Subject: [PATCH 1/2] Define sigcontext ABI of ColdFire

The following patch defines sigcontext ABI of ColdFire.  Due to ISA
restrictions ColdFire needs different rt_sigreturn trampoline.

And due to ColdFire FP registers being 8-bytes instead of 12-bytes on
m68k, sigcontext and fpregset structures should be updated.

Regarding the sc_fpstate[16+6*8] field, it would've been enough 16
bytes to store ColdFire's FP state.  To accomodate GLIBC's libSegFault
it would'be been enough 6*8 bytes (room for the 6 non-call-clobbered
FP registers).  I set it to 16+6*8 to provide some extra space for any
future changes in the ColdFire FPU.

Signed-off-by: Maxim Kuvyrkov <maxim@codesourcery.com>
---
 arch/m68k/include/asm/sigcontext.h |    6 ++++++
 arch/m68k/include/asm/ucontext.h   |    4 ++++
 arch/m68k/kernel/signal.c          |    7 +++++++
 3 files changed, 17 insertions(+), 0 deletions(-)

diff --git a/arch/m68k/include/asm/sigcontext.h b/arch/m68k/include/asm/sigcontext.h
index 523db2a..1320eaa 100644
--- a/arch/m68k/include/asm/sigcontext.h
+++ b/arch/m68k/include/asm/sigcontext.h
@@ -15,9 +15,15 @@ struct sigcontext {
 	unsigned long  sc_pc;
 	unsigned short sc_formatvec;
 #ifndef __uClinux__
+# ifdef __mcoldfire__
+	unsigned long  sc_fpregs[2][2];	/* room for two fp registers */
+	unsigned long  sc_fpcntl[3];
+	unsigned char  sc_fpstate[16+6*8];
+# else
 	unsigned long  sc_fpregs[2*3];  /* room for two fp registers */
 	unsigned long  sc_fpcntl[3];
 	unsigned char  sc_fpstate[216];
+# endif
 #endif
 };
 
diff --git a/arch/m68k/include/asm/ucontext.h b/arch/m68k/include/asm/ucontext.h
index e4e2266..00dcc51 100644
--- a/arch/m68k/include/asm/ucontext.h
+++ b/arch/m68k/include/asm/ucontext.h
@@ -7,7 +7,11 @@ typedef greg_t gregset_t[NGREG];
 
 typedef struct fpregset {
 	int f_fpcntl[3];
+#ifdef __mcoldfire__
+	int f_fpregs[8][2];
+#else
 	int f_fpregs[8*3];
+#endif
 } fpregset_t;
 
 struct mcontext {
diff --git a/arch/m68k/kernel/signal.c b/arch/m68k/kernel/signal.c
index de2d05d..4b38753 100644
--- a/arch/m68k/kernel/signal.c
+++ b/arch/m68k/kernel/signal.c
@@ -897,10 +897,17 @@ static void setup_rt_frame (int sig, struct k_sigaction *ka, siginfo_t *info,
 
 	/* Set up to return from userspace.  */
 	err |= __put_user(frame->retcode, &frame->pretcode);
+#ifdef __mcoldfire__
+	/* movel #__NR_rt_sigreturn,d0; trap #0 */
+	err |= __put_user(0x203c0000, (long __user *)(frame->retcode + 0));
+	err |= __put_user(0x00004e40 + (__NR_rt_sigreturn << 16),
+			  (long __user *)(frame->retcode + 4));
+#else
 	/* moveq #,d0; notb d0; trap #0 */
 	err |= __put_user(0x70004600 + ((__NR_rt_sigreturn ^ 0xff) << 16),
 			  (long __user *)(frame->retcode + 0));
 	err |= __put_user(0x4e40, (short __user *)(frame->retcode + 4));
+#endif
 
 	if (err)
 		goto give_sigsegv;
-- 
1.6.4


[-- Attachment #3: 0002-Fix-m68k-uclinux-s-rt_sigreturn-trampoline.patch --]
[-- Type: text/plain, Size: 726 bytes --]

>From ac003b05af17bb48e6acffd454cae6fdf6e80737 Mon Sep 17 00:00:00 2001
From: Maxim Kuvyrkov <maxim@codesourcery.com>
Date: Wed, 23 Sep 2009 01:25:44 +0400
Subject: [PATCH 2/2] Fix m68k-uclinux's rt_sigreturn trampoline


Signed-off-by: Maxim Kuvyrkov <maxim@codesourcery.com>
---
 arch/m68knommu/kernel/entry.S |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/arch/m68knommu/kernel/entry.S b/arch/m68knommu/kernel/entry.S
index f56faa5..2717605 100644
--- a/arch/m68knommu/kernel/entry.S
+++ b/arch/m68knommu/kernel/entry.S
@@ -145,6 +145,6 @@ ENTRY(ret_from_user_signal)
 	trap #0
 
 ENTRY(ret_from_user_rt_signal)
-	move #__NR_rt_sigreturn,%d0
+	movel #__NR_rt_sigreturn,%d0
 	trap #0
 
-- 
1.6.4


  reply	other threads:[~2009-09-22 21:37 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-09-18 10:28 [PATCH] Define sigcontext ABI of ColdFire Maxim Kuvyrkov
2009-09-22 21:37 ` Maxim Kuvyrkov [this message]
2009-11-09  9:42   ` Maxim Kuvyrkov
2010-02-09 11:22   ` [PATCH] Define sigcontext ABI for ColdFire Maxim Kuvyrkov
2010-02-10  6:16     ` Greg Ungerer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4AB9439B.6050006@codesourcery.com \
    --to=maxim@codesourcery.com \
    --cc=geert@linux-m68k.org \
    --cc=linux-m68k@vger.kernel.org \
    --cc=schwab@linux-m68k.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.