| ... | @@ -190,7 +190,15 @@ pub inline fn getContext(context: *ThreadContext) bool { | ... | @@ -190,7 +190,15 @@ pub inline fn getContext(context: *ThreadContext) bool { |
| 190 | } | 190 | } |
| 191 | | 191 | |
| 192 | const result = have_getcontext and os.system.getcontext(context) == 0; | 192 | const result = have_getcontext and os.system.getcontext(context) == 0; |
| 193 | if (native_os == .macos) assert(context.mcsize == @sizeOf(std.c.mcontext_t)); | 193 | if (native_os == .macos) { |
| | 194 | assert(context.mcsize == @sizeOf(std.c.mcontext_t)); |
| | 195 | |
| | 196 | // On aarch64-macos, the system getcontext doesn't write anything into the pc |
| | 197 | // register slot, it only writes lr. This makes the context consistent with |
| | 198 | // other aarch64 getcontext implementations which write the current lr |
| | 199 | // (where getcontext will return to) into both the lr and pc slot of the context. |
| | 200 | if (native_arch == .aarch64) context.mcontext.ss.pc = context.mcontext.ss.lr; |
| | 201 | } |
| 194 | | 202 | |
| 195 | return result; | 203 | return result; |
| 196 | } | 204 | } |