Remove as many hard-coded constants from the MIPS vfork.S as possible.

We could do better, but not without MIPS cleaning up their kernel headers.

Change-Id: Ib4d4ce5d720ce8ca27a3f9a1ae07a9a277675af9
diff --git a/libc/arch-mips/bionic/vfork.S b/libc/arch-mips/bionic/vfork.S
index 2e2e4ff..414caaf 100644
--- a/libc/arch-mips/bionic/vfork.S
+++ b/libc/arch-mips/bionic/vfork.S
@@ -27,11 +27,14 @@
  */
 
 #include <asm/unistd.h>
+#include <linux/sched.h>
+
+// TODO: mips' uapi signal.h is missing #ifndef __ASSEMBLY__.
+// #include <asm/signal.h>
+#define SIGCHLD 18
 
 	.text
 
-/* int vfork() implemented using clone() */
-
 	.type	vfork, @function
 	.global	vfork
 	.align	4
@@ -40,17 +43,22 @@
 	.set	noreorder
 	.cpload	$t9
 
-	li	$a0, 0x4112        /* CLONE_VM | CLONE_VFORK | SIGCHLD */
-	move	$a1, $sp
+	li	$a0, (CLONE_VM | CLONE_VFORK | SIGCHLD)
+	li	$a1, 0
+	li	$a2, 0
+	li	$a3, 0
+	subu	$sp, 8
+	sw	$0, 16($sp)
 	li	$v0, __NR_clone
 	syscall
-	bnez	$a3,1f
-	 nop
+	addu	$sp, 8
+	bnez	$a3, 1f
+	 move	$a0, $v0
 
 	j	$ra
 	 nop
 1:
-	la	$t9,__set_errno
+	la	$t9, __set_errno
 	j	$t9
-	 move	$a0,$v0
+	 nop
 	.end	vfork