mirror of
https://github.com/ziglang/zig.git
synced 2026-02-12 20:37:54 +00:00
TLS initialization, clone definition and _start functionality
This commit is contained in:
parent
57de61084e
commit
b3ac323a44
@ -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"),
|
||||
}
|
||||
}
|
||||
|
||||
@ -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.");
|
||||
}
|
||||
|
||||
@ -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)
|
||||
);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user