From 2a155d75ac575c9a99918569249aecdf251e94d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20R=C3=B8nne=20Petersen?= Date: Sat, 8 Aug 2026 03:19:47 +0200 Subject: [PATCH] std: fix stack alignment in or1k _start and clone assembly l.andi zero-extends its operand so this would give the wrong result. Instead, use l.addi to materialize -4 and then l.and that. Rather unfortunate that the assembler doesn't reject this form. --- lib/std/os/linux/or1k.zig | 3 ++- lib/std/start.zig | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/std/os/linux/or1k.zig b/lib/std/os/linux/or1k.zig index 75dbef7623a4012cca599fd2d49cd3e9d49a6dcc..a54b9bd43ff5464c29d920d222c4988440a267d7 100644 --- a/lib/std/os/linux/or1k.zig +++ b/lib/std/os/linux/or1k.zig @@ -124,7 +124,8 @@ pub fn clone() callconv(.naked) u32 { // r11 r3, r4, r5, r6, r7 asm volatile ( \\ # Save function pointer and argument pointer on new thread stack - \\ l.andi r4, r4, -4 + \\ l.addi r13, r0, -4 + \\ l.and r4, r4, r13 \\ l.addi r4, r4, -8 \\ l.sw 0(r4), r3 \\ l.sw 4(r4), r6 diff --git a/lib/std/start.zig b/lib/std/start.zig index 0e88eed1a478b09afc6490acffa9fca4c01b1fe2..c49453246fcc59f09d717fe08a9d000a418cd891 100644 --- a/lib/std/start.zig +++ b/lib/std/start.zig @@ -326,7 +326,8 @@ fn _start() callconv(.naked) noreturn { \\ l.ori r2, r0, 0 \\ l.ori r9, r0, 0 \\ l.ori r3, r1, 0 - \\ l.andi r1, r1, -4 + \\ l.addi r13, r0, -4 + \\ l.and r1, r1, r13 \\ l.j %[posixCallMainAndExit] \\ l.nop , -- 2.54.0