Skip to content

Fix GH-10398: Fibers are broken on alpine x86 with clang #10407

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 1 commit into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 27 additions & 17 deletions Zend/asm/jump_i386_sysv_elf_gas.S
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,14 @@
* ---------------------------------------------------------------------------------- *
* | 0x0 | 0x4 | 0x8 | 0xc | 0x10 | 0x14 | 0x18 | 0x1c | *
* ---------------------------------------------------------------------------------- *
* | fc_mxcsr|fc_x87_cw| EDI | ESI | EBX | EBP | EIP | hidden | *
* | fc_mxcsr|fc_x87_cw| guard | EDI | ESI | EBX | EBP | EIP | *
* ---------------------------------------------------------------------------------- *
* ---------------------------------------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
* ---------------------------------------------------------------------------------- *
* | 0x20 | 0x24 | | *
* | 0x20 | 0x24 | 0x28 | | *
* ---------------------------------------------------------------------------------- *
* | to | data | | *
* | hidden | to | data | | *
* ---------------------------------------------------------------------------------- *
* *
****************************************************************************************/
Expand All @@ -30,50 +30,60 @@
.align 2
.type jump_fcontext,@function
jump_fcontext:
leal -0x18(%esp), %esp /* prepare stack */
leal -0x1c(%esp), %esp /* prepare stack */

#if !defined(BOOST_USE_TSX)
stmxcsr (%esp) /* save MMX control- and status-word */
fnstcw 0x4(%esp) /* save x87 control-word */
#endif

movl %edi, 0x8(%esp) /* save EDI */
movl %esi, 0xc(%esp) /* save ESI */
movl %ebx, 0x10(%esp) /* save EBX */
movl %ebp, 0x14(%esp) /* save EBP */
#if defined(BOOST_CONTEXT_TLS_STACK_PROTECTOR)
movl %gs:0x14, %ecx /* read stack guard from TLS record */
movl %ecx, 0x8(%esp) /* save stack guard */
#endif

movl %edi, 0xc(%esp) /* save EDI */
movl %esi, 0x10(%esp) /* save ESI */
movl %ebx, 0x14(%esp) /* save EBX */
movl %ebp, 0x18(%esp) /* save EBP */

/* store ESP (pointing to context-data) in ECX */
movl %esp, %ecx

/* first arg of jump_fcontext() == fcontext to jump to */
movl 0x20(%esp), %eax
movl 0x24(%esp), %eax

/* second arg of jump_fcontext() == data to be transferred */
movl 0x24(%esp), %edx
movl 0x28(%esp), %edx

/* restore ESP (pointing to context-data) from EAX */
movl %eax, %esp

/* address of returned transport_t */
movl 0x1c(%esp), %eax
movl 0x20(%esp), %eax
/* return parent fcontext_t */
movl %ecx, (%eax)
/* return data */
movl %edx, 0x4(%eax)

movl 0x18(%esp), %ecx /* restore EIP */
movl 0x1c(%esp), %ecx /* restore EIP */

#if !defined(BOOST_USE_TSX)
ldmxcsr (%esp) /* restore MMX control- and status-word */
fldcw 0x4(%esp) /* restore x87 control-word */
#endif

movl 0x8(%esp), %edi /* restore EDI */
movl 0xc(%esp), %esi /* restore ESI */
movl 0x10(%esp), %ebx /* restore EBX */
movl 0x14(%esp), %ebp /* restore EBP */
#if defined(BOOST_CONTEXT_TLS_STACK_PROTECTOR)
movl 0x8(%esp), %edx /* load stack guard */
movl %edx, %gs:0x14 /* restore stack guard to TLS record */
#endif

movl 0xc(%esp), %edi /* restore EDI */
movl 0x10(%esp), %esi /* restore ESI */
movl 0x14(%esp), %ebx /* restore EBX */
movl 0x18(%esp), %ebp /* restore EBP */

leal 0x20(%esp), %esp /* prepare stack */
leal 0x24(%esp), %esp /* prepare stack */

/* jump to context */
jmp *%ecx
Expand Down
184 changes: 92 additions & 92 deletions Zend/asm/jump_ppc32_sysv_macho_gas.S
Original file line number Diff line number Diff line change
Expand Up @@ -80,122 +80,122 @@ _jump_fcontext:
; reserve space on stack
subi r1, r1, 244

