| ... | @@ -63,6 +63,7 @@ const Variant = enum { | ... | @@ -63,6 +63,7 @@ const Variant = enum { |
| 63 | }; | 63 | }; |
| 64 | | 64 | |
| 65 | const current_variant: Variant = switch (native_arch) { | 65 | const current_variant: Variant = switch (native_arch) { |
| | 66 | .arc, |
| 66 | .arm, | 67 | .arm, |
| 67 | .armeb, | 68 | .armeb, |
| 68 | .aarch64, | 69 | .aarch64, |
| ... | @@ -239,6 +240,16 @@ pub fn setThreadPointer(addr: usize) void { | ... | @@ -239,6 +240,16 @@ pub fn setThreadPointer(addr: usize) void { |
| 239 | : [addr] "r" (addr), | 240 | : [addr] "r" (addr), |
| 240 | ); | 241 | ); |
| 241 | }, | 242 | }, |
| | 243 | .arc => { |
| | 244 | // We apparently need to both set r25 (TP) *and* inform the kernel... |
| | 245 | asm volatile ( |
| | 246 | \\ mov r25, %[addr] |
| | 247 | : |
| | 248 | : [addr] "r" (addr), |
| | 249 | ); |
| | 250 | const rc = @call(.always_inline, linux.syscall1, .{ .arc_settls, addr }); |
| | 251 | assert(rc == 0); |
| | 252 | }, |
| 242 | .arm, .armeb, .thumb, .thumbeb => { | 253 | .arm, .armeb, .thumb, .thumbeb => { |
| 243 | const rc = @call(.always_inline, linux.syscall1, .{ .set_tls, addr }); | 254 | const rc = @call(.always_inline, linux.syscall1, .{ .set_tls, addr }); |
| 244 | assert(rc == 0); | 255 | assert(rc == 0); |