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:
committed by
Rich Felker
parent
5e03c03fcd
commit
b6b81f697b
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user