authorgravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-07-28 21:10:16+02:00
committergravatar for alex@alexrp.comAlex Rønne Petersen <alex@alexrp.com> 2024-07-30 02:33:16+02:00
log9abe3aeeea2f9b1d301a11046d43be279bf24fd5
treea9e29692ddb22eac617b1ef757fc6207ff42304e
parente6fe7a329ab42d259437b83a4294009feae7bfcd
signaturebadge-check Signed by SSH key SHA256:7B/LJ7bpR1eX8aCXSr4mtd5M45VMPKcx9zY8e95b5QM

std.os.linux.tls: Add arc support.


1 files changed, 11 insertions(+), 0 deletions(-)

lib/std/os/linux/tls.zig+11
...@@ -63,6 +63,7 @@ const Variant = enum {...@@ -63,6 +63,7 @@ const Variant = enum {
63};63};
6464
65const current_variant: Variant = switch (native_arch) {65const 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);