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, diff --git a/lib/std/os/linux/xtensa.zig b/lib/std/os/linux/xtensa.zig index 7a4c065c7328fc48fdd64e512e5471f7a3dbf7e8..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,21 +129,42 @@ 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 - \\ retw + \\ ret \\ \\ // child \\1: - \\ movi a7, 0 + \\ movi a15, 0 \\ movi a0, 0 \\ \\ mov a2, a10 \\ callx0 a9 + ) else asm volatile ( + \\ beqz a2, 1f + \\ // parent + \\ retw + \\ + \\ // child + \\1: + \\ movi a7, 0 + \\ movi a0, 0 + \\ + \\ mov a6, a10 + \\ callx4 a9 + ); + asm volatile ( \\ movi a2, 118 // SYS_exit \\ syscall ); 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: diff --git a/lib/std/start.zig b/lib/std/start.zig index e8478384d52c25568598deddabe8f99c712c219b..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 a2, sp - \\ movi a8, -16 - \\ and sp, sp, a8 - \\ callx0 %[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"), }