Skip to content

Commit 49551d7

Browse files
nielsdosdevnexen
authored andcommitted
Sync boost/context assembly files for fibers
Fixes GH-10398 The stack was misaligned upon entering the trampoline function [1], this causes a CPU trap when the SSE instruction is executed to copy data from the stack. This was fixed upstream [2]. This commit syncs all upstream changes from the boost/context assembly files to our copy. [1] #10407 (comment) [2] boostorg/context#219 Closes GH-10407.
1 parent 5b13e83 commit 49551d7

10 files changed

+333
-195
lines changed

NEWS

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ PHP NEWS
1717
- FFI:
1818
. Fixed incorrect bitshifting and masking in ffi bitfield. (nielsdos)
1919

20+
- Fiber:
21+
. Fixed assembly on alpine x86. (nielsdos)
22+
2023
- FPM:
2124
. Fixed bug GH-10315 (FPM unknown child alert not valid). (Jakub Zelenka)
2225
. Fixed bug GH-10385 (FPM successful config test early exit). (nielsdos)

Zend/asm/jump_i386_sysv_elf_gas.S

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -12,14 +12,14 @@
1212
* ---------------------------------------------------------------------------------- *
1313
* | 0x0 | 0x4 | 0x8 | 0xc | 0x10 | 0x14 | 0x18 | 0x1c | *
1414
* ---------------------------------------------------------------------------------- *
15-
* | fc_mxcsr|fc_x87_cw| EDI | ESI | EBX | EBP | EIP | hidden | *
15+
* | fc_mxcsr|fc_x87_cw| guard | EDI | ESI | EBX | EBP | EIP | *
1616
* ---------------------------------------------------------------------------------- *
1717
* ---------------------------------------------------------------------------------- *
1818
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
1919
* ---------------------------------------------------------------------------------- *
20-
* | 0x20 | 0x24 | | *
20+
* | 0x20 | 0x24 | 0x28 | | *
2121
* ---------------------------------------------------------------------------------- *
22-
* | to | data | | *
22+
* | hidden | to | data | | *
2323
* ---------------------------------------------------------------------------------- *
2424
* *
2525
****************************************************************************************/
@@ -30,50 +30,60 @@
3030
.align 2
3131
.type jump_fcontext,@function
3232
jump_fcontext:
33-
leal -0x18(%esp), %esp /* prepare stack */
33+
leal -0x1c(%esp), %esp /* prepare stack */
3434

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

40-
movl %edi, 0x8(%esp) /* save EDI */
41-
movl %esi, 0xc(%esp) /* save ESI */
42-
movl %ebx, 0x10(%esp) /* save EBX */
43-
movl %ebp, 0x14(%esp) /* save EBP */
40+
#if defined(BOOST_CONTEXT_TLS_STACK_PROTECTOR)
41+
movl %gs:0x14, %ecx /* read stack guard from TLS record */
42+
movl %ecx, 0x8(%esp) /* save stack guard */
43+
#endif
44+
45+
movl %edi, 0xc(%esp) /* save EDI */
46+
movl %esi, 0x10(%esp) /* save ESI */
47+
movl %ebx, 0x14(%esp) /* save EBX */
48+
movl %ebp, 0x18(%esp) /* save EBP */
4449

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

4853
/* first arg of jump_fcontext() == fcontext to jump to */
49-
movl 0x20(%esp), %eax
54+
movl 0x24(%esp), %eax
5055

5156
/* second arg of jump_fcontext() == data to be transferred */
52-
movl 0x24(%esp), %edx
57+
movl 0x28(%esp), %edx
5358

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

5762
/* address of returned transport_t */
58-
movl 0x1c(%esp), %eax
63+
movl 0x20(%esp), %eax
5964
/* return parent fcontext_t */
6065
movl %ecx, (%eax)
6166
/* return data */
6267
movl %edx, 0x4(%eax)
6368

64-
movl 0x18(%esp), %ecx /* restore EIP */
69+
movl 0x1c(%esp), %ecx /* restore EIP */
6570

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

71-
movl 0x8(%esp), %edi /* restore EDI */
72-
movl 0xc(%esp), %esi /* restore ESI */
73-
movl 0x10(%esp), %ebx /* restore EBX */
74-
movl 0x14(%esp), %ebp /* restore EBP */
76+
#if defined(BOOST_CONTEXT_TLS_STACK_PROTECTOR)
77+
movl 0x8(%esp), %edx /* load stack guard */
78+
movl %edx, %gs:0x14 /* restore stack guard to TLS record */
79+
#endif
80+
81+
movl 0xc(%esp), %edi /* restore EDI */
82+
movl 0x10(%esp), %esi /* restore ESI */
83+
movl 0x14(%esp), %ebx /* restore EBX */
84+
movl 0x18(%esp), %ebp /* restore EBP */
7585

76-
leal 0x20(%esp), %esp /* prepare stack */
86+
leal 0x24(%esp), %esp /* prepare stack */
7787

7888
/* jump to context */
7989
jmp *%ecx

Zend/asm/jump_ppc32_sysv_macho_gas.S

Lines changed: 92 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -80,122 +80,122 @@ _jump_fcontext:
8080
; reserve space on stack
8181
subi r1, r1, 244
8282

83-
stfd f14, 0(r1) # save F14
84-
stfd f15, 8(r1) # save F15
85-
stfd f16, 16(r1) # save F16
86-
stfd f17, 24(r1) # save F17
87-
stfd f18, 32(r1) # save F18
88-
stfd f19, 40(r1) # save F19
89-
stfd f20, 48(r1) # save F20
90-
stfd f21, 56(r1) # save F21
91-
stfd f22, 64(r1) # save F22
92-
stfd f23, 72(r1) # save F23
93-
stfd f24, 80(r1) # save F24
94-
stfd f25, 88(r1) # save F25
95-
stfd f26, 96(r1) # save F26
96-
stfd f27, 104(r1) # save F27
97-
stfd f28, 112(r1) # save F28
98-
stfd f29, 120(r1) # save F29
99-
stfd f30, 128(r1) # save F30
100-
stfd f31, 136(r1) # save F31
101-
mffs f0 # load FPSCR
102-
stfd f0, 144(r1) # save FPSCR
83+
stfd f14, 0(r1) ; save F14
84+
stfd f15, 8(r1) ; save F15
85+
stfd f16, 16(r1) ; save F16
86+
stfd f17, 24(r1) ; save F17
87+
stfd f18, 32(r1) ; save F18
88+
stfd f19, 40(r1) ; save F19
89+
stfd f20, 48(r1) ; save F20
90+
stfd f21, 56(r1) ; save F21
91+
stfd f22, 64(r1) ; save F22
92+
stfd f23, 72(r1) ; save F23
93+
stfd f24, 80(r1) ; save F24
94+
stfd f25, 88(r1) ; save F25
95+
stfd f26, 96(r1) ; save F26
96+
stfd f27, 104(r1) ; save F27
97+
stfd f28, 112(r1) ; save F28
98+
stfd f29, 120(r1) ; save F29
99+
stfd f30, 128(r1) ; save F30
100+
stfd f31, 136(r1) ; save F31
101+
mffs f0 ; load FPSCR
102+
stfd f0, 144(r1) ; save FPSCR
103103

104-
stw r13, 152(r1) # save R13
105-
stw r14, 156(r1) # save R14
106-
stw r15, 160(r1) # save R15
107-
stw r16, 164(r1) # save R16
108-
stw r17, 168(r1) # save R17
109-
stw r18, 172(r1) # save R18
110-
stw r19, 176(r1) # save R19
111-
stw r20, 180(r1) # save R20
112-
stw r21, 184(r1) # save R21
113-
stw r22, 188(r1) # save R22
114-
stw r23, 192(r1) # save R23
115-
stw r24, 196(r1) # save R24
116-
stw r25, 200(r1) # save R25
117-
stw r26, 204(r1) # save R26
118-
stw r27, 208(r1) # save R27
119-
stw r28, 212(r1) # save R28
120-
stw r29, 216(r1) # save R29
121-
stw r30, 220(r1) # save R30
122-
stw r31, 224(r1) # save R31
123-
stw r3, 228(r1) # save hidden
104+
stw r13, 152(r1) ; save R13
105+
stw r14, 156(r1) ; save R14
106+
stw r15, 160(r1) ; save R15
107+
stw r16, 164(r1) ; save R16
108+
stw r17, 168(r1) ; save R17
109+
stw r18, 172(r1) ; save R18
110+
stw r19, 176(r1) ; save R19
111+
stw r20, 180(r1) ; save R20
112+
stw r21, 184(r1) ; save R21
113+
stw r22, 188(r1) ; save R22
114+
stw r23, 192(r1) ; save R23
115+
stw r24, 196(r1) ; save R24
116+
stw r25, 200(r1) ; save R25
117+
stw r26, 204(r1) ; save R26
118+
stw r27, 208(r1) ; save R27
119+
stw r28, 212(r1) ; save R28
120+
stw r29, 216(r1) ; save R29
121+
stw r30, 220(r1) ; save R30
122+
stw r31, 224(r1) ; save R31
123+
stw r3, 228(r1) ; save hidden
124124

125-
# save CR
125+
; save CR
126126
mfcr r0
127127
stw r0, 232(r1)
128-
# save LR
128+
; save LR
129129
mflr r0
130130
stw r0, 236(r1)
131-
# save LR as PC
131+
; save LR as PC
132132
stw r0, 240(r1)
133133

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

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

140-
lfd f14, 0(r1) # restore F14
141-
lfd f15, 8(r1) # restore F15
142-
lfd f16, 16(r1) # restore F16
143-
lfd f17, 24(r1) # restore F17
144-
lfd f18, 32(r1) # restore F18
145-
lfd f19, 40(r1) # restore F19
146-
lfd f20, 48(r1) # restore F20
147-
lfd f21, 56(r1) # restore F21
148-
lfd f22, 64(r1) # restore F22
149-
lfd f23, 72(r1) # restore F23
150-
lfd f24, 80(r1) # restore F24
151-
lfd f25, 88(r1) # restore F25
152-
lfd f26, 96(r1) # restore F26
153-
lfd f27, 104(r1) # restore F27
154-
lfd f28, 112(r1) # restore F28
155-
lfd f29, 120(r1) # restore F29
156-
lfd f30, 128(r1) # restore F30
157-
lfd f31, 136(r1) # restore F31
158-
lfd f0, 144(r1) # load FPSCR
159-
mtfsf 0xff, f0 # restore FPSCR
140+
lfd f14, 0(r1) ; restore F14
141+
lfd f15, 8(r1) ; restore F15
142+
lfd f16, 16(r1) ; restore F16
143+
lfd f17, 24(r1) ; restore F17
144+
lfd f18, 32(r1) ; restore F18
145+
lfd f19, 40(r1) ; restore F19
146+
lfd f20, 48(r1) ; restore F20
147+
lfd f21, 56(r1) ; restore F21
148+
lfd f22, 64(r1) ; restore F22
149+
lfd f23, 72(r1) ; restore F23
150+
lfd f24, 80(r1) ; restore F24
151+
lfd f25, 88(r1) ; restore F25
152+
lfd f26, 96(r1) ; restore F26
153+
lfd f27, 104(r1) ; restore F27
154+
lfd f28, 112(r1) ; restore F28
155+
lfd f29, 120(r1) ; restore F29
156+
lfd f30, 128(r1) ; restore F30
157+
lfd f31, 136(r1) ; restore F31
158+
lfd f0, 144(r1) ; load FPSCR
159+
mtfsf 0xff, f0 ; restore FPSCR
160160