stfd f14, 0(r1) # save F14
stfd f15, 8(r1) # save F15
stfd f16, 16(r1) # save F16
stfd f17, 24(r1) # save F17
stfd f18, 32(r1) # save F18
stfd f19, 40(r1) # save F19
stfd f20, 48(r1) # save F20
stfd f21, 56(r1) # save F21
stfd f22, 64(r1) # save F22
stfd f23, 72(r1) # save F23
stfd f24, 80(r1) # save F24
stfd f25, 88(r1) # save F25
stfd f26, 96(r1) # save F26
stfd f27, 104(r1) # save F27
stfd f28, 112(r1) # save F28
stfd f29, 120(r1) # save F29
stfd f30, 128(r1) # save F30
stfd f31, 136(r1) # save F31
mffs f0 # load FPSCR
stfd f0, 144(r1) # save FPSCR
stfd f14, 0(r1) ; save F14
stfd f15, 8(r1) ; save F15
stfd f16, 16(r1) ; save F16
stfd f17, 24(r1) ; save F17
stfd f18, 32(r1) ; save F18
stfd f19, 40(r1) ; save F19
stfd f20, 48(r1) ; save F20
stfd f21, 56(r1) ; save F21
stfd f22, 64(r1) ; save F22
stfd f23, 72(r1) ; save F23
stfd f24, 80(r1) ; save F24
stfd f25, 88(r1) ; save F25
stfd f26, 96(r1) ; save F26
stfd f27, 104(r1) ; save F27
stfd f28, 112(r1) ; save F28
stfd f29, 120(r1) ; save F29
stfd f30, 128(r1) ; save F30
stfd f31, 136(r1) ; save F31
mffs f0 ; load FPSCR
stfd f0, 144(r1) ; save FPSCR

stw r13, 152(r1) # save R13
stw r14, 156(r1) # save R14
stw r15, 160(r1) # save R15
stw r16, 164(r1) # save R16
stw r17, 168(r1) # save R17
stw r18, 172(r1) # save R18
stw r19, 176(r1) # save R19
stw r20, 180(r1) # save R20
stw r21, 184(r1) # save R21
stw r22, 188(r1) # save R22
stw r23, 192(r1) # save R23
stw r24, 196(r1) # save R24
stw r25, 200(r1) # save R25
stw r26, 204(r1) # save R26
stw r27, 208(r1) # save R27
stw r28, 212(r1) # save R28
stw r29, 216(r1) # save R29
stw r30, 220(r1) # save R30
stw r31, 224(r1) # save R31
stw r3, 228(r1) # save hidden
stw r13, 152(r1) ; save R13
stw r14, 156(r1) ; save R14
stw r15, 160(r1) ; save R15
stw r16, 164(r1) ; save R16
stw r17, 168(r1) ; save R17
stw r18, 172(r1) ; save R18
stw r19, 176(r1) ; save R19
stw r20, 180(r1) ; save R20
stw r21, 184(r1) ; save R21
stw r22, 188(r1) ; save R22
stw r23, 192(r1) ; save R23
stw r24, 196(r1) ; save R24
stw r25, 200(r1) ; save R25
stw r26, 204(r1) ; save R26
stw r27, 208(r1) ; save R27
stw r28, 212(r1) ; save R28
stw r29, 216(r1) ; save R29
stw r30, 220(r1) ; save R30
stw r31, 224(r1) ; save R31
stw r3, 228(r1) ; save hidden

# save CR
; save CR
mfcr r0
stw r0, 232(r1)
# save LR
; save LR
mflr r0
stw r0, 236(r1)
# save LR as PC
; save LR as PC
stw r0, 240(r1)

# store RSP (pointing to context-data) in R6
; store RSP (pointing to context-data) in R6
mr r6, r1

# restore RSP (pointing to context-data) from R4
; restore RSP (pointing to context-data) from R4
mr r1, r4

lfd f14, 0(r1) # restore F14
lfd f15, 8(r1) # restore F15
lfd f16, 16(r1) # restore F16
lfd f17, 24(r1) # restore F17
lfd f18, 32(r1) # restore F18
lfd f19, 40(r1) # restore F19
lfd f20, 48(r1) # restore F20
lfd f21, 56(r1) # restore F21
lfd f22, 64(r1) # restore F22
lfd f23, 72(r1) # restore F23
lfd f24, 80(r1) # restore F24
lfd f25, 88(r1) # restore F25
lfd f26, 96(r1) # restore F26
lfd f27, 104(r1) # restore F27
lfd f28, 112(r1) # restore F28
lfd f29, 120(r1) # restore F29
lfd f30, 128(r1) # restore F30
lfd f31, 136(r1) # restore F31
lfd f0, 144(r1) # load FPSCR
mtfsf 0xff, f0 # restore FPSCR
lfd f14, 0(r1) ; restore F14
lfd f15, 8(r1) ; restore F15
lfd f16, 16(r1) ; restore F16
lfd f17, 24(r1) ; restore F17
lfd f18, 32(r1) ; restore F18
lfd f19, 40(r1) ; restore F19
lfd f20, 48(r1) ; restore F20
lfd f21, 56(r1) ; restore F21
lfd f22, 64(r1) ; restore F22
lfd f23, 72(r1) ; restore F23
lfd f24, 80(r1) ; restore F24
lfd f25, 88(r1) ; restore F25
lfd f26, 96(r1) ; restore F26
lfd f27, 104(r1) ; restore F27
lfd f28, 112(r1) ; restore F28
lfd f29, 120(r1) ; restore F29
lfd f30, 128(r1) ; restore F30
lfd f31, 136(r1) ; restore F31
lfd f0, 144(r1) ; load FPSCR
mtfsf 0xff, f0 ; restore FPSCR

