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: {
116116 .x86,
117117 .x86_64,
118118 },
119 // Not supported yet: arm/armeb/thumb/thumbeb, hppa, hppa64, microblaze/microblazeel, xtensa/xtensaeb
119 // Not supported yet: arm/armeb/thumb/thumbeb, hppa, hppa64, microblaze/microblazeel
120120 .linux => &.{
121121 .aarch64,
122122 .aarch64_be,
lib/std/os/linux/xtensa.zig+26-4
......@@ -115,9 +115,10 @@ pub fn clone() callconv(.naked) u32 {
115115 //
116116 // syscall(SYS_clone, flags, stack, ptid, tls, ctid)
117117 // a2 a6, a3, a4, a5, a8
118 asm volatile (
118 if (builtin.abi != .call0) asm volatile (
119119 \\ entry sp, 16
120 \\
120 );
121 asm volatile (
121122 \\ movi a8, -16
122123 \\ and a3, a3, a8
123124 \\
......@@ -128,10 +129,29 @@ pub fn clone() callconv(.naked) u32 {
128129 \\ mov a8, a6
129130 \\ mov a6, a4
130131 \\ mov a4, a8
132 );
133 if (builtin.abi == .call0) asm volatile (
134 \\ l32i a8, sp, 0
135 ) else asm volatile (
131136 \\ l32i a8, sp, 16
137 );
138 asm volatile (
132139 \\ movi a2, 116 // SYS_clone
133140 \\ syscall
141 );
142 if (builtin.abi == .call0) asm volatile (
143 \\ beqz a2, 1f
144 \\ // parent
145 \\ ret
134146 \\
147 \\ // child
148 \\1:
149 \\ movi a15, 0
150 \\ movi a0, 0
151 \\
152 \\ mov a2, a10
153 \\ callx0 a9
154 ) else asm volatile (
135155 \\ beqz a2, 1f
136156 \\ // parent
137157 \\ retw
......@@ -141,8 +161,10 @@ pub fn clone() callconv(.naked) u32 {
141161 \\ movi a7, 0
142162 \\ movi a0, 0
143163 \\
144 \\ mov a2, a10
145 \\ callx0 a9
164 \\ mov a6, a10
165 \\ callx4 a9
166 );
167 asm volatile (
146168 \\ movi a2, 118 // SYS_exit
147169 \\ syscall
148170 );
lib/std/pie.zig-2
......@@ -270,9 +270,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn {
270270 // embedded constant. Note that `call0` is a 3-byte instruction, so we need both
271271 // `.balign` directives to be safe.
272272 \\ .balign 4
273 \\ .begin no-transform
274273 \\ call0 1f
275 \\ .end no-transform
276274 \\ .balign 4
277275 \\ .word _DYNAMIC - .
278276 \\1:
lib/std/start.zig+16-8
......@@ -487,14 +487,22 @@ fn _start() callconv(.naked) noreturn {
487487 \\ sub %%sp, 2047, %%sp
488488 \\ ba,a %[posixCallMainAndExit]
489489 ,
490 .xtensa, .xtensaeb =>
491 // a0 = LR, a7 = FP, a1 = SP
492 \\ movi a0, 0
493 \\ movi a7, 0
494 \\ mov a2, sp
495 \\ movi a8, -16
496 \\ and sp, sp, a8
497 \\ callx0 %[posixCallMainAndExit]
490 .xtensa, .xtensaeb => if (builtin.abi == .call0)
491 // a0 = LR, a15 = FP, a1 = SP
492 \\ movi a0, 0
493 \\ movi a15, 0
494 \\ mov a2, sp
495 \\ movi a8, -16
496 \\ and sp, sp, a8
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]
498506 ,
499507 else => @compileError("unsupported arch"),
500508 }