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)
 {