lwz r13, 152(r1) # restore R13
lwz r14, 156(r1) # restore R14
lwz r15, 160(r1) # restore R15
lwz r16, 164(r1) # restore R16
lwz r17, 168(r1) # restore R17
lwz r18, 172(r1) # restore R18
lwz r19, 176(r1) # restore R19
lwz r20, 180(r1) # restore R20
lwz r21, 184(r1) # restore R21
lwz r22, 188(r1) # restore R22
lwz r23, 192(r1) # restore R23
lwz r24, 196(r1) # restore R24
lwz r25, 200(r1) # restore R25
lwz r26, 204(r1) # restore R26
lwz r27, 208(r1) # restore R27
lwz r28, 212(r1) # restore R28
lwz r29, 216(r1) # restore R29
lwz r30, 220(r1) # restore R30
lwz r31, 224(r1) # restore R31
lwz r3, 228(r1) # restore hidden
lwz r13, 152(r1) ; restore R13
lwz r14, 156(r1) ; restore R14
lwz r15, 160(r1) ; restore R15
lwz r16, 164(r1) ; restore R16
lwz r17, 168(r1) ; restore R17
lwz r18, 172(r1) ; restore R18
lwz r19, 176(r1) ; restore R19
lwz r20, 180(r1) ; restore R20
lwz r21, 184(r1) ; restore R21
lwz r22, 188(r1) ; restore R22
lwz r23, 192(r1) ; restore R23
lwz r24, 196(r1) ; restore R24
lwz r25, 200(r1) ; restore R25
lwz r26, 204(r1) ; restore R26
lwz r27, 208(r1) ; restore R27
lwz r28, 212(r1) ; restore R28
lwz r29, 216(r1) ; restore R29
lwz r30, 220(r1) ; restore R30
lwz r31, 224(r1) ; restore R31
lwz r3, 228(r1) ; restore hidden

# restore CR
; restore CR
lwz r0, 232(r1)
mtcr r0
# restore LR
; restore LR
lwz r0, 236(r1)
mtlr r0
# load PC
; load PC
lwz r0, 240(r1)
# restore CTR
; restore CTR
mtctr r0

# adjust stack
; adjust stack
addi r1, r1, 244

# return transfer_t
; return transfer_t
stw r6, 0(r3)
stw r5, 4(r3)

# jump to context
; jump to context
bctr
18 changes: 9 additions & 9 deletions Zend/asm/jump_ppc64_sysv_macho_gas.S
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
* ------------------------------------------------- *
* | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
* ------------------------------------------------- *
* | TOC | R14 | R15 | R16 | *
* | R13 | R14 | R15 | R16 | *
* ------------------------------------------------- *
* ------------------------------------------------- *
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
Expand Down Expand Up @@ -61,7 +61,7 @@
* ------------------------------------------------- *
* | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
* ------------------------------------------------- *
* | TOC saved | FCTX | DATA | | *
* | FCTX | DATA | | | *
* ------------------------------------------------- *
* *
*******************************************************/
Expand Down Expand Up @@ -138,27 +138,27 @@ _jump_fcontext:

; load PC
ld r12, 176(r1)
# restore CTR
; restore CTR
mtctr r12

# adjust stack
; adjust stack
addi r1, r1, 184

# zero in r3 indicates first jump to context-function
; zero in r3 indicates first jump to context-function
cmpdi r3, 0
beq use_entry_arg

# return transfer_t
; return transfer_t
std r6, 0(r3)
std r5, 8(r3)

# jump to context
; jump to context
bctr

use_entry_arg:
# copy transfer_t into transfer_fn arg registers
; copy transfer_t into transfer_fn arg registers
mr r3, r6
mr r4, r5

# jump to context
; jump to context
bctr
Loading