From: Jun Sun <jsun@mvista.com>
To: Ralf Baechle <ralf@oss.sgi.com>
Cc: linux-mips@oss.sgi.com
Subject: Re: a REALLY, REALLY nasty bug
Date: Thu, 26 Oct 2000 18:57:53 -0700 [thread overview]
Message-ID: <39F8E121.8260535A@mvista.com> (raw)
In-Reply-To: 20001027013845.C1056@bacchus.dhis.org
[-- Attachment #1: Type: text/plain, Size: 612 bytes --]
Ralf Baechle wrote:
>
> On Wed, Oct 25, 2000 at 08:03:20PM -0700, Jun Sun wrote:
>
> > I am sure Ralf will have something to say about it. :-) In any case, I
> > attached a patch for 1) fix.
>
> A fix that is less easily affected by compiler overoptmizations is contained
> in 2.2; I'll merge it forward into 2.4. Dunno how that didn't make it
> into 2.4.
>
I took a look of what v2.2 does. It does look better than my hack.
Just verified that it worked on my machine. I attached the patch - if
you want to save some time.
> Time for a brown paper bag.
>
You mean time for beer and pork feet?
Jun
[-- Attachment #2: junk --]
[-- Type: text/plain, Size: 4609 bytes --]
diff -Nru linux/include/asm-mips/stackframe.h.orig linux/include/asm-mips/stackframe.h
--- linux/include/asm-mips/stackframe.h.orig Wed Oct 25 19:45:50 2000
+++ linux/include/asm-mips/stackframe.h Thu Oct 26 18:34:50 2000
@@ -47,19 +47,28 @@
#define __str2(x) #x
#define __str(x) __str2(x)
-#define save_static(frame) \
- __asm__ __volatile__( \
- "sw\t$16,"__str(PT_R16)"(%0)\n\t" \
- "sw\t$17,"__str(PT_R17)"(%0)\n\t" \
- "sw\t$18,"__str(PT_R18)"(%0)\n\t" \
- "sw\t$19,"__str(PT_R19)"(%0)\n\t" \
- "sw\t$20,"__str(PT_R20)"(%0)\n\t" \
- "sw\t$21,"__str(PT_R21)"(%0)\n\t" \
- "sw\t$22,"__str(PT_R22)"(%0)\n\t" \
- "sw\t$23,"__str(PT_R23)"(%0)\n\t" \
- "sw\t$30,"__str(PT_R30)"(%0)\n\t" \
- : /* No outputs */ \
- : "r" (frame))
+#define save_static_function(symbol) \
+__asm__ ( \
+ ".globl\t" #symbol "\n\t" \
+ ".align\t2\n\t" \
+ ".type\t" #symbol ", @function\n\t" \
+ ".ent\t" #symbol ", 0\n" \
+ #symbol":\n\t" \
+ ".frame\t$29, 0, $31\n\t" \
+ "sw\t$16,"__str(PT_R16)"($29)\t\t\t# save_static_function\n\t" \
+ "sw\t$17,"__str(PT_R17)"($29)\n\t" \
+ "sw\t$18,"__str(PT_R18)"($29)\n\t" \
+ "sw\t$19,"__str(PT_R19)"($29)\n\t" \
+ "sw\t$20,"__str(PT_R20)"($29)\n\t" \
+ "sw\t$21,"__str(PT_R21)"($29)\n\t" \
+ "sw\t$22,"__str(PT_R22)"($29)\n\t" \
+ "sw\t$23,"__str(PT_R23)"($29)\n\t" \
+ "sw\t$30,"__str(PT_R30)"($29)\n\t" \
+ ".end\t" #symbol "\n\t" \
+ ".size\t" #symbol",. - " #symbol)
+
+/* Used in declaration of save_static functions. */
+#define unused __attribute__((unused))
#define SAVE_SOME \
.set push; \
@@ -90,6 +99,7 @@
mfc0 v1, CP0_EPC; \
sw $7, PT_R7(sp); \
sw v1, PT_EPC(sp); \
+ sw $16, PT_R16(sp); \
sw $25, PT_R25(sp); \
sw $28, PT_R28(sp); \
sw $31, PT_R31(sp); \
diff -Nru linux/arch/mips/kernel/signal.c.orig linux/arch/mips/kernel/signal.c
--- linux/arch/mips/kernel/signal.c.orig Thu Oct 26 18:36:54 2000
+++ linux/arch/mips/kernel/signal.c Thu Oct 26 18:42:01 2000
@@ -76,12 +76,12 @@
/*
* Atomically swap in the new signal mask, and wait for a signal.
*/
-asmlinkage inline int
-sys_sigsuspend(struct pt_regs regs)
+save_static_function(sys_sigsuspend);
+static unused int
+_sys_sigsuspend(struct pt_regs regs)
{
sigset_t *uset, saveset, newset;
- save_static(®s);
uset = (sigset_t *) regs.regs[4];
if (copy_from_user(&newset, uset, sizeof(sigset_t)))
return -EFAULT;
@@ -103,13 +103,13 @@
}
}
-asmlinkage int
-sys_rt_sigsuspend(struct pt_regs regs)
+
+save_static_function(sys_rt_sigsuspend);
+static unused int
+_sys_rt_sigsuspend(struct pt_regs regs)
{
sigset_t *unewset, saveset, newset;
size_t sigsetsize;
-
- save_static(®s);
/* XXX Don't preclude handling different sized sigset_t's. */
sigsetsize = regs.regs[5];
diff -Nru linux/arch/mips/kernel/syscall.c.orig linux/arch/mips/kernel/syscall.c
--- linux/arch/mips/kernel/syscall.c.orig Thu Oct 26 18:43:10 2000
+++ linux/arch/mips/kernel/syscall.c Thu Oct 26 18:47:00 2000
@@ -92,22 +92,22 @@
return do_mmap2(addr, len, prot, flags, fd, pgoff);
}
-asmlinkage int sys_fork(struct pt_regs regs)
+save_static_function(sys_fork);
+static unused int _sys_fork(struct pt_regs regs)
{
int res;
- save_static(®s);
res = do_fork(SIGCHLD, regs.regs[29], ®s);
return res;
}
-asmlinkage int sys_clone(struct pt_regs regs)
+save_static_function(sys_clone);
+static unused int _sys_clone(struct pt_regs regs)
{
unsigned long clone_flags;
unsigned long newsp;
int res;
- save_static(®s);
clone_flags = regs.regs[4];
newsp = regs.regs[5];
if (!newsp)
prev parent reply other threads:[~2000-10-27 1:56 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2000-10-26 3:03 a REALLY, REALLY nasty bug Jun Sun
2000-10-26 23:38 ` Ralf Baechle
2000-10-27 1:57 ` Jun Sun [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=39F8E121.8260535A@mvista.com \
--to=jsun@mvista.com \
--cc=linux-mips@oss.sgi.com \
--cc=ralf@oss.sgi.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox