Skip to content

Commit 70b02d7

Browse files
jcourregescmb69
authored andcommitted
riscv64 support for fibers
We add riscv64 assembly files from Boost, needed for fibers support, and hook up riscv64 fibers support during configure. Closes GH-7879.
1 parent f70ca0a commit 70b02d7

File tree

4 files changed

+244
-0
lines changed

4 files changed

+244
-0
lines changed

NEWS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ PHP NEWS
1414
. Fixed bug GH-7757 (Multi-inherited final constant causes fatal error).
1515
(cmb)
1616
. Fixed zend_fibers.c build with ZEND_FIBER_UCONTEXT. (Petr Sumbera)
17+
. Added riscv64 support for fibers. (Jeremie Courreges-Anglas)
1718

1819
- Filter:
1920
. Fixed FILTER_FLAG_NO_RES_RANGE flag. (Yifan Tong)

Zend/asm/jump_riscv64_sysv_elf_gas.S

Lines changed: 150 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,150 @@
1+
/*
2+
Distributed under the Boost Software License, Version 1.0.
3+
(See accompanying file LICENSE_1_0.txt or copy at
4+
http://www.boost.org/LICENSE_1_0.txt)
5+
*/
6+
/*******************************************************
7+
* *
8+
* ------------------------------------------------- *
9+
* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
10+
* ------------------------------------------------- *
11+
* | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c| *
12+
* ------------------------------------------------- *
13+
* | fs0 | fs1 | fs2 | fs3 | *
14+
* ------------------------------------------------- *
15+
* ------------------------------------------------- *
16+
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
17+
* ------------------------------------------------- *
18+
* | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
19+
* ------------------------------------------------- *
20+
* | fs4 | fs5 | fs6 | fs7 | *
21+
* ------------------------------------------------- *
22+
* ------------------------------------------------- *
23+
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
24+
* ------------------------------------------------- *
25+
* | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c| *
26+
* ------------------------------------------------- *
27+
* | fs8 | fs9 | fs10 | fs11 | *
28+
* ------------------------------------------------- *
29+
* ------------------------------------------------- *
30+
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
31+
* ------------------------------------------------- *
32+
* | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c| *
33+
* ------------------------------------------------- *
34+
* | s0 | s1 | s2 | s3 | *
35+
* ------------------------------------------------- *
36+
* ------------------------------------------------- *
37+
* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
38+
* ------------------------------------------------- *
39+
* | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c| *
40+
* ------------------------------------------------- *
41+
* | s4 | s5 | s6 | s7 | *
42+
* ------------------------------------------------- *
43+
* ------------------------------------------------- *
44+
* | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
45+
* ------------------------------------------------- *
46+
* | 0xa0| 0xa4| 0xa8| 0xac| 0xb0| 0xb4| 0xb8| 0xbc| *
47+
* ------------------------------------------------- *
48+
* | s8 | s9 | s10 | s11 | *
49+
* ------------------------------------------------- *
50+
* ------------------------------------------------- *
51+
* | 48 | 49 | 50 | 51 | | | | | *
52+
* ------------------------------------------------- *
53+
* | 0xc0| 0xc4| 0xc8| 0xcc| | | | | *
54+
* ------------------------------------------------- *
55+
* | ra | pc | | | *
56+
* ------------------------------------------------- *
57+
* *
58+
*******************************************************/
59+
60+
.file "jump_riscv64_sysv_elf_gas.S"
61+
.text
62+
.align 1
63+
.global jump_fcontext
64+
.type jump_fcontext, %function
65+
jump_fcontext:
66+
# prepare stack for GP + FPU
67+
addi sp, sp, -0xd0
68+
69+
# save fs0 - fs11
70+
fsd fs0, 0x00(sp)
71+
fsd fs1, 0x08(sp)
72+
fsd fs2, 0x10(sp)
73+
fsd fs3, 0x18(sp)
74+
fsd fs4, 0x20(sp)
75+
fsd fs5, 0x28(sp)
76+
fsd fs6, 0x30(sp)
77+
fsd fs7, 0x38(sp)
78+
fsd fs8, 0x40(sp)
79+
fsd fs9, 0x48(sp)
80+
fsd fs10, 0x50(sp)
81+
fsd fs11, 0x58(sp)
82+
83+
# save s0-s11, ra
84+
sd s0, 0x60(sp)
85+
sd s1, 0x68(sp)
86+
sd s2, 0x70(sp)
87+
sd s3, 0x78(sp)
88+
sd s4, 0x80(sp)
89+
sd s5, 0x88(sp)
90+
sd s6, 0x90(sp)
91+
sd s7, 0x98(sp)
92+
sd s8, 0xa0(sp)
93+
sd s9, 0xa8(sp)
94+
sd s10, 0xb0(sp)
95+
sd s11, 0xb8(sp)
96+
sd ra, 0xc0(sp)
97+
98+
# save RA as PC
99+
sd ra, 0xc8(sp)
100+
101+
# store SP (pointing to context-data) in A2
102+
mv a2, sp
103+
104+
# restore SP (pointing to context-data) from A0
105+
mv sp, a0
106+
107+
# load fs0 - fs11
108+
fld fs0, 0x00(sp)
109+
fld fs1, 0x08(sp)
110+
fld fs2, 0x10(sp)
111+
fld fs3, 0x18(sp)
112+
fld fs4, 0x20(sp)
113+
fld fs5, 0x28(sp)
114+
fld fs6, 0x30(sp)
115+
fld fs7, 0x38(sp)
116+
fld fs8, 0x40(sp)
117+
fld fs9, 0x48(sp)
118+
fld fs10, 0x50(sp)
119+
fld fs11, 0x58(sp)
120+
121+
# load s0-s11,ra
122+
ld s0, 0x60(sp)
123+
ld s1, 0x68(sp)
124+
ld s2, 0x70(sp)
125+
ld s3, 0x78(sp)
126+
ld s4, 0x80(sp)
127+
ld s5, 0x88(sp)
128+
ld s6, 0x90(sp)
129+
ld s7, 0x98(sp)
130+
ld s8, 0xa0(sp)
131+
ld s9, 0xa8(sp)
132+
ld s10, 0xb0(sp)
133+
ld s11, 0xb8(sp)
134+
ld ra, 0xc0(sp)
135+
136+
# return transfer_t from jump
137+
# pass transfer_t as first arg in context function
138+
# a0 == FCTX, a1 == DATA
139+
mv a0, a2
140+
141+
# load pc
142+
ld a2, 0xc8(sp)
143+
144+
# restore stack from GP + FPU
145+
addi sp, sp, 0xd0
146+
147+
jr a2
148+
.size jump_fcontext,.-jump_fcontext
149+
# Mark that we don't need executable stack.
150+
.section .note.GNU-stack,"",%progbits

