| author | |
| committer | |
| log | b3ac323a448e1e8a816eab64777b855396afe6c8 |
| tree | f3a4af6fe7a50ad021c38e96998be6cfc1afb7c9 |
| parent | 57de61084e1a805838243e5428e774a591197454 |
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_exit | 238 | \\ mov x8,#93 // SYS_exit |
| 239 | \\ svc #0 | 239 | \\ 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 | ); |