[parisc-linux] [PATCH] Fix HPUX fork
Matthew Wilcox
willy@ldl.fc.hp.com
Thu, 22 Feb 2001 21:46:13 -0700
jsm pointed out I'd broken HPUX fork recently. This fix is untested
(except that it builds), but if it's wrong it does at least point the
way. I don't know if we want to enable STICKY_TIMEOUTS or some other
bugs for PER_HPUX, but they weren't enabled for SOM processes before,
so I haven't enabled them now.
Index: arch/parisc/hpux/entry_hpux.S
===================================================================
RCS file: /home/cvs/parisc/linux/arch/parisc/hpux/entry_hpux.S,v
retrieving revision 1.14
diff -u -p -r1.14 entry_hpux.S
--- entry_hpux.S 2000/07/18 03:14:26 1.14
+++ entry_hpux.S 2001/02/23 04:35:17
@@ -1,17 +1,13 @@
-/* -----------------------------------------------------------------------------
+/*
*
- * Native PARISC/Linux Project (http://www.puffingroup.com/parisc)
+ * PARISC/Linux Project (http://www.parisc-linux.org/)
*
* modified by Matthew Wilcox <willy@bofh.ai> 1999-07-26
*/
-
-#define ASSEMBLY
-
#include <linux/sys.h>
#include <linux/linkage.h>
#include <asm/unistd.h>
-
.text
Index: arch/parisc/hpux/wrappers.S
===================================================================
RCS file: /home/cvs/parisc/linux/arch/parisc/hpux/wrappers.S,v
retrieving revision 1.12
diff -u -p -r1.12 wrappers.S
--- wrappers.S 2001/01/28 13:39:13 1.12
+++ wrappers.S 2001/02/23 04:35:17
@@ -1,5 +1,5 @@
-/*------------------------------------------------------------------------------
- * Native PARISC/Linux Project (http://www.puffingroup.com/parisc)
+/*
+ * PARISC/Linux Project (http://www.parisc-linux.org/)
*
* HP-UX System Call Wrapper routines and System Call Return Path
*
@@ -80,6 +80,7 @@
.export hpux_fork_wrapper
+ .export hpux_child_return
.import sys_fork
hpux_fork_wrapper:
@@ -90,10 +91,7 @@ hpux_fork_wrapper:
stw %r2,-20(%r30)
ldo 64(%r30),%r30
stw %r2,PT_GR19(%r1) ;! save for child
- stw %r30,PT_GR20(%r1) ;! save for child
- ldil L%child_return,%r3
- ldo R%child_return(%r3),%r3
- stw %r3,PT_GR21(%r1) ;! save for child
+ stw %r30,PT_GR21(%r1) ;! save for child
ldw TASK_PT_GR30(%r1),%r25
copy %r1,%r24
@@ -129,7 +127,7 @@ fork_exit:
/* Set the return value for the child */
-child_return:
+hpux_child_return:
ldw TASK_PT_GR19-TASK_SZ_ALGN-128(%r30),%r2
b fork_return
copy %r0,%r28
Index: arch/parisc/kernel/process.c
===================================================================
RCS file: /home/cvs/parisc/linux/arch/parisc/kernel/process.c,v
retrieving revision 1.32
diff -u -p -r1.32 process.c
--- process.c 2001/02/23 01:08:42 1.32
+++ process.c 2001/02/23 04:35:17
@@ -223,6 +223,7 @@ copy_thread(int nr, unsigned long clone_
* function pointers aren't a pointer to the function on 64-bit */
extern void *ret_from_kernel_thread;
extern void *child_return;
+ extern void *hpux_child_return;
*cregs = *pregs;
@@ -262,8 +263,12 @@ copy_thread(int nr, unsigned long clone_
/* Use same stack depth as parent */
cregs->ksp = ((unsigned long)(p))
+ (pregs->gr[21] & (INIT_TASK_SIZE - 1));
- cregs->kpc = &child_return;
cregs->gr[30] = usp;
+ if (p->personality == PER_HPUX) {
+ cregs->kpc = &hpux_child_return;
+ } else {
+ cregs->kpc = &child_return;
+ }
}
return 0;
Index: fs/binfmt_som.c
===================================================================
RCS file: /home/cvs/parisc/linux/fs/binfmt_som.c,v
retrieving revision 1.14
diff -u -p -r1.14 binfmt_som.c
--- binfmt_som.c 2000/12/19 23:56:51 1.14
+++ binfmt_som.c 2001/02/23 04:35:17
@@ -228,7 +228,7 @@ do_load_som_binary(struct linux_binprm *
/* OK, This is the point of no return */
current->flags &= ~PF_FORKNOEXEC;
- current->personality = PER_LINUX; /* I suspect we want a PER_HPUX */
+ current->personality = PER_HPUX;
retval = map_som_binary(bprm->file, hpuxhdr);
if (retval < 0)
Index: include/linux/personality.h
===================================================================
RCS file: /home/cvs/parisc/linux/include/linux/personality.h,v
retrieving revision 1.3
diff -u -p -r1.3 personality.h
--- personality.h 2000/05/26 16:03:05 1.3
+++ personality.h 2001/02/23 04:35:18
@@ -25,11 +25,12 @@
#define PER_SUNOS (PER_BSD | STICKY_TIMEOUTS)
#define PER_XENIX (0x0007 | STICKY_TIMEOUTS)
#define PER_LINUX32 (0x0008)
-#define PER_IRIX32 (0x0009 | STICKY_TIMEOUTS) /* IRIX5 32-bit */
-#define PER_IRIXN32 (0x000a | STICKY_TIMEOUTS) /* IRIX6 new 32-bit */
-#define PER_IRIX64 (0x000b | STICKY_TIMEOUTS) /* IRIX6 64-bit */
+#define PER_IRIX32 (0x0009 | STICKY_TIMEOUTS) /* IRIX5 32-bit */
+#define PER_IRIXN32 (0x000a | STICKY_TIMEOUTS) /* IRIX6 new 32-bit */
+#define PER_IRIX64 (0x000b | STICKY_TIMEOUTS) /* IRIX6 64-bit */
#define PER_RISCOS (0x000c)
#define PER_SOLARIS (0x000d | STICKY_TIMEOUTS)
+#define PER_HPUX (0x000e)
/* Prototype for an lcall7 syscall handler. */
typedef void (*lcall7_func)(int, struct pt_regs *);