From: "Kip Walker" <kwalker@broadcom.com>
To: linux-mips@linux-mips.org
Subject: Re: [patch] mips, mips64 signal trampoline
Date: Fri, 18 Oct 2002 08:57:02 -0700 [thread overview]
Message-ID: <3DB02F4E.E4C5242A@broadcom.com> (raw)
In-Reply-To: 3DB0266E.810D9D28@broadcom.com
[-- Attachment #1: Type: text/plain, Size: 722 bytes --]
OK, the patch was broken because it changed regs->regs[31] before the
setup_sigcontext. I think this one actually fixes a problem instead of
introducing one. :-) Somebody sent the 32-bit part of the patch around
a long time ago, but it doesn't seem to have gotten into CVS yet.
Kip
Kip Walker wrote:
>
> It looks like the RA setup by setup_frame and setup_rt_frame in
> arch/mips64/kernel/signal.c and signal32.c can be wrong. Same for
> arch/mips/kernel/signal.c
>
> signal32.c, 32-bit signal.c: sa_restorer is overriden
> signal.c: regs->regs[31] is pointed at the sigframe's code, even though
> there isn't code in the frame, and a comment says that sa_restorer is
> always used.
>
> Patch for 2.4 attached.
>
[-- Attachment #2: signal.patch --]
[-- Type: text/plain, Size: 8668 bytes --]
Index: arch/mips/kernel/signal.c
===================================================================
RCS file: /home/cvs/linux/arch/mips/kernel/signal.c,v
retrieving revision 1.39.2.9
diff -u -r1.39.2.9 signal.c
--- arch/mips/kernel/signal.c 5 Aug 2002 23:53:33 -0000 1.39.2.9
+++ arch/mips/kernel/signal.c 18 Oct 2002 15:52:26 -0000
@@ -461,6 +461,7 @@
int signr, sigset_t *set)
{
struct sigframe *frame;
+ unsigned long ra;
int err = 0;
frame = get_sigframe(ka, regs, sizeof(*frame));
@@ -470,7 +471,7 @@
/* Set up to return from userspace. If provided, use a stub already
in userspace. */
if (ka->sa.sa_flags & SA_RESTORER)
- regs->regs[31] = (unsigned long) ka->sa.sa_restorer;
+ ra = (unsigned long) ka->sa.sa_restorer;
else {
/*
* Set up the return code ...
@@ -483,6 +484,7 @@
err |= __put_user(0x0000000c ,
frame->sf_code + 1);
flush_cache_sigtramp((unsigned long) frame->sf_code);
+ ra = (unsigned long) frame->sf_code;
}
err |= setup_sigcontext(regs, &frame->sf_sc);
@@ -504,13 +506,13 @@
regs->regs[ 5] = 0;
regs->regs[ 6] = (unsigned long) &frame->sf_sc;
regs->regs[29] = (unsigned long) frame;
- regs->regs[31] = (unsigned long) frame->sf_code;
+ regs->regs[31] = ra;
regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
#if DEBUG_SIG
printk("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%p\n",
current->comm, current->pid,
- frame, regs->cp0_epc, frame->sf_code);
+ frame, regs->cp0_epc, regs->regs[31]);
#endif
return;
@@ -524,6 +526,7 @@
int signr, sigset_t *set, siginfo_t *info)
{
struct rt_sigframe *frame;
+ unsigned long ra;
int err = 0;
frame = get_sigframe(ka, regs, sizeof(*frame));
@@ -533,7 +536,7 @@
/* Set up to return from userspace. If provided, use a stub already
in userspace. */
if (ka->sa.sa_flags & SA_RESTORER)
- regs->regs[31] = (unsigned long) ka->sa.sa_restorer;
+ ra = (unsigned long) ka->sa.sa_restorer;
else {
/*
* Set up the return code ...
@@ -546,6 +549,7 @@
err |= __put_user(0x0000000c ,
frame->rs_code + 1);
flush_cache_sigtramp((unsigned long) frame->rs_code);
+ ra = (unsigned long) frame->rs_code;
}
/* Create siginfo. */
@@ -580,13 +584,13 @@
regs->regs[ 5] = (unsigned long) &frame->rs_info;
regs->regs[ 6] = (unsigned long) &frame->rs_uc;
regs->regs[29] = (unsigned long) frame;
- regs->regs[31] = (unsigned long) frame->rs_code;
+ regs->regs[31] = ra;
regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
#if DEBUG_SIG
printk("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%p\n",
current->comm, current->pid,
- frame, regs->cp0_epc, frame->rs_code);
+ frame, regs->cp0_epc, regs->regs[31]);
#endif
return;
Index: arch/mips64/kernel/signal.c
===================================================================
RCS file: /home/cvs/linux/arch/mips64/kernel/signal.c,v
retrieving revision 1.19.2.5
diff -u -r1.19.2.5 signal.c
--- arch/mips64/kernel/signal.c 18 Sep 2002 13:03:07 -0000 1.19.2.5
+++ arch/mips64/kernel/signal.c 18 Oct 2002 15:52:26 -0000
@@ -313,12 +313,6 @@
if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
goto give_sigsegv;
- /*
- * Set up to return from userspace. On mips64 we always use a stub
- * already provided by userspace and ignore SA_RESTORER.
- */
- regs->regs[31] = (unsigned long) ka->sa.sa_restorer;
-
err |= setup_sigcontext(regs, &frame->sf_sc);
err |= __copy_to_user(&frame->sf_mask, set, sizeof(*set));
if (err)
@@ -331,20 +325,21 @@
* a1 = 0 (should be cause)
* a2 = pointer to struct sigcontext
*
- * $25 and c0_epc point to the signal handler, $29 points to the
- * struct sigframe.
+ * $25 and c0_epc point to the signal handler, $29 points to
+ * the struct sigframe. On mips64 we always use a stub
+ * already provided by userspace and ignore SA_RESTORER.
*/
regs->regs[ 4] = signr;
regs->regs[ 5] = 0;
regs->regs[ 6] = (unsigned long) &frame->sf_sc;
regs->regs[29] = (unsigned long) frame;
- regs->regs[31] = (unsigned long) frame->sf_code;
+ regs->regs[31] = (unsigned long) ka->sa.sa_restorer;
regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
#if DEBUG_SIG
printk("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%p\n",
current->comm, current->pid,
- frame, regs->cp0_epc, frame->sf_code);
+ frame, regs->cp0_epc, regs->regs[31]);
#endif
return;
@@ -364,12 +359,6 @@
if (!access_ok(VERIFY_WRITE, frame, sizeof (*frame)))
goto give_sigsegv;
- /*
- * Set up to return from userspace. On mips64 we always use a stub
- * already provided by userspace and ignore SA_RESTORER.
- */
- regs->regs[31] = (unsigned long) ka->sa.sa_restorer;
-
/* Create siginfo. */
err |= copy_siginfo_to_user(&frame->rs_info, info);
@@ -396,19 +385,20 @@
* a2 = pointer to ucontext
*
* $25 and c0_epc point to the signal handler, $29 points to
- * the struct rt_sigframe.
+ * the struct rt_sigframe. On mips64 we always use a stub
+ * already provided by userspace and ignore SA_RESTORER.
*/
regs->regs[ 4] = signr;
regs->regs[ 5] = (unsigned long) &frame->rs_info;
regs->regs[ 6] = (unsigned long) &frame->rs_uc;
regs->regs[29] = (unsigned long) frame;
- regs->regs[31] = (unsigned long) frame->rs_code;
+ regs->regs[31] = (unsigned long) ka->sa.sa_restorer;
regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
#if DEBUG_SIG
printk("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%p\n",
current->comm, current->pid,
- frame, regs->cp0_epc, frame->rs_code);
+ frame, regs->cp0_epc, regs->regs[31]);
#endif
return;
Index: arch/mips64/kernel/signal32.c
===================================================================
RCS file: /home/cvs/linux/arch/mips64/kernel/signal32.c,v
retrieving revision 1.20.2.9
diff -u -r1.20.2.9 signal32.c
--- arch/mips64/kernel/signal32.c 2 Oct 2002 12:21:45 -0000 1.20.2.9
+++ arch/mips64/kernel/signal32.c 18 Oct 2002 15:52:26 -0000
@@ -567,6 +567,7 @@
int signr, sigset_t *set)
{
struct sigframe *frame;
+ unsigned long ra;
int err = 0;
frame = get_sigframe(ka, regs, sizeof(*frame));
@@ -576,7 +577,7 @@
/* Set up to return from userspace. If provided, use a stub already
in userspace. */
if (ka->sa.sa_flags & SA_RESTORER)
- regs->regs[31] = (unsigned long) ka->sa.sa_restorer;
+ ra = (unsigned long) ka->sa.sa_restorer;
else {
/*
* Set up the return code ...
@@ -589,6 +590,7 @@
err |= __put_user(0x0000000c ,
frame->sf_code + 1);
flush_cache_sigtramp((unsigned long) frame->sf_code);
+ ra = (unsigned long) frame->sf_code;
}
err |= setup_sigcontext(regs, &frame->sf_sc);
@@ -610,13 +612,13 @@
regs->regs[ 5] = 0;
regs->regs[ 6] = (unsigned long) &frame->sf_sc;
regs->regs[29] = (unsigned long) frame;
- regs->regs[31] = (unsigned long) frame->sf_code;
+ regs->regs[31] = ra;
regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
#if DEBUG_SIG
printk("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%p\n",
current->comm, current->pid,
- frame, regs->cp0_epc, frame->sf_code);
+ frame, regs->cp0_epc, regs->regs[31]);
#endif
return;
@@ -631,6 +633,7 @@
sigset_t *set, siginfo_t *info)
{
struct rt_sigframe32 *frame;
+ unsigned long ra;
int err = 0;
frame = get_sigframe(ka, regs, sizeof(*frame));
@@ -640,7 +643,7 @@
/* Set up to return from userspace. If provided, use a stub already
in userspace. */
if (ka->sa.sa_flags & SA_RESTORER)
- regs->regs[31] = (unsigned long) ka->sa.sa_restorer;
+ ra = (unsigned long) ka->sa.sa_restorer;
else {
/*
* Set up the return code ...
@@ -653,6 +656,7 @@
err |= __put_user(0x0000000c ,
frame->rs_code + 1);
flush_cache_sigtramp((unsigned long) frame->rs_code);
+ ra = (unsigned long) frame->rs_code;
}
/* Convert (siginfo_t -> siginfo_t32) and copy to user. */
@@ -687,13 +691,13 @@
regs->regs[ 5] = (unsigned long) &frame->rs_info;
regs->regs[ 6] = (unsigned long) &frame->rs_uc;
regs->regs[29] = (unsigned long) frame;
- regs->regs[31] = (unsigned long) frame->rs_code;
+ regs->regs[31] = ra;
regs->cp0_epc = regs->regs[25] = (unsigned long) ka->sa.sa_handler;
#if DEBUG_SIG
printk("SIG deliver (%s:%d): sp=0x%p pc=0x%lx ra=0x%p\n",
current->comm, current->pid,
- frame, regs->cp0_epc, frame->rs_code);
+ frame, regs->cp0_epc, regs->regs[31]);
#endif
return;
prev parent reply other threads:[~2002-10-18 15:57 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-10-18 15:19 [patch] mips, mips64 signal trampoline Kip Walker
2002-10-18 15:57 ` Kip Walker [this message]
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=3DB02F4E.E4C5242A@broadcom.com \
--to=kwalker@broadcom.com \
--cc=linux-mips@linux-mips.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.