Zend/asm/make_riscv64_sysv_elf_gas.S

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/*
2+
Distributed under the Boost Software License, Version 1.0.
3+
(See accompanying file LICENSE_1_0.txt or copy at
4+
http://www.boost.org/LICENSE_1_0.txt)
5+
*/
6+
/*******************************************************
7+
* *
8+
* ------------------------------------------------- *
9+
* | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | *
10+
* ------------------------------------------------- *
11+
* | 0x0 | 0x4 | 0x8 | 0xc | 0x10| 0x14| 0x18| 0x1c| *
12+
* ------------------------------------------------- *
13+
* | fs0 | fs1 | fs2 | fs3 | *
14+
* ------------------------------------------------- *
15+
* ------------------------------------------------- *
16+
* | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | *
17+
* ------------------------------------------------- *
18+
* | 0x20| 0x24| 0x28| 0x2c| 0x30| 0x34| 0x38| 0x3c| *
19+
* ------------------------------------------------- *
20+
* | fs4 | fs5 | fs6 | fs7 | *
21+
* ------------------------------------------------- *
22+
* ------------------------------------------------- *
23+
* | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | *
24+
* ------------------------------------------------- *
25+
* | 0x40| 0x44| 0x48| 0x4c| 0x50| 0x54| 0x58| 0x5c| *
26+
* ------------------------------------------------- *
27+
* | fs8 | fs9 | fs10 | fs11 | *
28+
* ------------------------------------------------- *
29+
* ------------------------------------------------- *
30+
* | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | *
31+
* ------------------------------------------------- *
32+
* | 0x60| 0x64| 0x68| 0x6c| 0x70| 0x74| 0x78| 0x7c| *
33+
* ------------------------------------------------- *
34+
* | s0 | s1 | s2 | s3 | *
35+
* ------------------------------------------------- *
36+
* ------------------------------------------------- *
37+
* | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | *
38+
* ------------------------------------------------- *
39+
* | 0x80| 0x84| 0x88| 0x8c| 0x90| 0x94| 0x98| 0x9c| *
40+
* ------------------------------------------------- *
41+
* | s4 | s5 | s6 | s7 | *
42+
* ------------------------------------------------- *
43+
* ------------------------------------------------- *
44+
* | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | *
45+
* ------------------------------------------------- *
46+
* | 0xa0| 0xa4| 0xa8| 0xac| 0xb0| 0xb4| 0xb8| 0xbc| *
47+
* ------------------------------------------------- *
48+
* | s8 | s9 | s10 | s11 | *
49+
* ------------------------------------------------- *
50+
* ------------------------------------------------- *
51+
* | 48 | 49 | 50 | 51 | | | | | *
52+
* ------------------------------------------------- *
53+
* | 0xc0| 0xc4| 0xc8| 0xcc| | | | | *
54+
* ------------------------------------------------- *
55+
* | ra | pc | | | *
56+
* ------------------------------------------------- *
57+
* *
58+
*******************************************************/
59+
60+
.file "make_riscv64_sysv_elf_gas.S"
61+
.text
62+
.align 1
63+
.global make_fcontext
64+
.type make_fcontext, %function
65+
make_fcontext:
66+
# shift address in a0 (allocated stack) to lower 16 byte boundary
67+
andi a0, a0, ~0xF
68+
69+
# reserve space for context-data on context-stack
70+
addi a0, a0, -0xd0
71+
72+
# third arg of make_fcontext() == address of context-function
73+
# store address as a PC to jump in
74+
sd a2, 0xc8(a0)
75+
76+
# save address of finish as return-address for context-function
77+
# will be entered after context-function returns (RA register)
78+
lla a4, finish
79+
sd a4, 0xc0(a0)
80+
81+
ret // return pointer to context-data (a0)
82+
83+
finish:
84+
# exit code is zero
85+
li a0, 0
86+
# exit application
87+
tail _exit@plt
88+
89+
.size make_fcontext,.-make_fcontext
90+
# Mark that we don't need executable stack.
91+
.section .note.GNU-stack,"",%progbits

