mirror of git://git.musl-libc.org/musl
fix powerpc asm not to store data in volatile space below stack pointer
it's essential to decrement the stack pointer before writing to new stack space, rather than afterwards. otherwise there is a race condition during which asynchronous code (signals) could clobber the data being stored. it may be possible to optimize the code further using stwu, but I wanted to avoid making any changes to the actual stack layout in this commit. further improvements can be made separately if desired.
This commit is contained in:
parent
0004ea613a
commit
9565a349f2
|
@ -10,25 +10,25 @@ sigsetjmp:
|
||||||
#2) if its 0, goto setjmp code
|
#2) if its 0, goto setjmp code
|
||||||
beq- cr7, 1f
|
beq- cr7, 1f
|
||||||
#3) else: we must call pthread_sigmask(SIG_SETMASK, 0, (sigset_t *)buf->__ss);
|
#3) else: we must call pthread_sigmask(SIG_SETMASK, 0, (sigset_t *)buf->__ss);
|
||||||
# thus store r3 on the stack, to restore it later
|
|
||||||
stw 3, -4(1)
|
|
||||||
# store old link reg
|
|
||||||
mflr 0
|
|
||||||
stw 0, -8(1)
|
|
||||||
# increase stack frame by 16
|
# increase stack frame by 16
|
||||||
subi 1, 1, 16
|
subi 1, 1, 16
|
||||||
|
# thus store r3 on the stack, to restore it later
|
||||||
|
stw 3, 12(1)
|
||||||
|
# store old link reg
|
||||||
|
mflr 0
|
||||||
|
stw 0, 8(1)
|
||||||
# put pointer to ss buf into r5 (3rd arg)
|
# put pointer to ss buf into r5 (3rd arg)
|
||||||
addi 5, 3, 260
|
addi 5, 3, 260
|
||||||
# put "2" i.e. SIG_SETMASK in r3
|
# put "2" i.e. SIG_SETMASK in r3
|
||||||
li 3, 2
|
li 3, 2
|
||||||
li 4, 0
|
li 4, 0
|
||||||
bl pthread_sigmask
|
bl pthread_sigmask
|
||||||
|
#restore r3
|
||||||
|
lwz 3, 12(1)
|
||||||
|
#restore link reg
|
||||||
|
lwz 0, 8(1)
|
||||||
|
mtlr 0
|
||||||
#restore sp
|
#restore sp
|
||||||
addi 1, 1, 16
|
addi 1, 1, 16
|
||||||
#restore r3
|
|
||||||
lwz 3, -4(1)
|
|
||||||
#restore link reg
|
|
||||||
lwz 0, -8(1)
|
|
||||||
mtlr 0
|
|
||||||
1:
|
1:
|
||||||
b setjmp
|
b setjmp
|
||||||
|
|
|
@ -16,9 +16,9 @@ __clone:
|
||||||
# in order that the child can find the start func and its arg, we need to store it into
|
# in order that the child can find the start func and its arg, we need to store it into
|
||||||
# non-volative regs. to do so, we have to store those 2 regs into our stackframe, so
|
# non-volative regs. to do so, we have to store those 2 regs into our stackframe, so
|
||||||
# we can restore them later.
|
# we can restore them later.
|
||||||
stw 30, -4(1)
|
|
||||||
stw 31, -8(1)
|
|
||||||
subi 1, 1, 16
|
subi 1, 1, 16
|
||||||
|
stw 30, 12(1)
|
||||||
|
stw 31, 8(1)
|
||||||
|
|
||||||
# save r3 (func) into r30, and r6(arg) into r31
|
# save r3 (func) into r30, and r6(arg) into r31
|
||||||
mr 30, 3
|
mr 30, 3
|
||||||
|
@ -72,9 +72,9 @@ sc
|
||||||
2:
|
2:
|
||||||
|
|
||||||
# restore stack
|
# restore stack
|
||||||
|
lwz 30, 12(1)
|
||||||
|
lwz 31, 8(1)
|
||||||
addi 1, 1, 16
|
addi 1, 1, 16
|
||||||
lwz 30, -4(1)
|
|
||||||
lwz 31, -8(1)
|
|
||||||
|
|
||||||
blr
|
blr
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue