Commit b3ac323a44
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)
);