authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-05-29 14:40:42+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2026-05-29 14:40:42+02:00
logc5a61e8998742ee0627afd80f35008b5d2703e61
treeb512a2969c5d8fe3611088be4b7c743f480fd72e
parent9c79c784acff94a76fe931a422ef6fecbbb3066b
parent7dfa64eb263a2dc3453a6667ca2f843202e11b31

Merge pull request 'std: add `xtensa-linux-call0` support + fix some mistakes in #35463' (#35527) from alexrp/zig:xtensa-linux-call0 into master

Reviewed-on: https://codeberg.org/ziglang/zig/pulls/35527

4 files changed, 43 insertions(+), 15 deletions(-)

lib/std/debug/SelfInfo/Elf.zig+1-1
...@@ -116,7 +116,7 @@ pub const can_unwind: bool = s: {...@@ -116,7 +116,7 @@ pub const can_unwind: bool = s: {
116 .x86,116 .x86,
117 .x86_64,117 .x86_64,
118 },118 },
119 // Not supported yet: arm/armeb/thumb/thumbeb, hppa, hppa64, microblaze/microblazeel, xtensa/xtensaeb119 // Not supported yet: arm/armeb/thumb/thumbeb, hppa, hppa64, microblaze/microblazeel
120 .linux => &.{120 .linux => &.{
121 .aarch64,121 .aarch64,
122 .aarch64_be,122 .aarch64_be,
lib/std/os/linux/xtensa.zig+26-4
...@@ -115,9 +115,10 @@ pub fn clone() callconv(.naked) u32 {...@@ -115,9 +115,10 @@ pub fn clone() callconv(.naked) u32 {
115 //115 //
116 // syscall(SYS_clone, flags, stack, ptid, tls, ctid)116 // syscall(SYS_clone, flags, stack, ptid, tls, ctid)
117 // a2 a6, a3, a4, a5, a8117 // a2 a6, a3, a4, a5, a8
118 asm volatile (118 if (builtin.abi != .call0) asm volatile (
119 \\ entry sp, 16119 \\ entry sp, 16
120 \\120 );
121 asm volatile (
121 \\ movi a8, -16122 \\ movi a8, -16
122 \\ and a3, a3, a8123 \\ and a3, a3, a8
123 \\124 \\
...@@ -128,10 +129,29 @@ pub fn clone() callconv(.naked) u32 {...@@ -128,10 +129,29 @@ pub fn clone() callconv(.naked) u32 {
128 \\ mov a8, a6129 \\ mov a8, a6
129 \\ mov a6, a4130 \\ mov a6, a4
130 \\ mov a4, a8131 \\ mov a4, a8
132 );
133 if (builtin.abi == .call0) asm volatile (
134 \\ l32i a8, sp, 0
135 ) else asm volatile (
131 \\ l32i a8, sp, 16136 \\ l32i a8, sp, 16
137 );
138 asm volatile (
132 \\ movi a2, 116 // SYS_clone139 \\ movi a2, 116 // SYS_clone
133 \\ syscall140 \\ syscall
141 );
142 if (builtin.abi == .call0) asm volatile (
143 \\ beqz a2, 1f
144 \\ // parent
145 \\ ret
134 \\146 \\
147 \\ // child
148 \\1:
149 \\ movi a15, 0
150 \\ movi a0, 0
151 \\
152 \\ mov a2, a10
153 \\ callx0 a9
154 ) else asm volatile (
135 \\ beqz a2, 1f155 \\ beqz a2, 1f
136 \\ // parent156 \\ // parent
137 \\ retw157 \\ retw
...@@ -141,8 +161,10 @@ pub fn clone() callconv(.naked) u32 {...@@ -141,8 +161,10 @@ pub fn clone() callconv(.naked) u32 {
141 \\ movi a7, 0161 \\ movi a7, 0
142 \\ movi a0, 0162 \\ movi a0, 0
143 \\163 \\
144 \\ mov a2, a10164 \\ mov a6, a10
145 \\ callx0 a9165 \\ callx4 a9
166 );
167 asm volatile (
146 \\ movi a2, 118 // SYS_exit168 \\ movi a2, 118 // SYS_exit
147 \\ syscall169 \\ syscall
148 );170 );
lib/std/pie.zig-2
...@@ -270,9 +270,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {...@@ -270,9 +270,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
270 // embedded constant. Note that `call0` is a 3-byte instruction, so we need both270 // embedded constant. Note that `call0` is a 3-byte instruction, so we need both
271 // `.balign` directives to be safe.271 // `.balign` directives to be safe.
272 \\ .balign 4272 \\ .balign 4
273 \\ .begin no-transform
274 \\ call0 1f273 \\ call0 1f
275 \\ .end no-transform
276 \\ .balign 4274 \\ .balign 4
277 \\ .word _DYNAMIC - .275 \\ .word _DYNAMIC - .
278 \\1:276 \\1:
lib/std/start.zig+16-8
...@@ -487,14 +487,22 @@ fn _start() callconv(.naked) noreturn {...@@ -487,14 +487,22 @@ fn _start() callconv(.naked) noreturn {
487 \\ sub %%sp, 2047, %%sp487 \\ sub %%sp, 2047, %%sp
488 \\ ba,a %[posixCallMainAndExit]488 \\ ba,a %[posixCallMainAndExit]
489 ,489 ,
490 .xtensa, .xtensaeb =>490 .xtensa, .xtensaeb => if (builtin.abi == .call0)
491 // a0 = LR, a7 = FP, a1 = SP491 // a0 = LR, a15 = FP, a1 = SP
492 \\ movi a0, 0492 \\ movi a0, 0
493 \\ movi a7, 0493 \\ movi a15, 0
494 \\ mov a2, sp494 \\ mov a2, sp
495 \\ movi a8, -16495 \\ movi a8, -16
496 \\ and sp, sp, a8496 \\ and sp, sp, a8
497 \\ callx0 %[posixCallMainAndExit]497 \\ call0 %[posixCallMainAndExit]
498 else
499 // a0 = LR, a7 = FP, a1 = SP
500 \\ movi a0, 0
501 \\ movi a7, 0
502 \\ mov a6, sp
503 \\ movi a8, -16
504 \\ and sp, sp, a8
505 \\ call4 %[posixCallMainAndExit]
498 ,506 ,
499 else => @compileError("unsupported arch"),507 else => @compileError("unsupported arch"),
500 }508 }