| ... | ... | @@ -53,19 +53,6 @@ pub fn zig_probe_stack() callconv(.Naked) void { |
| 53 | 53 | }, |
| 54 | 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 | 57 | unreachable; |
| 71 | 58 | } |
| ... | ... | @@ -118,6 +105,21 @@ fn win_probe_stack_only() void { |
| 118 | 105 | }, |
| 119 | 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 | 124 | unreachable; |
| 123 | 125 | } |
| ... | ... | @@ -199,7 +201,9 @@ pub fn _chkstk() callconv(.Naked) void { |
| 199 | 201 | } |
| 200 | 202 | pub fn __chkstk() callconv(.Naked) void { |
| 201 | 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 | 207 | .i386 => @call(.{ .modifier = .always_inline }, win_probe_stack_adjust_sp, .{}), |
| 204 | 208 | .x86_64 => @call(.{ .modifier = .always_inline }, win_probe_stack_only, .{}), |
| 205 | 209 | else => unreachable, |