patch-2.4.21 linux-2.4.21/arch/ppc/kernel/process.c
Next file: linux-2.4.21/arch/ppc/kernel/prom.c
Previous file: linux-2.4.21/arch/ppc/kernel/prep_nvram.c
Back to the patch index
Back to the overall index
- Lines: 80
- Date:
2003-06-13 07:51:31.000000000 -0700
- Orig file:
linux-2.4.20/arch/ppc/kernel/process.c
- Orig date:
2001-11-26 05:29:17.000000000 -0800
diff -urN linux-2.4.20/arch/ppc/kernel/process.c linux-2.4.21/arch/ppc/kernel/process.c
@@ -1,7 +1,4 @@
/*
- * BK Id: SCCS/s.process.c 1.34 11/23/01 16:38:29 paulus
- */
-/*
* linux/arch/ppc/kernel/process.c
*
* Derived from "arch/i386/kernel/process.c"
@@ -34,6 +31,7 @@
#include <linux/user.h>
#include <linux/elf.h>
#include <linux/init.h>
+#include <linux/prctl.h>
#include <asm/pgtable.h>
#include <asm/uaccess.h>
@@ -400,13 +398,53 @@
last_task_used_math = 0;
if (last_task_used_altivec == current)
last_task_used_altivec = 0;
+ memset(current->thread.fpr, 0, sizeof(current->thread.fpr));
current->thread.fpscr = 0;
+#ifdef CONFIG_ALTIVEC
+ memset(current->thread.vr, 0, sizeof(current->thread.vr));
+ memset(¤t->thread.vscr, 0, sizeof(current->thread.vscr));
+ current->thread.vrsave = 0;
+#endif /* CONFIG_ALTIVEC */
+}
+
+/*
+ * Support for the PR_GET/SET_FPEXC prctl() calls.
+ */
+static inline unsigned int __unpack_fe01(unsigned int msr_bits)
+{
+ return ((msr_bits & MSR_FE0) >> 10) | ((msr_bits & MSR_FE1) >> 8);
+}
+
+static inline unsigned int __pack_fe01(unsigned int fpmode)
+{
+ return ((fpmode << 10) & MSR_FE0) | ((fpmode << 8) & MSR_FE1);
+}
+
+int set_fpexc_mode(struct task_struct *tsk, unsigned int val)
+{
+ struct pt_regs *regs = tsk->thread.regs;
+
+ if (val > PR_FP_EXC_PRECISE)
+ return -EINVAL;
+ tsk->thread.fpexc_mode = __pack_fe01(val);
+ if (regs != NULL && (regs->msr & MSR_FP) != 0)
+ regs->msr = (regs->msr & ~(MSR_FE0|MSR_FE1))
+ | tsk->thread.fpexc_mode;
+ return 0;
+}
+
+int get_fpexc_mode(struct task_struct *tsk, unsigned long adr)
+{
+ unsigned int val;
+
+ val = __unpack_fe01(tsk->thread.fpexc_mode);
+ return put_user(val, (unsigned int *) adr);
}
int sys_clone(int p1, int p2, int p3, int p4, int p5, int p6,
struct pt_regs *regs)
{
- return do_fork(p1, regs->gpr[1], regs, 0);
+ return do_fork(p1, p2, regs, 0);
}
int sys_fork(int p1, int p2, int p3, int p4, int p5, int p6,
@@ -452,6 +490,8 @@
int cnt = 0;
unsigned long i;
+ if (sp == NULL)
+ asm("mr %0,1" : "=r" (sp));
printk("Call backtrace: ");
while (sp) {
if (__get_user( i, &sp[1] ))
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)