diff --git a/loader/src/platform/mac/crashlog.mm b/loader/src/platform/mac/crashlog.mm
index 649a87d0..51c9b1d4 100644
--- a/loader/src/platform/mac/crashlog.mm
+++ b/loader/src/platform/mac/crashlog.mm
@@ -172,8 +172,12 @@ extern "C" void signalHandler(int signal, siginfo_t* signalInfo, void* vcontext)
 	auto context = reinterpret_cast<ucontext_t*>(vcontext);
 	s_backtraceSize = backtrace(s_backtrace.data(), FRAME_SIZE);
 
-    // for some reason this is needed, dont ask me why
+    	// for some reason this is needed, dont ask me why
+	#ifdef GEODE_IS_INTEL_MAC
 	s_backtrace[2] = reinterpret_cast<void*>(context->uc_mcontext->__ss.__rip);
+	#else
+	s_backtrace[2] = reinterpret_cast<void*>(context->uc_mcontext->__ss.__pc);
+	#endif
 	if (s_backtraceSize < FRAME_SIZE) {
 		s_backtrace[s_backtraceSize] = nullptr;
 	}
@@ -300,6 +304,7 @@ static std::string getRegisters() {
 
     // geez
     registers << std::showbase << std::hex /*<< std::setfill('0') << std::setw(16) */;
+    #ifdef GEODE_IS_INTEL_MAC
     registers << "rax: " << ss.__rax << "\n";
     registers << "rbx: " << ss.__rbx << "\n";
     registers << "rcx: " << ss.__rcx << "\n";
@@ -321,6 +326,42 @@ static std::string getRegisters() {
     registers << "cs: " << ss.__cs << "\n";
     registers << "fs: " << ss.__fs << "\n";
     registers << "gs: " << ss.__gs << "\n";
+    #else // m1
+    registers << "x0: " << ss.__x[0] << "\n";
+    registers << "x1: " << ss.__x[1] << "\n";
+    registers << "x2: " << ss.__x[2] << "\n";
+    registers << "x3: " << ss.__x[3] << "\n";
+    registers << "x4: " << ss.__x[4] << "\n";
+    registers << "x5: " << ss.__x[5] << "\n";
+    registers << "x6: " << ss.__x[6] << "\n";
+    registers << "x7: " << ss.__x[7] << "\n";
+    registers << "x8: " << ss.__x[8] << "\n";
+    registers << "x9: " << ss.__x[9] << "\n";
+    registers << "x10: " << ss.__x[10] << "\n";
+    registers << "x11: " << ss.__x[11] << "\n";
+    registers << "x12: " << ss.__x[12] << "\n";
+    registers << "x13: " << ss.__x[13] << "\n";
+    registers << "x14: " << ss.__x[14] << "\n";
+    registers << "x15: " << ss.__x[15] << "\n";
+    registers << "x16: " << ss.__x[16] << "\n";
+    registers << "x17: " << ss.__x[17] << "\n";
+    registers << "x18: " << ss.__x[18] << "\n";
+    registers << "x19: " << ss.__x[19] << "\n";
+    registers << "x20: " << ss.__x[20] << "\n";
+    registers << "x21: " << ss.__x[21] << "\n";
+    registers << "x22: " << ss.__x[22] << "\n";
+    registers << "x23: " << ss.__x[23] << "\n";
+    registers << "x24: " << ss.__x[24] << "\n";
+    registers << "x25: " << ss.__x[25] << "\n";
+    registers << "x26: " << ss.__x[26] << "\n";
+    registers << "x27: " << ss.__x[27] << "\n";
+    registers << "x28: " << ss.__x[28] << "\n";
+    registers << "fp: " << ss.__fp << "\n";
+    registers << "lr: " << ss.__lr << "\n";
+    registers << "sp: " << ss.__sp << "\n";
+    registers << "pc: " << ss.__pc << "\n";
+    registers << "cpsr: " << ss.__cpsr << "\n";
+    #endif
 
     return registers.str();
 }
@@ -329,7 +370,11 @@ static void handlerThread() {
     std::unique_lock<std::mutex> lock(s_mutex);
     s_cv.wait(lock, [] { return s_signal != 0; });
 
+    #ifdef GEODE_IS_INTEL_MAC
     auto signalAddress = reinterpret_cast<void*>(s_context->uc_mcontext->__ss.__rip);
+    #else // m1
+    auto signalAddress = reinterpret_cast<void*>(s_context->uc_mcontext->__ss.__pc);
+    #endif
     // Mod* faultyMod = nullptr;
     // for (int i = 1; i < s_backtraceSize; ++i) {
     //     auto mod = modFromAddress(s_backtrace[i]);