Преглед на файлове

fix mips clone() on real linux kernel

the old code worked in qemu app-level emulation, but not on real
kernels where the clone syscall does not copy the register values to
the new thread. save arguments on the new thread stack instead.
Rich Felker преди 12 години
родител
ревизия
b58f738bcb
променени са 1 файла, в които са добавени 7 реда и са изтрити 4 реда
  1. 7 4
      src/thread/mips/clone.s

+ 7 - 4
src/thread/mips/clone.s

@@ -2,9 +2,10 @@
 .global __clone
 .type   __clone,@function
 __clone:
-	# Save function pointer and argument pointer
-	move $25, $4
-	move $8, $7
+	# Save function pointer and argument pointer on new thread stack
+	subu $5, $5, 16
+	sw $4, 0($5)
+	sw $7, 4($5)
 	# Shuffle (fn,sp,fl,arg,ptid,tls,ctid) to (fl,sp,ptid,tls,ctid)
 	move $4, $6
 	lw $6, 16($sp)
@@ -21,6 +22,8 @@ __clone:
 	nop
 	jr $ra
 	nop
-1:	move $4, $8
+1:	lw $25, 0($sp)
+	lw $4, 4($sp)
 	jr $25
+	addu $sp, $sp, 16
 	nop