| ... | @@ -53,19 +53,6 @@ pub fn zig_probe_stack() callconv(.Naked) void { | ... | @@ -53,19 +53,6 @@ pub fn zig_probe_stack() callconv(.Naked) void { |
| 53 | }, | 53 | }, |
| 54 | else => {}, | 54 | else => {}, |
| 55 | } | 55 | } |
| 56 | if (comptime native_arch.isAARCH64()) { | | |
| 57 | asm volatile ( | | |
| 58 | \\ lsl x16, x15, #4 | | |
| 59 | \\ mov x17, sp | | |
| 60 | \\1: | | |
| 61 | \\ sub x17, x17, #PAGE_SIZE | | |
| 62 | \\ subs x16, x16, #PAGE_SIZE | | |
| 63 | \\ ldr xzr, [x17] | | |
| 64 | \\ b.gt 1b | | |
| 65 | \\ | | |
| 66 | \\ ret | | |
| 67 | ); | | |
| 68 | } | | |
| 69 | | 56 | |
| 70 | unreachable; | 57 | unreachable; |
| 71 | } | 58 | } |
| ... | @@ -118,6 +105,21 @@ fn win_probe_stack_only() void { | ... | @@ -118,6 +105,21 @@ fn win_probe_stack_only() void { |
| 118 | }, | 105 | }, |
| 119 | else => {}, | 106 | else => {}, |
| 120 | } | 107 | } |
| | 108 | if (comptime native_arch.isAARCH64()) { |
| | 109 | // NOTE: page size hardcoded to 4096 for now |
| | 110 | asm volatile ( |
| | 111 | \\ lsl x16, x15, #4 |
| | 112 | \\ mov x17, sp |
| | 113 | \\1: |
| | 114 | \\ |
| | 115 | \\ sub x17, x17, 4096 |
| | 116 | \\ subs x16, x16, 4096 |
| | 117 | \\ ldr xzr, [x17] |
| | 118 | \\ b.gt 1b |
| | 119 | \\ |
| | 120 | \\ ret |
| | 121 | ); |
| | 122 | } |
| 121 | | 123 | |
| 122 | unreachable; | 124 | unreachable; |
| 123 | } | 125 | } |
| ... | @@ -199,7 +201,9 @@ pub fn _chkstk() callconv(.Naked) void { | ... | @@ -199,7 +201,9 @@ pub fn _chkstk() callconv(.Naked) void { |
| 199 | } | 201 | } |
| 200 | pub fn __chkstk() callconv(.Naked) void { | 202 | pub fn __chkstk() callconv(.Naked) void { |
| 201 | @setRuntimeSafety(false); | 203 | @setRuntimeSafety(false); |
| 202 | switch (native_arch) { | 204 | if (comptime native_arch.isAARCH64()) { |
| | 205 | @call(.{ .modifier = .always_inline }, win_probe_stack_only, .{}); |
| | 206 | } else switch (native_arch) { |
| 203 | .i386 => @call(.{ .modifier = .always_inline }, win_probe_stack_adjust_sp, .{}), | 207 | .i386 => @call(.{ .modifier = .always_inline }, win_probe_stack_adjust_sp, .{}), |
| 204 | .x86_64 => @call(.{ .modifier = .always_inline }, win_probe_stack_only, .{}), | 208 | .x86_64 => @call(.{ .modifier = .always_inline }, win_probe_stack_only, .{}), |
| 205 | else => unreachable, | 209 | else => unreachable, |