You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by hi...@apache.org on 2008/09/04 16:30:11 UTC

svn commit: r692051 - in /harmony/enhanced/drlvm/trunk/vm: port/src/thread/linux/thread_em64t.c vmcore/src/ncai/utils/ncai_utils_em64t.cpp

Author: hindessm
Date: Thu Sep  4 07:30:09 2008
New Revision: 692051

URL: http://svn.apache.org/viewvc?rev=692051&view=rev
Log:
Register handling for freebsd/x86_64.

Modified:
    harmony/enhanced/drlvm/trunk/vm/port/src/thread/linux/thread_em64t.c
    harmony/enhanced/drlvm/trunk/vm/vmcore/src/ncai/utils/ncai_utils_em64t.cpp

Modified: harmony/enhanced/drlvm/trunk/vm/port/src/thread/linux/thread_em64t.c
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/port/src/thread/linux/thread_em64t.c?rev=692051&r1=692050&r2=692051&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/port/src/thread/linux/thread_em64t.c (original)
+++ harmony/enhanced/drlvm/trunk/vm/port/src/thread/linux/thread_em64t.c Thu Sep  4 07:30:09 2008
@@ -20,6 +20,53 @@
 #include <sys/ucontext.h>
 #include "port_thread.h"
 
+#if defined(FREEBSD)
+
+void port_thread_context_to_regs(Registers* regs, ucontext_t *uc)
+{
+    regs->rax = uc->uc_mcontext.mc_rax;
+    regs->rcx = uc->uc_mcontext.mc_rcx;
+    regs->rdx = uc->uc_mcontext.mc_rdx;
+    regs->rdi = uc->uc_mcontext.mc_rdi;
+    regs->rsi = uc->uc_mcontext.mc_rsi;
+    regs->rbx = uc->uc_mcontext.mc_rbx;
+    regs->rbp = uc->uc_mcontext.mc_rbp;
+    regs->rip = uc->uc_mcontext.mc_rip;
+    regs->rsp = uc->uc_mcontext.mc_rsp;
+    regs->r8  = uc->uc_mcontext.mc_r8;
+    regs->r9  = uc->uc_mcontext.mc_r9;
+    regs->r10 = uc->uc_mcontext.mc_r10;
+    regs->r11 = uc->uc_mcontext.mc_r11;
+    regs->r12 = uc->uc_mcontext.mc_r12;
+    regs->r13 = uc->uc_mcontext.mc_r13;
+    regs->r14 = uc->uc_mcontext.mc_r14;
+    regs->r15 = uc->uc_mcontext.mc_r15;
+    regs->eflags = uc->uc_mcontext.mc_flags;
+}
+
+void port_thread_regs_to_context(ucontext_t *uc, Registers* regs)
+{
+    uc->uc_mcontext.mc_rax = regs->rax;
+    uc->uc_mcontext.mc_rcx = regs->rcx;
+    uc->uc_mcontext.mc_rdx = regs->rdx;
+    uc->uc_mcontext.mc_rdi = regs->rdi;
+    uc->uc_mcontext.mc_rsi = regs->rsi;
+    uc->uc_mcontext.mc_rbx = regs->rbx;
+    uc->uc_mcontext.mc_rbp = regs->rbp;
+    uc->uc_mcontext.mc_rip = regs->rip;
+    uc->uc_mcontext.mc_rsp = regs->rsp;
+    uc->uc_mcontext.mc_r8  = regs->r8;
+    uc->uc_mcontext.mc_r9  = regs->r9;
+    uc->uc_mcontext.mc_r10 = regs->r10;
+    uc->uc_mcontext.mc_r11 = regs->r11;
+    uc->uc_mcontext.mc_r12 = regs->r12;
+    uc->uc_mcontext.mc_r13 = regs->r13;
+    uc->uc_mcontext.mc_r14 = regs->r14;
+    uc->uc_mcontext.mc_r15 = regs->r15;
+    uc->uc_mcontext.mc_flags = regs->eflags;
+}
+
+#else
 
 void port_thread_context_to_regs(Registers* regs, ucontext_t *uc)
 {
@@ -64,3 +111,4 @@
     uc->uc_mcontext.gregs[REG_R15] = regs->r15;
     uc->uc_mcontext.gregs[REG_EFL] = regs->eflags;
 }
+#endif

Modified: harmony/enhanced/drlvm/trunk/vm/vmcore/src/ncai/utils/ncai_utils_em64t.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/vmcore/src/ncai/utils/ncai_utils_em64t.cpp?rev=692051&r1=692050&r2=692051&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/vmcore/src/ncai/utils/ncai_utils_em64t.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/vmcore/src/ncai/utils/ncai_utils_em64t.cpp Thu Sep  4 07:30:09 2008
@@ -64,6 +64,60 @@
     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->rax  = pcontext->uc_mcontext.mc_rax;
+    pregs->rbx  = pcontext->uc_mcontext.mc_rbx;
+    pregs->rcx  = pcontext->uc_mcontext.mc_rcx;
+    pregs->rdx  = pcontext->uc_mcontext.mc_rdx;
+    pregs->rsp  = pcontext->uc_mcontext.mc_rsp;
+    pregs->rbp  = pcontext->uc_mcontext.mc_rbp;
+    pregs->rsi  = pcontext->uc_mcontext.mc_rsi;
+    pregs->rdi  = pcontext->uc_mcontext.mc_rdi;
+    pregs->r8   = pcontext->uc_mcontext.mc_r8;
+    pregs->r9   = pcontext->uc_mcontext.mc_r9;
+    pregs->r10  = pcontext->uc_mcontext.mc_r10;
+    pregs->r11  = pcontext->uc_mcontext.mc_r11;
+    pregs->r12  = pcontext->uc_mcontext.mc_r12;
+    pregs->r13  = pcontext->uc_mcontext.mc_r13;
+    pregs->r14  = pcontext->uc_mcontext.mc_r14;
+    pregs->r15  = pcontext->uc_mcontext.mc_r15;
+    pregs->fs = 0;
+    pregs->gs = 0;
+    pregs->ss = 0;
+    pregs->cs = 0;
+    pregs->rip    = pcontext->uc_mcontext.mc_rip;
+    pregs->eflags = pcontext->uc_mcontext.mc_flags;
+}
+
+static void ncai_registers_to_context(NcaiRegisters* pregs, ucontext_t* pcontext)
+{
+    pcontext->uc_mcontext.mc_rax  = pregs->rax;
+    pcontext->uc_mcontext.mc_rbx  = pregs->rbx;
+    pcontext->uc_mcontext.mc_rcx  = pregs->rcx;
+    pcontext->uc_mcontext.mc_rdx  = pregs->rdx;
+    pcontext->uc_mcontext.mc_rsp  = pregs->rsp;
+    pcontext->uc_mcontext.mc_rbp  = pregs->rbp;
+    pcontext->uc_mcontext.mc_rsi  = pregs->rsi;
+    pcontext->uc_mcontext.mc_rdi  = pregs->rdi;
+    pcontext->uc_mcontext.mc_r8   = pregs->r8;
+    pcontext->uc_mcontext.mc_r9   = pregs->r9;
+    pcontext->uc_mcontext.mc_r10  = pregs->r10;
+    pcontext->uc_mcontext.mc_r11  = pregs->r11;
+    pcontext->uc_mcontext.mc_r12  = pregs->r12;
+    pcontext->uc_mcontext.mc_r13  = pregs->r13;
+    pcontext->uc_mcontext.mc_r14  = pregs->r14;
+    pcontext->uc_mcontext.mc_r15  = pregs->r15;
+    // cs, gs, fs and ss registers are not restored, because there is
+    // no storage for them
+    pcontext->uc_mcontext.mc_rip  = pregs->rip;
+    pcontext->uc_mcontext.mc_flags  = pregs->eflags;
+}
+
+#else // # defined(FREEBSD)
+
 #ifdef PLATFORM_POSIX
 
 static void ncai_context_to_registers(ucontext_t* pcontext, NcaiRegisters* pregs)
@@ -178,6 +232,8 @@
 
 #endif // #ifdef PLATFORM_POSIX
 
+#endif // # defined(FREEBSD)
+
 bool ncai_get_register_value(hythread_t thread, jint reg_number, void* buf_ptr)
 {
     thread_context_t context;