161-
lwz r13, 152(r1) # restore R13
162-
lwz r14, 156(r1) # restore R14
163-
lwz r15, 160(r1) # restore R15
164-
lwz r16, 164(r1) # restore R16
165-
lwz r17, 168(r1) # restore R17
166-
lwz r18, 172(r1) # restore R18
167-
lwz r19, 176(r1) # restore R19
168-
lwz r20, 180(r1) # restore R20
169-
lwz r21, 184(r1) # restore R21
170-
lwz r22, 188(r1) # restore R22
171-
lwz r23, 192(r1) # restore R23
172-
lwz r24, 196(r1) # restore R24
173-
lwz r25, 200(r1) # restore R25
174-
lwz r26, 204(r1) # restore R26
175-
lwz r27, 208(r1) # restore R27
176-
lwz r28, 212(r1) # restore R28
177-
lwz r29, 216(r1) # restore R29
178-
lwz r30, 220(r1) # restore R30
179-
lwz r31, 224(r1) # restore R31
180-
lwz r3, 228(r1) # restore hidden
161+
lwz r13, 152(r1) ; restore R13
162+
lwz r14, 156(r1) ; restore R14
163+
lwz r15, 160(r1) ; restore R15
164+
lwz r16, 164(r1) ; restore R16
165+
lwz r17, 168(r1) ; restore R17
166+
lwz r18, 172(r1) ; restore R18
167+
lwz r19, 176(r1) ; restore R19
168+
lwz r20, 180(r1) ; restore R20
169+
lwz r21, 184(r1) ; restore R21
170+
lwz r22, 188(r1) ; restore R22
171+
lwz r23, 192(r1) ; restore R23
172+
lwz r24, 196(r1) ; restore R24
173+
lwz r25, 200(r1) ; restore R25
174+
lwz r26, 204(r1) ; restore R26
175+
lwz r27, 208(r1) ; restore R27
176+
lwz r28, 212(r1) ; restore R28
177+
lwz r29, 216(r1) ; restore R29
178+
lwz r30, 220(r1) ; restore R30
179+
lwz r31, 224(r1) ; restore R31
180+
lwz r3, 228(r1) ; restore hidden
181181

182-
# restore CR
182+
; restore CR
183183
lwz r0, 232(r1)
184184
mtcr r0
185-
# restore LR
185+
; restore LR
186186
lwz r0, 236(r1)
187187
mtlr r0
188-
# load PC
188+
; load PC
189189
lwz r0, 240(r1)
190-
# restore CTR
190+
; restore CTR
191191
mtctr r0
192192

193-
# adjust stack
193+
; adjust stack
194194
addi r1, r1, 244
195195

196-
# return transfer_t
196+
; return transfer_t
197197
stw r6, 0(r3)
198198
stw r5, 4(r3)
199199

200-
# jump to context
200+
; jump to context
201201
bctr

Zend/asm/jump_ppc64_sysv_macho_gas.S

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
* ------------------------------------------------- *
1313
* | 0 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | *
1414
* ------------------------------------------------- *
15-
* | TOC | R14 | R15 | R16 | *
15+
* | R13 | R14 | R15 | R16 | *
1616
* ------------------------------------------------- *
1717
* ------------------------------------------------- *
1818
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
@@ -61,7 +61,7 @@
6161
* ------------------------------------------------- *
6262
* | 224 | 228 | 232 | 236 | 240 | 244 | 248 | 252 | *
6363
* ------------------------------------------------- *
64-
* | TOC saved | FCTX | DATA | | *
64+
* | FCTX | DATA | | | *
6565
* ------------------------------------------------- *
6666
* *
6767
*******************************************************/
@@ -138,27 +138,27 @@ _jump_fcontext:
138138

139139
; load PC
140140
ld r12, 176(r1)
141-
# restore CTR
141+
; restore CTR
142142
mtctr r12
143143

144-
# adjust stack
144+
; adjust stack
145145
addi r1, r1, 184
146146

147-
# zero in r3 indicates first jump to context-function
147+
; zero in r3 indicates first jump to context-function
148148
cmpdi r3, 0
149149
beq use_entry_arg
150150

151-
# return transfer_t
151+
; return transfer_t
152152
std r6, 0(r3)
153153
std r5, 8(r3)
154154

155-
# jump to context
155+
; jump to context
156156
bctr
157157

158158
use_entry_arg:
159-
# copy transfer_t into transfer_fn arg registers
159+
; copy transfer_t into transfer_fn arg registers
160160
mr r3, r6
161161
mr r4, r5
162162

163-
# jump to context
163+
; jump to context
164164
bctr

0 commit comments

Comments
 (0)