starting_stack_ptr -> argc_argv_ptr to reflect actual use

This commit is contained in:
Koakuma 2020-10-27 22:46:18 +07:00
parent cbc8750502
commit 2b87cc7ed3

View file

@ -11,7 +11,7 @@ const builtin = std.builtin;
const assert = std.debug.assert; const assert = std.debug.assert;
const uefi = std.os.uefi; const uefi = std.os.uefi;
var starting_stack_ptr: [*]usize = undefined; var argc_argv_ptr: [*]usize = undefined;
const start_sym_name = if (builtin.arch.isMIPS()) "__start" else "_start"; const start_sym_name = if (builtin.arch.isMIPS()) "__start" else "_start";
@ -102,26 +102,26 @@ fn _start() callconv(.Naked) noreturn {
switch (builtin.arch) { switch (builtin.arch) {
.x86_64 => { .x86_64 => {
starting_stack_ptr = asm volatile ( argc_argv_ptr = asm volatile (
\\ xor %%rbp, %%rbp \\ xor %%rbp, %%rbp
: [argc] "={rsp}" (-> [*]usize) : [argc] "={rsp}" (-> [*]usize)
); );
}, },
.i386 => { .i386 => {
starting_stack_ptr = asm volatile ( argc_argv_ptr = asm volatile (
\\ xor %%ebp, %%ebp \\ xor %%ebp, %%ebp
: [argc] "={esp}" (-> [*]usize) : [argc] "={esp}" (-> [*]usize)
); );
}, },
.aarch64, .aarch64_be, .arm, .armeb => { .aarch64, .aarch64_be, .arm, .armeb => {
starting_stack_ptr = asm volatile ( argc_argv_ptr = asm volatile (
\\ mov fp, #0 \\ mov fp, #0
\\ mov lr, #0 \\ mov lr, #0
: [argc] "={sp}" (-> [*]usize) : [argc] "={sp}" (-> [*]usize)
); );
}, },
.riscv64 => { .riscv64 => {
starting_stack_ptr = asm volatile ( argc_argv_ptr = asm volatile (
\\ li s0, 0 \\ li s0, 0
\\ li ra, 0 \\ li ra, 0
: [argc] "={sp}" (-> [*]usize) : [argc] "={sp}" (-> [*]usize)
@ -129,7 +129,7 @@ fn _start() callconv(.Naked) noreturn {
}, },
.mips, .mipsel => { .mips, .mipsel => {
// The lr is already zeroed on entry, as specified by the ABI. // The lr is already zeroed on entry, as specified by the ABI.
starting_stack_ptr = asm volatile ( argc_argv_ptr = asm volatile (
\\ move $fp, $0 \\ move $fp, $0
: [argc] "={sp}" (-> [*]usize) : [argc] "={sp}" (-> [*]usize)
); );
@ -137,7 +137,7 @@ fn _start() callconv(.Naked) noreturn {
.powerpc64le => { .powerpc64le => {
// Setup the initial stack frame and clear the back chain pointer. // Setup the initial stack frame and clear the back chain pointer.
// TODO: Support powerpc64 (big endian) on ELFv2. // TODO: Support powerpc64 (big endian) on ELFv2.
starting_stack_ptr = asm volatile ( argc_argv_ptr = asm volatile (
\\ mr 4, 1 \\ mr 4, 1
\\ li 0, 0 \\ li 0, 0
\\ stdu 0, -32(1) \\ stdu 0, -32(1)
@ -149,7 +149,7 @@ fn _start() callconv(.Naked) noreturn {
}, },
.sparcv9 => { .sparcv9 => {
// argc is stored after a register window (16 registers) plus stack bias // argc is stored after a register window (16 registers) plus stack bias
starting_stack_ptr = asm ( argc_argv_ptr = asm (
\\ mov %%g0, %%i6 \\ mov %%g0, %%i6
\\ add %%o6, 2175, %[argc] \\ add %%o6, 2175, %[argc]
: [argc] "=r" (-> [*]usize) : [argc] "=r" (-> [*]usize)
@ -190,8 +190,8 @@ fn posixCallMainAndExit() noreturn {
if (builtin.os.tag == .freebsd) { if (builtin.os.tag == .freebsd) {
@setAlignStack(16); @setAlignStack(16);
} }
const argc = starting_stack_ptr[0]; const argc = argc_argv_ptr[0];
const argv = @ptrCast([*][*:0]u8, starting_stack_ptr + 1); const argv = @ptrCast([*][*:0]u8, argc_argv_ptr + 1);
const envp_optional = @ptrCast([*:null]?[*:0]u8, @alignCast(@alignOf(usize), argv + argc + 1)); const envp_optional = @ptrCast([*:null]?[*:0]u8, @alignCast(@alignOf(usize), argv + argc + 1));
var envp_count: usize = 0; var envp_count: usize = 0;