diff options
-rw-r--r-- | libc/sysdeps/linux/mips/Makefile | 2 | ||||
-rw-r--r-- | libc/sysdeps/linux/mips/fork.S | 65 |
2 files changed, 66 insertions, 1 deletions
diff --git a/libc/sysdeps/linux/mips/Makefile b/libc/sysdeps/linux/mips/Makefile index 31710b0d5..34c2702ae 100644 --- a/libc/sysdeps/linux/mips/Makefile +++ b/libc/sysdeps/linux/mips/Makefile @@ -30,7 +30,7 @@ TARGET_MACHINE_TYPE=$(shell $(CC) -dumpmachine) CRT0=crt0.S CRT0_OBJ=$(patsubst %.S,%.o, $(CRT0)) -SSRC=bsd-_setjmp.S bsd-setjmp.S setjmp.S clone.S +SSRC=bsd-_setjmp.S bsd-setjmp.S setjmp.S clone.S fork.S SOBJS=$(patsubst %.S,%.o, $(SSRC)) CSRC=__longjmp.c brk.c vfork.c setjmp_aux.c _mmap.c pipe.c __syscall_error.c diff --git a/libc/sysdeps/linux/mips/fork.S b/libc/sysdeps/linux/mips/fork.S new file mode 100644 index 000000000..6d2b33dba --- /dev/null +++ b/libc/sysdeps/linux/mips/fork.S @@ -0,0 +1,65 @@ +#include <features.h> + +#define ALIGN 2 + +/* Note: .abicalls goes at top of routine, and only one of them. */ +#if defined(USER_ABICALLS) +#define ABISETUP \ + .set noreorder; \ + .cpload t9; \ + .set reorder; + + .abicalls +#else +#define ABISETUP +#endif + +#ifndef __UCLIBC_USE_UNIFIED_SYSCALL__ +#define SYSCALL__(name) \ + .text; \ + .align ALIGN; \ + .globl name; \ + .ent name, 0; \ + name: ; \ + ABISETUP \ + li v0, __NR_##name ; \ + syscall; \ + la t3, errno; \ + beqz a3, 1f; \ + negu a1, v0; \ + sw a1, 0(t3); \ + li v0, -1; \ + 1: ; \ + j ra; \ + .end name; \ + .size name,.-name; +#else /* Unified syscall */ +#define SYSCALL__(name) \ + .text; \ +/* .align ALIGN;*/ \ + .globl name; \ + .ent name, 0; \ + name: ; \ + ABISETUP \ + .set push; \ + .set noreorder; \ + j __uClibc_syscall; \ + addiu v0, zero, __NR_##name ; \ + .set pop; \ + .end name; \ + .size name,.-name; +#endif /* __UCLIBC_USE_UNIFIED_SYSCALL__ */ + +#undef ALIGN +#define __ASSEMBLY__ +#include <asm/asm.h> +#include <asm/unistd.h> +#include <asm/mipsregs.h> +#include <asm/regdef.h> +/* #include <asm/stackframe.h> */ + +#undef ALIGN +#define ALIGN 2 +#define _SYSCALL0(type,name) SYSCALL__(name) +_SYSCALL0(pid_t, fork); + |