coroutine/ppc64le: fix conditional registers got clobbered unexpectedly
Now we also save the special cr registers during the fiber switching
This commit is contained in:
parent
073c4e1cc7
commit
d8a21592b4
Notes:
git
2025-01-09 15:07:41 +00:00
@ -7,7 +7,7 @@
|
|||||||
.type PREFIXED_SYMBOL(coroutine_transfer), @function
|
.type PREFIXED_SYMBOL(coroutine_transfer), @function
|
||||||
PREFIXED_SYMBOL(coroutine_transfer):
|
PREFIXED_SYMBOL(coroutine_transfer):
|
||||||
# Make space on the stack for caller registers
|
# Make space on the stack for caller registers
|
||||||
addi 1,1,-152
|
addi 1,1,-160
|
||||||
|
|
||||||
# Save caller registers
|
# Save caller registers
|
||||||
std 14,0(1)
|
std 14,0(1)
|
||||||
@ -33,6 +33,10 @@ PREFIXED_SYMBOL(coroutine_transfer):
|
|||||||
mflr 0
|
mflr 0
|
||||||
std 0,144(1)
|
std 0,144(1)
|
||||||
|
|
||||||
|
# Save caller special register
|
||||||
|
mfcr 0
|
||||||
|
std 0, 152(1)
|
||||||
|
|
||||||
# Save stack pointer to first argument
|
# Save stack pointer to first argument
|
||||||
std 1,0(3)
|
std 1,0(3)
|
||||||
|
|
||||||
@ -63,8 +67,14 @@ PREFIXED_SYMBOL(coroutine_transfer):
|
|||||||
ld 0,144(1)
|
ld 0,144(1)
|
||||||
mtlr 0
|
mtlr 0
|
||||||
|
|
||||||
|
# Load special registers
|
||||||
|
ld 0,152(1)
|
||||||
|
# Restore cr register cr2, cr3 and cr4 (field index 3,4,5)
|
||||||
|
# (field index is 1-based, field 1 = cr0) using a mask (32|16|8 = 56)
|
||||||
|
mtcrf 56,0
|
||||||
|
|
||||||
# Pop stack frame
|
# Pop stack frame
|
||||||
addi 1,1,152
|
addi 1,1,160
|
||||||
|
|
||||||
# Jump to return address
|
# Jump to return address
|
||||||
blr
|
blr
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
enum {
|
enum {
|
||||||
COROUTINE_REGISTERS =
|
COROUTINE_REGISTERS =
|
||||||
19 /* 18 general purpose registers (r14-r31) and 1 return address */
|
20 /* 18 general purpose registers (r14-r31), 1 special register (cr) and 1 return address */
|
||||||
+ 4 /* space for fiber_entry() to store the link register */
|
+ 4 /* space for fiber_entry() to store the link register */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user