summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/mips
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/linux/mips')
-rw-r--r--libc/sysdeps/linux/mips/Makefile2
-rw-r--r--libc/sysdeps/linux/mips/fork.S65
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);
+