$NetBSD: patch-an,v 1.2 2001/01/10 03:18:17 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,185 @@ +#include +#define COMPAT_43 +#include +#ifndef __CONCAT +#include +#endif +#define CONCAT __CONCAT + +#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 return + 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