123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- #include <sys/syscall.h>
- #include <sys/asm.h>
- #include <sysdep.h>
- #ifndef SAVE_PID
- #define SAVE_PID
- #endif
- #ifndef RESTORE_PID
- #define RESTORE_PID
- #endif
- #ifdef __NR_fork
- .text
- .hidden __vfork
- LOCALSZ= 1
- FRAMESZ= (((NARGSAVE+LOCALSZ)*SZREG)+ALSZ)&ALMASK
- GPOFF= FRAMESZ-(1*SZREG)
- NESTED(__vfork,FRAMESZ,sp)
- #ifdef __PIC__
- SETUP_GP
- #endif
- PTR_SUBU sp, FRAMESZ
- SETUP_GP64 (a5, __vfork)
- #ifdef __PIC__
- SAVE_GP (GPOFF)
- #endif
- PTR_ADDU sp, FRAMESZ
- SAVE_PID
- li a0, 0x4112
- move a1, sp
-
- li v0,__NR_clone
- syscall
- RESTORE_PID
- bnez a3,L(error)
-
- RESTORE_GP64
- j ra
- nop
-
- L(error):
- move a0, v0
- #ifdef __PIC__
- PTR_LA t9, __syscall_error
- RESTORE_GP64
- jr t9
- #else
- RESTORE_GP64
- j __syscall_error
- #endif
- END(__vfork)
- weak_alias(__vfork,vfork)
- libc_hidden_def(vfork)
- #endif
|