diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2020-10-22 17:39:26 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-10-22 17:39:26 -0400 |
| commit | e02655798fbd97a069ee8be38a6eceac18335a4d (patch) | |
| tree | 29cd77dacb2f60f1258cdfd6a7e00e7d52735d82 /lib/std/start.zig | |
| parent | e6ac082437b87fccf6a7e592f813d3403427e512 (diff) | |
| parent | 39e34081ca9ed3bee0b850bdbf44068b163d1062 (diff) | |
| download | zig-e02655798fbd97a069ee8be38a6eceac18335a4d.tar.gz zig-e02655798fbd97a069ee8be38a6eceac18335a4d.zip | |
Merge pull request #6743 from LemonBoy/someppc64stuff
Some ppc64 stuff
Diffstat (limited to 'lib/std/start.zig')
| -rw-r--r-- | lib/std/start.zig | 45 |
1 files changed, 24 insertions, 21 deletions
diff --git a/lib/std/start.zig b/lib/std/start.zig index b8e0de9574..c6f05e790c 100644 --- a/lib/std/start.zig +++ b/lib/std/start.zig @@ -102,46 +102,49 @@ fn _start() callconv(.Naked) noreturn { switch (builtin.arch) { .x86_64 => { - starting_stack_ptr = asm ("" + starting_stack_ptr = asm volatile ( + \\ xor %%rbp, %%rbp : [argc] "={rsp}" (-> [*]usize) ); }, .i386 => { - starting_stack_ptr = asm ("" + starting_stack_ptr = asm volatile ( + \\ xor %%ebp, %%ebp : [argc] "={esp}" (-> [*]usize) ); }, - .aarch64, .aarch64_be, .arm => { - starting_stack_ptr = asm ("mov %[argc], sp" - : [argc] "=r" (-> [*]usize) + .aarch64, .aarch64_be, .arm, .armeb => { + starting_stack_ptr = asm volatile ( + \\ mov fp, #0 + \\ mov lr, #0 + : [argc] "={sp}" (-> [*]usize) ); }, .riscv64 => { - starting_stack_ptr = asm ("mv %[argc], sp" - : [argc] "=r" (-> [*]usize) + starting_stack_ptr = asm volatile ( + \\ li s0, 0 + \\ li ra, 0 + : [argc] "={sp}" (-> [*]usize) ); }, .mips, .mipsel => { - // Need noat here because LLVM is free to pick any register - starting_stack_ptr = asm ( - \\ .set noat - \\ move %[argc], $sp - : [argc] "=r" (-> [*]usize) + // The lr is already zeroed on entry, as specified by the ABI. + starting_stack_ptr = asm volatile ( + \\ move $fp, $0 + : [argc] "={sp}" (-> [*]usize) ); }, .powerpc64le => { - // Before returning the stack pointer, we have to set up a backchain - // and a few other registers required by the ELFv2 ABI. + // Setup the initial stack frame and clear the back chain pointer. // TODO: Support powerpc64 (big endian) on ELFv2. - starting_stack_ptr = asm ( + starting_stack_ptr = asm volatile ( \\ mr 4, 1 - \\ subi 1, 1, 32 - \\ li 5, 0 - \\ std 5, 0(1) - \\ mr %[argc], 4 - : [argc] "=r" (-> [*]usize) + \\ li 0, 0 + \\ stdu 0, -32(1) + \\ mtlr 0 + : [argc] "={r4}" (-> [*]usize) : - : "r4", "r5" + : "r0" ); }, else => @compileError("unsupported arch"), |
