From b3ac323a448e1e8a816eab64777b855396afe6c8 Mon Sep 17 00:00:00 2001 From: Robin Voetter Date: Thu, 29 Aug 2019 01:14:43 +0200 Subject: [PATCH] TLS initialization, clone definition and _start functionality --- std/os/linux/tls.zig | 3 +++ std/special/c.zig | 29 +++++++++++++++++++++++++++++ std/special/start.zig | 2 +- 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/std/os/linux/tls.zig b/std/os/linux/tls.zig index a10d68663b..63c44d6982 100644 --- a/std/os/linux/tls.zig +++ b/std/os/linux/tls.zig @@ -118,6 +118,9 @@ pub fn setThreadPointer(addr: usize) void { : [addr] "r" (addr) ); }, + .arm => |arm| { + _ = std.os.linux.syscall1(std.os.linux.SYS_set_tls, addr); + }, else => @compileError("Unsupported architecture"), } } diff --git a/std/special/c.zig b/std/special/c.zig index 7300b8bf74..5ac7457429 100644 --- a/std/special/c.zig +++ b/std/special/c.zig @@ -238,6 +238,35 @@ nakedcc fn clone() void { \\ mov x8,#93 // SYS_exit \\ svc #0 ); + } else if (builtin.arch == builtin.Arch.arm) { + asm volatile ( + \\ stmfd sp!,{r4,r5,r6,r7} + \\ mov r7,#120 + \\ mov r6,r3 + \\ mov r5,r0 + \\ mov r0,r2 + \\ and r1,r1,#-16 + \\ ldr r2,[sp,#16] + \\ ldr r3,[sp,#20] + \\ ldr r4,[sp,#24] + \\ svc 0 + \\ tst r0,r0 + \\ beq 1f + \\ ldmfd sp!,{r4,r5,r6,r7} + \\ bx lr + \\ + \\1: mov r0,r6 + \\ tst r5,#1 + \\ bne 1f + \\ mov lr,pc + \\ mov pc,r5 + \\2: mov r7,#1 + \\ svc 0 + \\ + \\1: mov lr,pc + \\ bx r5 + \\ b 2b + ); } else { @compileError("Implement clone() for this arch."); } diff --git a/std/special/start.zig b/std/special/start.zig index 3427ff422d..fde79a4baf 100644 --- a/std/special/start.zig +++ b/std/special/start.zig @@ -44,7 +44,7 @@ nakedcc fn _start() noreturn { : [argc] "={esp}" (-> [*]usize) ); }, - .aarch64, .aarch64_be => { + .aarch64, .aarch64_be, .arm => { argc_ptr = asm ("mov %[argc], sp" : [argc] "=r" (-> [*]usize) );