* Moved all files from vmcore/ to vm/.
[cacao.git] / src / vm / jit / powerpc64 / linux / md-os.c
index d978a70e4d45224e01d61056321422e89e31749c..e3821b7d01af5400daec2c7680d78373f9d52000 100644 (file)
 #include "vm/jit/powerpc64/md.h"
 #include "vm/jit/powerpc64/linux/md-abi.h"
 
-#include "threads/thread.h"
+#include "threads/thread.hpp"
 
 #include "vm/builtin.h"
-#include "vm/exceptions.h"
 #include "vm/signallocal.h"
+#include "vm/os.hpp"
 
 #include "vm/jit/asmpart.h"
+#include "vm/jit/executionstate.h"
 
 #if defined(ENABLE_PROFILING)
 # include "vm/jit/optimizing/profile.h"
 #endif
 
-#include "vm/jit/stacktrace.h"
 #include "vm/jit/trap.h"
 
 
@@ -179,6 +179,88 @@ void md_signal_handler_sigusr2(int sig, siginfo_t *siginfo, void *_p)
 #endif
 
 
+/* md_executionstate_read ******************************************************
+
+   Read the given context into an executionstate.
+
+*******************************************************************************/
+
+void md_executionstate_read(executionstate_t *es, void *context)
+{
+#if 0
+       ucontext_t    *_uc;
+       mcontext_t    *_mc;
+       unsigned long *_gregs;
+       s4              i;
+
+       _uc = (ucontext_t *) context;
+
+       _mc    = _uc->uc_mcontext.uc_regs;
+       _gregs = _mc->gregs;
+
+       /* read special registers */
+       es->pc = (u1 *) _gregs[PT_NIP];
+       es->sp = (u1 *) _gregs[REG_SP];
+       es->pv = (u1 *) _gregs[REG_PV];
+       es->ra = (u1 *) _gregs[PT_LNK];
+
+       /* read integer registers */
+       for (i = 0; i < INT_REG_CNT; i++)
+               es->intregs[i] = _gregs[i];
+
+       /* read float registers */
+       /* Do not use the assignment operator '=', as the type of
+        * the _mc->fpregs[i] can cause invalid conversions. */
+
+       assert(sizeof(_mc->fpregs.fpregs) == sizeof(es->fltregs));
+       os_memcpy(&es->fltregs, &_mc->fpregs.fpregs, sizeof(_mc->fpregs.fpregs));
+#endif
+
+       vm_abort("md_executionstate_read: IMPLEMENT ME!");
+}
+
+
+/* md_executionstate_write *****************************************************
+
+   Write the given executionstate back to the context.
+
+*******************************************************************************/
+
+void md_executionstate_write(executionstate_t *es, void *context)
+{
+#if 0
+       ucontext_t    *_uc;
+       mcontext_t    *_mc;
+       unsigned long *_gregs;
+       s4              i;
+
+       _uc = (ucontext_t *) context;
+
+       _mc    = _uc->uc_mcontext.uc_regs;
+       _gregs = _mc->gregs;
+
+       /* write integer registers */
+       for (i = 0; i < INT_REG_CNT; i++)
+               _gregs[i] = es->intregs[i];
+
+       /* write float registers */
+       /* Do not use the assignment operator '=', as the type of
+        * the _mc->fpregs[i] can cause invalid conversions. */
+
+       assert(sizeof(_mc->fpregs.fpregs) == sizeof(es->fltregs));
+       os_memcpy(&_mc->fpregs.fpregs, &es->fltregs, sizeof(_mc->fpregs.fpregs));
+
+       /* write special registers */
+       _gregs[PT_NIP] = (ptrint) es->pc;
+       _gregs[REG_SP] = (ptrint) es->sp;
+       _gregs[REG_PV] = (ptrint) es->pv;
+       _gregs[PT_LNK] = (ptrint) es->ra;
+#endif
+
+       vm_abort("md_executionstate_write: IMPLEMENT ME!");
+}
+
+
 /*
  * These are local overrides for various environment variables in Emacs.
  * Please do not remove this and leave it at the end of the file, where