$OpenBSD: patch-Source_JavaScriptCore_heap_MachineStackMarker_cpp,v 1.3 2020/02/25 14:03:00 rsadowski Exp $

Index: Source/JavaScriptCore/heap/MachineStackMarker.cpp
--- Source/JavaScriptCore/heap/MachineStackMarker.cpp.orig
+++ Source/JavaScriptCore/heap/MachineStackMarker.cpp
@@ -49,6 +49,10 @@
 
 #elif OS(UNIX)
 
+#if OS(OPENBSD)
+#include<sys/param.h>
+#endif
+
 #include <sys/mman.h>
 #include <unistd.h>
 
@@ -86,11 +90,13 @@ static void pthreadSignalHandlerSuspendResume(int, sig
     }
 
     ucontext_t* userContext = static_cast<ucontext_t*>(ucontext);
-#if CPU(PPC)
+
+// XXX we don't have ucontext || fix an error on powerpc
+#if CPU(PPC) && !OS(OPENBSD) 
     thread->suspendedMachineContext = *userContext->uc_mcontext.uc_regs;
 #else
-    thread->suspendedMachineContext = userContext->uc_mcontext;
-#endif
+    thread->suspendedMachineContext = *userContext;
+#endif 
 
     // Allow suspend caller to see that this thread is suspended.
     // sem_post is async-signal-safe function. It means that we can call this from a signal handler.
@@ -566,6 +572,25 @@ void* MachineThreads::Thread::Registers::stackPointer(
 #error Unknown Architecture
 #endif
 
+#elif OS(OPENBSD) && ENABLE(JIT)
+
+#if CPU(X86)
+    return reinterpret_cast<void*&>((uintptr_t&) regs.machineContext.sc_edx);
+#elif CPU(X86_64)
+    //return reinterpret_cast<void*&>((uintptr_t&) regs.machineContext.sc_rsp);
+#elif CPU(ARM)
+    return reinterpret_cast<void*&>((uintptr_t&) regs.machineContext.__gregs[_REG_R1]);
+#elif CPU(ARM64)
+    return reinterpret_cast<void*&>((uintptr_t&) regs.machineContext.sc_x[1]);
+#elif CPU(MIPS)
+    return reinterpret_cast<void*&>((uintptr_t&) regs.machineContext.mc_regs[5]);
+#elif CPU(SPARC64)
+    return reinterpret_cast<void*&>((uintptr_t&) regs.machineContext.mc_rsi);
+#else
+#error Unknown Architecture
+#endif
+
+
 #elif defined(__GLIBC__) && ENABLE(JIT)
 
 #if CPU(X86)
@@ -632,6 +657,7 @@ void* MachineThreads::Thread::Registers::framePointer(
 #error Unknown Architecture
 #endif
 
+
 #endif // __DARWIN_UNIX03
 
 // end OS(DARWIN)
@@ -665,6 +691,25 @@ void* MachineThreads::Thread::Registers::framePointer(
 #error Unknown Architecture
 #endif
 
+#elif OS(OPENBSD)
+
+#if CPU(X86)
+    return reinterpret_cast<void*&>((uintptr_t&) regs.machineContext.sc_esp);
+#elif CPU(X86_64)
+    //return reinterpret_cast<void*&>((uintptr_t&) regs.machineContext.sc_rsp);
+#elif CPU(ARM)
+    return reinterpret_cast<void*&>((uintptr_t&) regs.machineContext.__gregs[_REG_SP]);
+#elif CPU(ARM64)
+    return reinterpret_cast<void*&>((uintptr_t&) regs.machineContext.sc_sp);
+#elif CPU(MIPS)
+    return reinterpret_cast<void*&>((uintptr_t&) regs.machineContext.mc_regs[29]);
+#elif CPU(SPARC64)
+    return reinterpret_cast<void*&>((uintptr_t&) regs.machineContext.mc_rsp);
+#else
+#error Unknown Architecture
+#endif
+
+
 #elif defined(__GLIBC__)
 
 // The following sequence depends on glibc's sys/ucontext.h.
@@ -747,6 +792,25 @@ void* MachineThreads::Thread::Registers::instructionPo
 #error Unknown Architecture
 #endif
 
+#elif OS(OPENBSD)
+
+#if CPU(X86)
+    return reinterpret_cast<void*&>((uintptr_t&) regs.machineContext.sc_ebp);
+#elif CPU(X86_64)
+    //return reinterpret_cast<void*&>((uintptr_t&) regs.machineContext.sc_rbp);
+#elif CPU(ARM)
+    return reinterpret_cast<void*&>((uintptr_t&) regs.machineContext.__gregs[_REG_FP]);
+#elif CPU(ARM64)
+    return reinterpret_cast<void*&>((uintptr_t&) regs.machineContext.sc_x[29]);
+#elif CPU(MIPS)
+    return reinterpret_cast<void*&>((uintptr_t&) regs.machineContext.mc_regs[30]);
+#elif CPU(SPARC64)
+    return reinterpret_cast<void*&>((uintptr_t&) regs.machineContext.mc_rbp);
+#else
+#error Unknown Architecture
+#endif
+
+
 #elif defined(__GLIBC__)
 
 // The following sequence depends on glibc's sys/ucontext.h.
@@ -837,6 +901,25 @@ void* MachineThreads::Thread::Registers::llintPC() con
 #else
 #error Unknown Architecture
 #endif
+
+#elif OS(OPENBSD)
+
+#if CPU(X86)
+    return reinterpret_cast<void*&>((uintptr_t&) regs.machineContext.sc_eip);
+#elif CPU(X86_64)
+    //return reinterpret_cast<void*&>((uintptr_t&) regs.machineContext.sc_rip);
+#elif CPU(ARM)
+    return reinterpret_cast<void*&>((uintptr_t&) regs.machineContext.__gregs[_REG_PC]);
+#elif CPU(ARM64)
+    return reinterpret_cast<void*&>((uintptr_t&) regs.machineContext.sc_elr);
+#elif CPU(MIPS)
+    return reinterpret_cast<void*&>((uintptr_t&) regs.machineContext.mc_pc);                                                                                                                  
+#elif CPU(SPARC64)
+    return reinterpret_cast<void*&>((uintptr_t&) regs.machineContext.mc_rip);
+#else
+#error Unknown Architecture
+#endif
+
 
 #elif defined(__GLIBC__)
 
