| ... | @@ -11,7 +11,7 @@ const builtin = std.builtin; | ... | @@ -11,7 +11,7 @@ const builtin = std.builtin; |
| 11 | const assert = std.debug.assert; | 11 | const assert = std.debug.assert; |
| 12 | const uefi = std.os.uefi; | 12 | const uefi = std.os.uefi; |
| 13 | | 13 | |
| 14 | var starting_stack_ptr: [*]usize = undefined; | 14 | var argc_argv_ptr: [*]usize = undefined; |
| 15 | | 15 | |
| 16 | const start_sym_name = if (builtin.arch.isMIPS()) "__start" else "_start"; | 16 | const start_sym_name = if (builtin.arch.isMIPS()) "__start" else "_start"; |
| 17 | | 17 | |
| ... | @@ -102,26 +102,26 @@ fn _start() callconv(.Naked) noreturn { | ... | @@ -102,26 +102,26 @@ fn _start() callconv(.Naked) noreturn { |
| 102 | | 102 | |
| 103 | switch (builtin.arch) { | 103 | switch (builtin.arch) { |
| 104 | .x86_64 => { | 104 | .x86_64 => { |
| 105 | starting_stack_ptr = asm volatile ( | 105 | argc_argv_ptr = asm volatile ( |
| 106 | \\ xor %%rbp, %%rbp | 106 | \\ xor %%rbp, %%rbp |
| 107 | : [argc] "={rsp}" (-> [*]usize) | 107 | : [argc] "={rsp}" (-> [*]usize) |
| 108 | ); | 108 | ); |
| 109 | }, | 109 | }, |
| 110 | .i386 => { | 110 | .i386 => { |
| 111 | starting_stack_ptr = asm volatile ( | 111 | argc_argv_ptr = asm volatile ( |
| 112 | \\ xor %%ebp, %%ebp | 112 | \\ xor %%ebp, %%ebp |
| 113 | : [argc] "={esp}" (-> [*]usize) | 113 | : [argc] "={esp}" (-> [*]usize) |
| 114 | ); | 114 | ); |
| 115 | }, | 115 | }, |
| 116 | .aarch64, .aarch64_be, .arm, .armeb => { | 116 | .aarch64, .aarch64_be, .arm, .armeb => { |
| 117 | starting_stack_ptr = asm volatile ( | 117 | argc_argv_ptr = asm volatile ( |
| 118 | \\ mov fp, #0 | 118 | \\ mov fp, #0 |
| 119 | \\ mov lr, #0 | 119 | \\ mov lr, #0 |
| 120 | : [argc] "={sp}" (-> [*]usize) | 120 | : [argc] "={sp}" (-> [*]usize) |
| 121 | ); | 121 | ); |
| 122 | }, | 122 | }, |
| 123 | .riscv64 => { | 123 | .riscv64 => { |
| 124 | starting_stack_ptr = asm volatile ( | 124 | argc_argv_ptr = asm volatile ( |
| 125 | \\ li s0, 0 | 125 | \\ li s0, 0 |
| 126 | \\ li ra, 0 | 126 | \\ li ra, 0 |
| 127 | : [argc] "={sp}" (-> [*]usize) | 127 | : [argc] "={sp}" (-> [*]usize) |
| ... | @@ -129,7 +129,7 @@ fn _start() callconv(.Naked) noreturn { | ... | @@ -129,7 +129,7 @@ fn _start() callconv(.Naked) noreturn { |
| 129 | }, | 129 | }, |
| 130 | .mips, .mipsel => { | 130 | .mips, .mipsel => { |
| 131 | // The lr is already zeroed on entry, as specified by the ABI. | 131 | // The lr is already zeroed on entry, as specified by the ABI. |
| 132 | starting_stack_ptr = asm volatile ( | 132 | argc_argv_ptr = asm volatile ( |
| 133 | \\ move $fp, $0 | 133 | \\ move $fp, $0 |
| 134 | : [argc] "={sp}" (-> [*]usize) | 134 | : [argc] "={sp}" (-> [*]usize) |
| 135 | ); | 135 | ); |
| ... | @@ -137,7 +137,7 @@ fn _start() callconv(.Naked) noreturn { | ... | @@ -137,7 +137,7 @@ fn _start() callconv(.Naked) noreturn { |
| 137 | .powerpc64le => { | 137 | .powerpc64le => { |
| 138 | // Setup the initial stack frame and clear the back chain pointer. | 138 | // Setup the initial stack frame and clear the back chain pointer. |
| 139 | // TODO: Support powerpc64 (big endian) on ELFv2. | 139 | // TODO: Support powerpc64 (big endian) on ELFv2. |
| 140 | starting_stack_ptr = asm volatile ( | 140 | argc_argv_ptr = asm volatile ( |
| 141 | \\ mr 4, 1 | 141 | \\ mr 4, 1 |
| 142 | \\ li 0, 0 | 142 | \\ li 0, 0 |
| 143 | \\ stdu 0, -32(1) | 143 | \\ stdu 0, -32(1) |
| ... | @@ -149,7 +149,7 @@ fn _start() callconv(.Naked) noreturn { | ... | @@ -149,7 +149,7 @@ fn _start() callconv(.Naked) noreturn { |
| 149 | }, | 149 | }, |
| 150 | .sparcv9 => { | 150 | .sparcv9 => { |
| 151 | // argc is stored after a register window (16 registers) plus stack bias | 151 | // argc is stored after a register window (16 registers) plus stack bias |
| 152 | starting_stack_ptr = asm ( | 152 | argc_argv_ptr = asm ( |
| 153 | \\ mov %%g0, %%i6 | 153 | \\ mov %%g0, %%i6 |
| 154 | \\ add %%o6, 2175, %[argc] | 154 | \\ add %%o6, 2175, %[argc] |
| 155 | : [argc] "=r" (-> [*]usize) | 155 | : [argc] "=r" (-> [*]usize) |
| ... | @@ -190,8 +190,8 @@ fn posixCallMainAndExit() noreturn { | ... | @@ -190,8 +190,8 @@ fn posixCallMainAndExit() noreturn { |
| 190 | if (builtin.os.tag == .freebsd) { | 190 | if (builtin.os.tag == .freebsd) { |
| 191 | @setAlignStack(16); | 191 | @setAlignStack(16); |
| 192 | } | 192 | } |
| 193 | const argc = starting_stack_ptr[0]; | 193 | const argc = argc_argv_ptr[0]; |
| 194 | const argv = @ptrCast([*][*:0]u8, starting_stack_ptr + 1); | 194 | const argv = @ptrCast([*][*:0]u8, argc_argv_ptr + 1); |
| 195 | | 195 | |
| 196 | const envp_optional = @ptrCast([*:null]?[*:0]u8, @alignCast(@alignOf(usize), argv + argc + 1)); | 196 | const envp_optional = @ptrCast([*:null]?[*:0]u8, @alignCast(@alignOf(usize), argv + argc + 1)); |
| 197 | var envp_count: usize = 0; | 197 | var envp_count: usize = 0; |