浏览代码

clone: clear the frame pointer in the child process on relevant ports

This just mirrors what is done in the start code for the affected
ports, as well as what is already done for the three x86 ports.

Clearing the frame pointer helps protect FP-based unwinders from
wrongly attempting to traverse into the parent thread's call frame
stack.
Alex Rønne Petersen 5 月之前
父节点
当前提交
b6b81f697b

+ 2 - 1
src/thread/aarch64/clone.s

@@ -24,7 +24,8 @@ __clone:
 	// parent
 	// parent
 	ret
 	ret
 	// child
 	// child
-1:	ldp x1,x0,[sp],#16
+1:	mov fp, 0
+	ldp x1,x0,[sp],#16
 	blr x1
 	blr x1
 	mov x8,#93 // SYS_exit
 	mov x8,#93 // SYS_exit
 	svc #0
 	svc #0

+ 2 - 1
src/thread/arm/clone.s

@@ -19,7 +19,8 @@ __clone:
 	ldmfd sp!,{r4,r5,r6,r7}
 	ldmfd sp!,{r4,r5,r6,r7}
 	bx lr
 	bx lr
 
 
-1:	mov r0,r6
+1:	mov fp,#0
+	mov r0,r6
 	bl 3f
 	bl 3f
 2:	mov r7,#1
 2:	mov r7,#1
 	svc 0
 	svc 0

+ 1 - 0
src/thread/loongarch64/clone.s

@@ -22,6 +22,7 @@ __clone:
 	beqz    $a0, 1f         # whether child process
 	beqz    $a0, 1f         # whether child process
 	jirl    $zero, $ra, 0   # parent process return
 	jirl    $zero, $ra, 0   # parent process return
 1:
 1:
+	move    $fp, $zero
 	ld.d    $t8, $sp, 0     # function pointer
 	ld.d    $t8, $sp, 0     # function pointer
 	ld.d    $a0, $sp, 8     # argument pointer
 	ld.d    $a0, $sp, 8     # argument pointer
 	jirl    $ra, $t8, 0     # call the user's function
 	jirl    $ra, $t8, 0     # call the user's function

+ 2 - 1
src/thread/m68k/clone.s

@@ -18,7 +18,8 @@ __clone:
 	beq 1f
 	beq 1f
 	movem.l (%sp)+,%d2-%d5
 	movem.l (%sp)+,%d2-%d5
 	rts
 	rts
-1:	move.l %a1,-(%sp)
+1:	suba.l %fp,%fp
+	move.l %a1,-(%sp)
 	jsr (%a0)
 	jsr (%a0)
 	move.l #1,%d0
 	move.l #1,%d0
 	trap #0
 	trap #0

+ 2 - 1
src/thread/microblaze/clone.s

@@ -22,7 +22,8 @@ __clone:
 	rtsd    r15, 8
 	rtsd    r15, 8
 	nop
 	nop
 
 
-1:	lwi     r3, r1, 0
+1:	add     r19, r0, r0
+	lwi     r3, r1, 0
 	lwi     r5, r1, 4
 	lwi     r5, r1, 4
 	brald   r15, r3
 	brald   r15, r3
 	nop
 	nop

+ 2 - 1
src/thread/mips/clone.s

@@ -27,7 +27,8 @@ __clone:
 	addu $sp, $sp, 16
 	addu $sp, $sp, 16
 	jr $ra
 	jr $ra
 	nop
 	nop
-1:	lw $25, 0($sp)
+1:	move $fp, $0
+	lw $25, 0($sp)
 	lw $4, 4($sp)
 	lw $4, 4($sp)
 	jalr $25
 	jalr $25
 	nop
 	nop

+ 2 - 1
src/thread/mips64/clone.s

@@ -25,7 +25,8 @@ __clone:
 	nop
 	nop
 	jr	$ra
 	jr	$ra
 	nop
 	nop
-1:	ld	$25, 0($sp)	# function pointer
+1:	move	$fp, $0
+	ld	$25, 0($sp)	# function pointer
 	ld	$4, 8($sp)	# argument pointer
 	ld	$4, 8($sp)	# argument pointer
 	jalr	$25		# call the user's function
 	jalr	$25		# call the user's function
 	nop
 	nop

+ 2 - 1
src/thread/mipsn32/clone.s

@@ -25,7 +25,8 @@ __clone:
 	nop
 	nop
 	jr	$ra
 	jr	$ra
 	nop
 	nop
-1:	lw	$25, 0($sp)	# function pointer
+1:	move	$fp, $0
+	lw	$25, 0($sp)	# function pointer
 	lw	$4, 4($sp)	# argument pointer
 	lw	$4, 4($sp)	# argument pointer
 	jalr	$25		# call the user's function
 	jalr	$25		# call the user's function
 	nop
 	nop

+ 2 - 1
src/thread/or1k/clone.s

@@ -25,7 +25,8 @@ __clone:
 	l.jr	r9
 	l.jr	r9
 	 l.nop
 	 l.nop
 
 
-1:	l.lwz	r11, 0(r1)
+1:	l.ori	r2, r0, 0
+	l.lwz	r11, 0(r1)
 	l.jalr	r11
 	l.jalr	r11
 	 l.lwz	r3, 4(r1)
 	 l.lwz	r3, 4(r1)