Commit b3ac323a44

Robin Voetter <robin@voetter.nl>
2019-08-29 01:14:43
TLS initialization, clone definition and _start functionality
1 parent 57de610
Changed files (3)
std
os
linux
special
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"),
     }
 }
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.");
     }
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)
             );