TLS initialization, clone definition and _start functionality

This commit is contained in:
Robin Voetter 2019-08-29 01:14:43 +02:00
parent 57de61084e
commit b3ac323a44
3 changed files with 33 additions and 1 deletions

View File

@ -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"),
}
}

View File

@ -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.");
}

View File

@ -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)
);