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) }