From 64958c2b1746bdc5e761720ceeddafbb91f352bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 29 May 2026 07:26:21 +0200 Subject: [PATCH 1/5] std.debug.SelfInfo.Elf: xtensa does not support DWARF CFI --- lib/std/debug/SelfInfo/Elf.zig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/std/debug/SelfInfo/Elf.zig b/lib/std/debug/SelfInfo/Elf.zig index 50274e5f7e7cf708caace875179ed7595771f492..c3124902008f0b45347b939b0d49aff7164c5c34 100644 --- a/lib/std/debug/SelfInfo/Elf.zig +++ b/lib/std/debug/SelfInfo/Elf.zig @@ -116,7 +116,7 @@ pub const can_unwind: bool = s: { .x86, .x86_64, }, - // Not supported yet: arm/armeb/thumb/thumbeb, hppa, hppa64, microblaze/microblazeel, xtensa/xtensaeb + // Not supported yet: arm/armeb/thumb/thumbeb, hppa, hppa64, microblaze/microblazeel .linux => &.{ .aarch64, .aarch64_be, -- 2.54.0 From 0c6c63c116b54050ac6fbb07a4748d908f574ba9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 29 May 2026 07:43:53 +0200 Subject: [PATCH 2/5] std.pie: the xtensa call0 instruction does not have a dense encoding --- lib/std/pie.zig | 2 -- 1 file changed, 2 deletions(-) diff --git a/lib/std/pie.zig b/lib/std/pie.zig index 504bff815c7a1c55e25a3a4d9b8e700dbe338188..8d7ac3fa7c447ed7f73a616a982daa321bc87960 100644 --- a/lib/std/pie.zig +++ b/lib/std/pie.zig @@ -270,9 +270,7 @@ inline fn getDynamicSymbol() [*]const elf.Dyn { // embedded constant. Note that `call0` is a 3-byte instruction, so we need both // `.balign` directives to be safe. \\ .balign 4 - \\ .begin no-transform \\ call0 1f - \\ .end no-transform \\ .balign 4 \\ .word _DYNAMIC - . \\1: -- 2.54.0 From 7e51c731b85f15dc6898e57301c51802e43a924a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 29 May 2026 08:06:41 +0200 Subject: [PATCH 3/5] std: fix xtensa windowed ABI compliance in inline assembly --- lib/std/os/linux/xtensa.zig | 4 ++-- lib/std/start.zig | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/std/os/linux/xtensa.zig b/lib/std/os/linux/xtensa.zig index 7a4c065c7328fc48fdd64e512e5471f7a3dbf7e8..a54c8f13d2040cff3d31a3426f812258df1faece 100644 --- a/lib/std/os/linux/xtensa.zig +++ b/lib/std/os/linux/xtensa.zig @@ -141,8 +141,8 @@ pub fn clone() callconv(.naked) u32 { \\ movi a7, 0 \\ movi a0, 0 \\ - \\ mov a2, a10 - \\ callx0 a9 + \\ mov a6, a10 + \\ callx4 a9 \\ movi a2, 118 // SYS_exit \\ syscall ); diff --git a/lib/std/start.zig b/lib/std/start.zig index e8478384d52c25568598deddabe8f99c712c219b..b3c192216fe1cf1b3e124c71ebcbc4dd37cf0c80 100644 --- a/lib/std/start.zig +++ b/lib/std/start.zig @@ -491,10 +491,10 @@ fn _start() callconv(.naked) noreturn { // a0 = LR, a7 = FP, a1 = SP \\ movi a0, 0 \\ movi a7, 0 - \\ mov a2, sp + \\ mov a6, sp \\ movi a8, -16 \\ and sp, sp, a8 - \\ callx0 %[posixCallMainAndExit] + \\ call4 %[posixCallMainAndExit] , else => @compileError("unsupported arch"), } -- 2.54.0 From a80ff87a04acff1cd5e5c0496a65d2dbed823c0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 29 May 2026 08:20:27 +0200 Subject: [PATCH 4/5] std.start: add xtensa call0 support --- lib/std/start.zig | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/lib/std/start.zig b/lib/std/start.zig index b3c192216fe1cf1b3e124c71ebcbc4dd37cf0c80..5ff0ce9dfe8c2bf6d18825b6ae0d184d610274c6 100644 --- a/lib/std/start.zig +++ b/lib/std/start.zig @@ -487,14 +487,22 @@ fn _start() callconv(.naked) noreturn { \\ sub %%sp, 2047, %%sp \\ ba,a %[posixCallMainAndExit] , - .xtensa, .xtensaeb => - // a0 = LR, a7 = FP, a1 = SP - \\ movi a0, 0 - \\ movi a7, 0 - \\ mov a6, sp - \\ movi a8, -16 - \\ and sp, sp, a8 - \\ call4 %[posixCallMainAndExit] + .xtensa, .xtensaeb => if (builtin.abi == .call0) + // a0 = LR, a15 = FP, a1 = SP + \\ movi a0, 0 + \\ movi a15, 0 + \\ mov a2, sp + \\ movi a8, -16 + \\ and sp, sp, a8 + \\ call0 %[posixCallMainAndExit] + else + // a0 = LR, a7 = FP, a1 = SP + \\ movi a0, 0 + \\ movi a7, 0 + \\ mov a6, sp + \\ movi a8, -16 + \\ and sp, sp, a8 + \\ call4 %[posixCallMainAndExit] , else => @compileError("unsupported arch"), } -- 2.54.0 From 7dfa64eb263a2dc3453a6667ca2f843202e11b31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Fri, 29 May 2026 08:20:36 +0200 Subject: [PATCH 5/5] std.os.linux.xtensa: add call0 support --- lib/std/os/linux/xtensa.zig | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/lib/std/os/linux/xtensa.zig b/lib/std/os/linux/xtensa.zig index a54c8f13d2040cff3d31a3426f812258df1faece..95b81eb4d1ba7882dacc3b29f082eb3331695a81 100644 --- a/lib/std/os/linux/xtensa.zig +++ b/lib/std/os/linux/xtensa.zig @@ -115,9 +115,10 @@ pub fn clone() callconv(.naked) u32 { // // syscall(SYS_clone, flags, stack, ptid, tls, ctid) // a2 a6, a3, a4, a5, a8 - asm volatile ( + if (builtin.abi != .call0) asm volatile ( \\ entry sp, 16 - \\ + ); + asm volatile ( \\ movi a8, -16 \\ and a3, a3, a8 \\ @@ -128,10 +129,29 @@ pub fn clone() callconv(.naked) u32 { \\ mov a8, a6 \\ mov a6, a4 \\ mov a4, a8 + ); + if (builtin.abi == .call0) asm volatile ( + \\ l32i a8, sp, 0 + ) else asm volatile ( \\ l32i a8, sp, 16 + ); + asm volatile ( \\ movi a2, 116 // SYS_clone \\ syscall + ); + if (builtin.abi == .call0) asm volatile ( + \\ beqz a2, 1f + \\ // parent + \\ ret \\ + \\ // child + \\1: + \\ movi a15, 0 + \\ movi a0, 0 + \\ + \\ mov a2, a10 + \\ callx0 a9 + ) else asm volatile ( \\ beqz a2, 1f \\ // parent \\ retw @@ -143,6 +163,8 @@ pub fn clone() callconv(.naked) u32 { \\ \\ mov a6, a10 \\ callx4 a9 + ); + asm volatile ( \\ movi a2, 118 // SYS_exit \\ syscall ); -- 2.54.0