Minor fixes for freebsd7/x86.
git-svn-id: https://svn.apache.org/repos/asf/harmony/enhanced/drlvm/trunk@691951 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/make/vm/common-vm.xml b/make/vm/common-vm.xml
index 4f6c70f..893f217 100644
--- a/make/vm/common-vm.xml
+++ b/make/vm/common-vm.xml
@@ -130,7 +130,8 @@
<syslibset libs="advapi32,odbc32,userenv,ws2_32,mswsock,psapi" if="is.windows"/>
- <syslibset type="shared" libs="m,dl,stdc++,rt" if="is.unix.x86"/>
+ <syslibset type="shared" libs="m,dl,stdc++,rt" if="is.linux.x86"/>
+ <syslibset type="shared" libs="pthread" if="is.freebsd"/>
<!--linkerarg value="-lgcc_s" if="is.unix.x86" unless="is.icc"/-->
</linker>
</target>
diff --git a/vm/gc_gen/src/common/gc_platform.h b/vm/gc_gen/src/common/gc_platform.h
index 20083cc..e41c08d 100644
--- a/vm/gc_gen/src/common/gc_platform.h
+++ b/vm/gc_gen/src/common/gc_platform.h
@@ -66,7 +66,7 @@
#define prefetchnta(pref_addr) _mm_prefetch((char*)(pref_addr), _MM_HINT_NTA )
#endif /*ALLOC_PREFETCH*/
-#elif defined (__linux__)
+#elif defined (__linux__) || defined(FREEBSD)
#define FORCE_INLINE inline __attribute__((always_inline))
#ifdef PREFETCH_SUPPORTED
diff --git a/vm/port/include/port_mutex.h b/vm/port/include/port_mutex.h
index 35d8478..6a338a6 100644
--- a/vm/port/include/port_mutex.h
+++ b/vm/port/include/port_mutex.h
@@ -36,6 +36,9 @@
extern "C" {
#endif
+#if defined(FREEBSD)
+#define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE
+#endif
/**
* @defgroup port_mutex Basic mutexes
diff --git a/vm/port/include/port_thread.h b/vm/port/include/port_thread.h
index 82ee98c..ee5540d 100644
--- a/vm/port/include/port_thread.h
+++ b/vm/port/include/port_thread.h
@@ -45,6 +45,8 @@
#endif /* _syscall0 */
#else /* !LINUX */
+#include <sys/types.h>
+#include <unistd.h>
#define gettid() getpid()
#endif
diff --git a/vm/port/src/crash_handler/linux/native_unwind_os.cpp b/vm/port/src/crash_handler/linux/native_unwind_os.cpp
index 09d370c..aee6395 100644
--- a/vm/port/src/crash_handler/linux/native_unwind_os.cpp
+++ b/vm/port/src/crash_handler/linux/native_unwind_os.cpp
@@ -21,6 +21,10 @@
#include "port_modules.h"
#include "native_unwind.h"
+#if defined(FREEBSD)
+#include <pthread_np.h>
+#endif
+
#if defined(MACOSX)
#include <crt_externs.h>
#define environ (*_NSGetEnviron())
diff --git a/vm/vmcore/src/ncai/utils/ncai_utils_ia32.cpp b/vm/vmcore/src/ncai/utils/ncai_utils_ia32.cpp
index 0ac3fa6..f843c9f 100644
--- a/vm/vmcore/src/ncai/utils/ncai_utils_ia32.cpp
+++ b/vm/vmcore/src/ncai/utils/ncai_utils_ia32.cpp
@@ -59,6 +59,49 @@
return sizeof(g_ncai_reg_table)/sizeof(g_ncai_reg_table[0]);
}
+#if defined(FREEBSD)
+
+static void ncai_context_to_registers(ucontext_t* pcontext, NcaiRegisters* pregs)
+{
+ pregs->eax = pcontext->uc_mcontext.mc_eax;
+ pregs->ebx = pcontext->uc_mcontext.mc_ebx;
+ pregs->ecx = pcontext->uc_mcontext.mc_ecx;
+ pregs->edx = pcontext->uc_mcontext.mc_edx;
+ pregs->esp = pcontext->uc_mcontext.mc_esp;
+ pregs->ebp = pcontext->uc_mcontext.mc_ebp;
+ pregs->esi = pcontext->uc_mcontext.mc_esi;
+ pregs->edi = pcontext->uc_mcontext.mc_edi;
+ pregs->ds = pcontext->uc_mcontext.mc_ds;
+ pregs->es = pcontext->uc_mcontext.mc_es;
+ pregs->fs = pcontext->uc_mcontext.mc_fs;
+ pregs->gs = pcontext->uc_mcontext.mc_gs;
+ pregs->ss = pcontext->uc_mcontext.mc_ss;
+ pregs->cs = pcontext->uc_mcontext.mc_cs;
+ pregs->eip = pcontext->uc_mcontext.mc_eip;
+ pregs->eflags = pcontext->uc_mcontext.mc_eflags;
+}
+
+static void ncai_registers_to_context(NcaiRegisters* pregs, ucontext_t* pcontext)
+{
+ pcontext->uc_mcontext.mc_eax = pregs->eax;
+ pcontext->uc_mcontext.mc_ebx = pregs->ebx;
+ pcontext->uc_mcontext.mc_ecx = pregs->ecx;
+ pcontext->uc_mcontext.mc_edx = pregs->edx;
+ pcontext->uc_mcontext.mc_esp = pregs->esp;
+ pcontext->uc_mcontext.mc_ebp = pregs->ebp;
+ pcontext->uc_mcontext.mc_esi = pregs->esi;
+ pcontext->uc_mcontext.mc_edi = pregs->edi;
+ pcontext->uc_mcontext.mc_ds = pregs->ds;
+ pcontext->uc_mcontext.mc_es = pregs->es;
+ pcontext->uc_mcontext.mc_fs = pregs->fs;
+ pcontext->uc_mcontext.mc_gs = pregs->gs;
+ pcontext->uc_mcontext.mc_ss = pregs->ss;
+ pcontext->uc_mcontext.mc_cs = pregs->cs;
+ pcontext->uc_mcontext.mc_eip = pregs->eip;
+ pcontext->uc_mcontext.mc_eflags = pregs->eflags;
+}
+#else
+
#ifdef PLATFORM_POSIX
static void ncai_context_to_registers(ucontext_t* pcontext, NcaiRegisters* pregs)
@@ -149,6 +192,7 @@
}
#endif // #ifdef PLATFORM_POSIX
+#endif // # defined(FREEBSD)
bool ncai_get_register_value(hythread_t thread, jint reg_number, void* buf_ptr)
{