From 8dd692e0345f2dacb8b4fe9fb1a94eb00976eacc Mon Sep 17 00:00:00 2001 From: Eduard Urbach Date: Sat, 11 Jul 2026 12:51:12 +0200 Subject: [PATCH] Fixed incorrect stack layout on arm64 --- lib/thread/thread_linux_arm.q | 20 +++++++++++++++++++ .../{thread_linux.q => thread_linux_x86.q} | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 lib/thread/thread_linux_arm.q rename lib/thread/{thread_linux.q => thread_linux_x86.q} (93%) diff --git a/lib/thread/thread_linux_arm.q b/lib/thread/thread_linux_arm.q new file mode 100644 index 0000000..f427353 --- /dev/null +++ b/lib/thread/thread_linux_arm.q @@ -0,0 +1,20 @@ +import mem +import process + +create(func any) -> (tid int) { + stack := mem.mmap(0, STACK_SIZE, mem.read|mem.write, mem.private|mem.anonymous, -1, 0) + tls := stack + STACK_SIZE - 32 + entry := tls - 32 + [entry as *uint64] = func as uint64 + [entry + 16 as *uint64] = end as uint64 + args := entry - 88 as *process.CloneArgs + args.flags = CLONE_THREAD | CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_IO | CLONE_SIGHAND | CLONE_SETTLS + args.stack = stack as uint64 + args.stack_size = STACK_SIZE - 32 - 32 + args.tls = tls as uint64 + return process.clone3(args, 88) +} + +end() { + syscall(_exit, 0) +} \ No newline at end of file diff --git a/lib/thread/thread_linux.q b/lib/thread/thread_linux_x86.q similarity index 93% rename from lib/thread/thread_linux.q rename to lib/thread/thread_linux_x86.q index cf7fa63..5acd919 100644 --- a/lib/thread/thread_linux.q +++ b/lib/thread/thread_linux_x86.q @@ -10,7 +10,7 @@ create(func any) -> (tid int) { args := entry - 88 as *process.CloneArgs args.flags = CLONE_THREAD | CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_IO | CLONE_SIGHAND | CLONE_SETTLS args.stack = stack as uint64 - args.stack_size = STACK_SIZE - 48 + args.stack_size = STACK_SIZE - 32 - 16 args.tls = tls as uint64 return process.clone3(args, 88) } -- 2.51.2