patch-2.4.0-test12 linux/arch/parisc/hpux/gate.S

Next file: linux/arch/parisc/hpux/ioctl.c
Previous file: linux/arch/parisc/hpux/fs.c
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.4.0-test11/linux/arch/parisc/hpux/gate.S linux/arch/parisc/hpux/gate.S
@@ -0,0 +1,72 @@
+/* ------------------------------------------------------------------------------
+ *
+ * Linux/PARISC Project (http://www.thepuffingroup.com/parisc)
+ *
+ * System call entry code Copyright (c) Matthew Wilcox 1999 <willy@bofh.ai>
+ * Licensed under the GNU GPL.
+ * thanks to Philipp Rumpf, Mike Shaver and various others
+ * sorry about the wall, puffin..
+ */
+
+#define __ASSEMBLY__
+#include <asm/assembly.h>
+#include <asm/offset.h>
+#include <asm/unistd.h>
+#include <asm/errno.h>
+
+	.text
+
+	.import hpux_call_table
+	.import hpux_syscall_exit,code
+	.export hpux_gateway_page
+
+	.align 4096
+hpux_gateway_page:
+	nop
+	mfsp	%sr7,%r1			;! we must set sr3 to the space
+	mtsp	%r1,%sr3			;! of the user before the gate
+#ifdef __LP64__
+#warning NEEDS WORK for 64-bit
+#endif
+	ldw	-64(%r30), %r28			;! 8th argument
+	ldw	-60(%r30), %r19			;! 7th argument
+	ldw	-56(%r30), %r20			;! 6th argument
+	ldw	-52(%r30), %r21			;! 5th argument
+	gate	.+8, %r0			;! become privileged
+	mtsp	%r0,%sr4			;! get kernel space into sr4
+	mtsp	%r0,%sr5			;! get kernel space into sr5
+	mtsp	%r0,%sr6			;! get kernel space into sr6
+	mtsp	%r0,%sr7			;! get kernel space into sr7
+	mfctl	%cr30,%r1			;! get the kernel task ptr
+	mtctl	%r0,%cr30			;! zero it (flag)
+	STREG	%r30,TASK_PT_GR30(%r1)		;! preserve userspace sp
+	STREG	%r2,TASK_PT_GR2(%r1)		;! preserve rp
+	STREG	%r27,TASK_PT_GR27(%r1)		;! user dp
+	STREG	%r31,TASK_PT_GR31(%r1)		;! preserve syscall return ptr
+
+	loadgp					;! setup kernel dp
+
+	ldo	TASK_SZ_ALGN+64(%r1),%r30	;! set up kernel stack
+
+	stw	%r21, -52(%r30)			;! 5th argument
+	stw	%r20, -56(%r30)			;! 6th argument
+	stw	%r19, -60(%r30)			;! 7th argument
+	stw	%r28, -64(%r30)			;! 8th argument
+
+	ldil	L%hpux_call_table, %r21
+	ldo	R%hpux_call_table(%r21), %r21
+	comiclr,>>=	__NR_HPUX_syscalls, %r22, %r0
+	b,n	syscall_nosys
+	ldwx,s	%r22(%r21), %r21
+	ldil	L%hpux_syscall_exit,%r2
+	be	0(%sr7,%r21)
+	ldo	R%hpux_syscall_exit(%r2),%r2
+
+syscall_nosys:
+	ldil	L%hpux_syscall_exit,%r1
+	be	R%hpux_syscall_exit(%sr7,%r1)
+	ldo	-ENOSYS(%r0),%r28
+
+	.align 4096
+	.export end_hpux_gateway_page
+end_hpux_gateway_page:

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)