186 lines
4.1 KiB
Text
186 lines
4.1 KiB
Text
$NetBSD: patch-ch,v 1.3 2002/03/25 16:08:32 briggs Exp $
|
|
|
|
--- /dev/null Wed Dec 31 19:00:00 1969
|
|
+++ machdep/syscall-powerpc-netbsd.S Tue Jan 9 10:42:07 2001
|
|
@@ -0,0 +1,181 @@
|
|
+#include <machine/asm.h>
|
|
+#define COMPAT_43
|
|
+#include <sys/syscall.h>
|
|
+
|
|
+#undef SYSCALL
|
|
+
|
|
+/* Kernel syscall interface:
|
|
+ Input:
|
|
+ 0 - system call number
|
|
+ 3-8 - arguments, as in C
|
|
+ Output:
|
|
+ so - (summary overflow) clear iff successful
|
|
+
|
|
+ This macro is similar to SYSCALL in asm.h, but not completely.
|
|
+ There's room for optimization, if we assume this will continue to
|
|
+ be assembled as one file.
|
|
+
|
|
+ This macro expansions does not include the return instruction.
|
|
+ If there's no other work to be done, use something like:
|
|
+ SYSCALL(foo) ; ret
|
|
+ If there is other work to do (in fork, maybe?), do it after the
|
|
+ SYSCALL invocation. */
|
|
+
|
|
+ENTRY(machdep_cerror)
|
|
+ mflr 0 /* Save LR in 0 */
|
|
+ stwu 1,-16(1) /* allocate new stack frame */
|
|
+ stw 0,20(1) /* Stash 0 in stack */
|
|
+ stw 31,8(1) /* Stash 31 in stack (since it's callee-saved */
|
|
+ mr 31,3 /* and we stash return there) */
|
|
+ bl PIC_PLT(_C_LABEL(__errno))
|
|
+ stw 31,0(3) /* *errno() = err */
|
|
+ lwz 0,20(1) /* Restore LR from stack to 0 */
|
|
+ neg 3,31 /* return -errno to 3 */
|
|
+ lwz 31,8(1) /* Restore 31 from stack */
|
|
+ mtlr 0
|
|
+ la 1,16(1) /* Restore stack frame */
|
|
+ li 4,-1 /* Put -1 in r4 for those syscalls that ret */
|
|
+ blr /* two values */
|
|
+
|
|
+/* The fork system call is special... */
|
|
+ENTRY(machdep_sys_fork)
|
|
+ li 0, SYS_fork
|
|
+ sc
|
|
+ bso PIC_PLT(_C_LABEL(machdep_cerror))
|
|
+ addi 4,4,-1
|
|
+ blr
|
|
+
|
|
+/* The pipe system call is special... */
|
|
+ENTRY(machdep_sys_pipe)
|
|
+ mr 5,3
|
|
+ li 0,SYS_pipe
|
|
+ sc
|
|
+ bso PIC_PLT(_C_LABEL(machdep_cerror))
|
|
+ stw 3,0(5) /* Success, store fds */
|
|
+ stw 4,4(5)
|
|
+ li 3,0
|
|
+ blr /* And return 0 */
|
|
+
|
|
+#ifndef SYS___sigsuspend14
|
|
+/* The sigsuspend system call is special... */
|
|
+ENTRY(machdep_sys_sigsuspend)
|
|
+ lwz 3,0(3)
|
|
+ li 0,SYS_compat_13_sigsuspend13
|
|
+ sc
|
|
+ b PIC_PLT(_C_LABEL(machdep_cerror))
|
|
+#endif /* SYS_sigsuspend14 */
|
|
+
|
|
+#ifndef SYS___sigprocmask14
|
|
+/* The sigprocmask system call is special... */
|
|
+ENTRY(machdep_sys_sigprocmask)
|
|
+ or. 4,4,4 /* Set == NULL ? */
|
|
+ li 6,1 /* how = SIG_BLOCK */
|
|
+ beq Ldoit
|
|
+ lwz 4,0(4) /* if not, replace it in r4 with #set */
|
|
+ mr 6,3
|
|
+Ldoit: mr 3,6 /* ... using sigprocmask(SIG_BLOCK) */
|
|
+ li 0,SYS_compat_13_sigprocmask13
|
|
+ sc
|
|
+ bso PIC_PLT(_C_LABEL(machdep_cerror))
|
|
+ or. 5,5,5 /* Check to see if oset requested */
|
|
+ beq Ldone /* if oset != NULL */
|
|
+ stw 3,0(5) /* *oset = oldmask */
|
|
+Ldone:
|
|
+ li 3,0 /* return 0 */
|
|
+ blr
|
|
+#endif /* SYS_sigprocmask14 */
|
|
+
|
|
+/* More stuff ... */
|
|
+
|
|
+/* For fstat() we actually syscall fstat13. */
|
|
+ENTRY(machdep_sys_fstat)
|
|
+ li 0, SYS___fstat13
|
|
+ sc
|
|
+ bnslr
|
|
+ b PIC_PLT(_C_LABEL(machdep_cerror))
|
|
+
|
|
+/* Do we need to save the entire floating point state? I think so... */
|
|
+ENTRY(__machdep_save_fp_state)
|
|
+ stwu 1,-8(1)
|
|
+ stw 3,4(1)
|
|
+ stfd 0,0(3)
|
|
+ stfdu 1,8(3)
|
|
+ stfdu 2,8(3)
|
|
+ stfdu 3,8(3)
|
|
+ stfdu 4,8(3)
|
|
+ stfdu 5,8(3)
|
|
+ stfdu 6,8(3)
|
|
+ stfdu 7,8(3)
|
|
+ stfdu 8,8(3)
|
|
+ stfdu 9,8(3)
|
|
+ stfdu 10,8(3)
|
|
+ stfdu 11,8(3)
|
|
+ stfdu 12,8(3)
|
|
+ stfdu 13,8(3)
|
|
+ stfdu 14,8(3)
|
|
+ stfdu 15,8(3)
|
|
+ stfdu 16,8(3)
|
|
+ stfdu 17,8(3)
|
|
+ stfdu 18,8(3)
|
|
+ stfdu 19,8(3)
|
|
+ stfdu 20,8(3)
|
|
+ stfdu 21,8(3)
|
|
+ stfdu 22,8(3)
|
|
+ stfdu 23,8(3)
|
|
+ stfdu 24,8(3)
|
|
+ stfdu 25,8(3)
|
|
+ stfdu 26,8(3)
|
|
+ stfdu 27,8(3)
|
|
+ stfdu 28,8(3)
|
|
+ stfdu 29,8(3)
|
|
+ stfdu 30,8(3)
|
|
+ stfdu 31,8(3)
|
|
+ mffs 0
|
|
+ stfdu 0,8(3)
|
|
+ lwz 3,4(1)
|
|
+ lwz 1,0(1)
|
|
+ blr
|
|
+
|
|
+ENTRY(__machdep_restore_fp_state)
|
|
+ stwu 1,-12(1)
|
|
+ stw 3,4(1)
|
|
+ stw 4,8(1)
|
|
+ mr 4,3
|
|
+ lfdu 1,8(3)
|
|
+ lfdu 2,8(3)
|
|
+ lfdu 3,8(3)
|
|
+ lfdu 4,8(3)
|
|
+ lfdu 5,8(3)
|
|
+ lfdu 6,8(3)
|
|
+ lfdu 7,8(3)
|
|
+ lfdu 8,8(3)
|
|
+ lfdu 9,8(3)
|
|
+ lfdu 10,8(3)
|
|
+ lfdu 11,8(3)
|
|
+ lfdu 12,8(3)
|
|
+ lfdu 13,8(3)
|
|
+ lfdu 14,8(3)
|
|
+ lfdu 15,8(3)
|
|
+ lfdu 16,8(3)
|
|
+ lfdu 17,8(3)
|
|
+ lfdu 18,8(3)
|
|
+ lfdu 19,8(3)
|
|
+ lfdu 20,8(3)
|
|
+ lfdu 21,8(3)
|
|
+ lfdu 22,8(3)
|
|
+ lfdu 23,8(3)
|
|
+ lfdu 24,8(3)
|
|
+ lfdu 25,8(3)
|
|
+ lfdu 26,8(3)
|
|
+ lfdu 27,8(3)
|
|
+ lfdu 28,8(3)
|
|
+ lfdu 29,8(3)
|
|
+ lfdu 30,8(3)
|
|
+ lfdu 31,8(3)
|
|
+ lfdu 0,8(3)
|
|
+ mtfsf 127,0
|
|
+ lfd 0,0(4)
|
|
+ lwz 3,4(1)
|
|
+ lwz 4,8(1)
|
|
+ lwz 1,0(1)
|
|
+ blr
|