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.
This commit is contained in:
Alex Rønne Petersen
2025-02-21 20:53:41 -05:00
committed by Rich Felker
parent 5e03c03fcd
commit b6b81f697b
9 changed files with 17 additions and 8 deletions
+2 -1
View File
@@ -24,7 +24,8 @@ __clone:
// parent
ret
// child
1: ldp x1,x0,[sp],#16
1: mov fp, 0
ldp x1,x0,[sp],#16
blr x1
mov x8,#93 // SYS_exit
svc #0
+2 -1
View File
@@ -19,7 +19,8 @@ __clone:
ldmfd sp!,{r4,r5,r6,r7}
bx lr
1: mov r0,r6
1: mov fp,#0
mov r0,r6
bl 3f
2: mov r7,#1
svc 0
+1
View File
@@ -22,6 +22,7 @@ __clone:
beqz $a0, 1f # whether child process
jirl $zero, $ra, 0 # parent process return
1:
move $fp, $zero
ld.d $t8, $sp, 0 # function pointer
ld.d $a0, $sp, 8 # argument pointer
jirl $ra, $t8, 0 # call the user's function
+2 -1
View File
@@ -18,7 +18,8 @@ __clone:
beq 1f
movem.l (%sp)+,%d2-%d5
rts
1: move.l %a1,-(%sp)
1: suba.l %fp,%fp
move.l %a1,-(%sp)
jsr (%a0)
move.l #1,%d0
trap #0
+2 -1
View File
@@ -22,7 +22,8 @@ __clone:
rtsd r15, 8
nop
1: lwi r3, r1, 0
1: add r19, r0, r0
lwi r3, r1, 0
lwi r5, r1, 4
brald r15, r3
nop
+2 -1
View File
@@ -27,7 +27,8 @@ __clone:
addu $sp, $sp, 16
jr $ra
nop
1: lw $25, 0($sp)
1: move $fp, $0
lw $25, 0($sp)
lw $4, 4($sp)
jalr $25
nop
+2 -1
View File
@@ -25,7 +25,8 @@ __clone:
nop
jr $ra
nop
1: ld $25, 0($sp) # function pointer
1: move $fp, $0
ld $25, 0($sp) # function pointer
ld $4, 8($sp) # argument pointer
jalr $25 # call the user's function
nop
+2 -1
View File
@@ -25,7 +25,8 @@ __clone:
nop
jr $ra
nop
1: lw $25, 0($sp) # function pointer
1: move $fp, $0
lw $25, 0($sp) # function pointer
lw $4, 4($sp) # argument pointer
jalr $25 # call the user's function
nop
+2 -1
View File
@@ -25,7 +25,8 @@ __clone:
l.jr r9
l.nop
1: l.lwz r11, 0(r1)
1: l.ori r2, r0, 0
l.lwz r11, 0(r1)
l.jalr r11
l.lwz r3, 4(r1)