authorgravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2019-08-29 01:14:43+02:00
committergravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2019-08-29 01:14:43+02:00
logb3ac323a448e1e8a816eab64777b855396afe6c8
treef3a4af6fe7a50ad021c38e96998be6cfc1afb7c9
parent57de61084e1a805838243e5428e774a591197454

TLS initialization, clone definition and _start functionality


3 files changed, 33 insertions(+), 1 deletions(-)

std/os/linux/tls.zig+3
...@@ -118,6 +118,9 @@ pub fn setThreadPointer(addr: usize) void {...@@ -118,6 +118,9 @@ pub fn setThreadPointer(addr: usize) void {
118 : [addr] "r" (addr)118 : [addr] "r" (addr)
119 );119 );
120 },120 },
121 .arm => |arm| {
122 _ = std.os.linux.syscall1(std.os.linux.SYS_set_tls, addr);
123 },
121 else => @compileError("Unsupported architecture"),124 else => @compileError("Unsupported architecture"),
122 }125 }
123}126}
std/special/c.zig+29
...@@ -238,6 +238,35 @@ nakedcc fn clone() void {...@@ -238,6 +238,35 @@ nakedcc fn clone() void {
238 \\ mov x8,#93 // SYS_exit238 \\ mov x8,#93 // SYS_exit
239 \\ svc #0239 \\ svc #0
240 );240 );
241 } else if (builtin.arch == builtin.Arch.arm) {
242 asm volatile (
243 \\ stmfd sp!,{r4,r5,r6,r7}
244 \\ mov r7,#120
245 \\ mov r6,r3
246 \\ mov r5,r0
247 \\ mov r0,r2
248 \\ and r1,r1,#-16
249 \\ ldr r2,[sp,#16]
250 \\ ldr r3,[sp,#20]
251 \\ ldr r4,[sp,#24]
252 \\ svc 0
253 \\ tst r0,r0
254 \\ beq 1f
255 \\ ldmfd sp!,{r4,r5,r6,r7}
256 \\ bx lr
257 \\
258 \\1: mov r0,r6
259 \\ tst r5,#1
260 \\ bne 1f
261 \\ mov lr,pc
262 \\ mov pc,r5
263 \\2: mov r7,#1
264 \\ svc 0
265 \\
266 \\1: mov lr,pc
267 \\ bx r5
268 \\ b 2b
269 );
241 } else {270 } else {
242 @compileError("Implement clone() for this arch.");271 @compileError("Implement clone() for this arch.");
243 }272 }
std/special/start.zig+1-1
...@@ -44,7 +44,7 @@ nakedcc fn _start() noreturn {...@@ -44,7 +44,7 @@ nakedcc fn _start() noreturn {
44 : [argc] "={esp}" (-> [*]usize)44 : [argc] "={esp}" (-> [*]usize)
45 );45 );
46 },46 },
47 .aarch64, .aarch64_be => {47 .aarch64, .aarch64_be, .arm => {
48 argc_ptr = asm ("mov %[argc], sp"48 argc_ptr = asm ("mov %[argc], sp"
49 : [argc] "=r" (-> [*]usize)49 : [argc] "=r" (-> [*]usize)
50 );50 );