configure.ac

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1201,6 +1201,7 @@ AS_CASE([$host_cpu],
12011201
[arm*], [fiber_cpu="arm32"],
12021202
[ppc64*|powerpc64*], [fiber_cpu="ppc64"],
12031203
[ppc*|powerpc*], [fiber_cpu="ppc32"],
1204+
[riscv64*], [fiber_cpu="riscv64"],
12041205
[s390x*], [fiber_cpu="s390x"],
12051206
[mips64*], [fiber_cpu="mips64"],
12061207
[mips*], [fiber_cpu="mips32"],
@@ -1220,6 +1221,7 @@ AS_CASE([$fiber_cpu],
12201221
[arm32], [fiber_asm_file_prefix="arm_aapcs"],
12211222
[ppc64], [fiber_asm_file_prefix="ppc64_sysv"],
12221223
[ppc32], [fiber_asm_file_prefix="ppc32_sysv"],
1224+
[riscv64], [fiber_asm_file_prefix="riscv64_sysv"],
12231225
[s390x], [fiber_asm_file_prefix="s390x_sysv"],
12241226
[mips64], [fiber_asm_file_prefix="mips64_n64"],
12251227
[mips32], [fiber_asm_file_prefix="mips32_o32"],

0 commit comments

Comments
 (0)