#include <stdint.h>
-#include "vm/types.h"
-
-#include "vm/jit/disass.h"
-
-#include "vm/jit/arm/md-abi.h"
-
#define ucontext broken_glibc_ucontext
#define ucontext_t broken_glibc_ucontext_t
#include <ucontext.h>
#define scontext_t struct sigcontext
+#include "vm/types.h"
+
+#include "vm/jit/arm/md.h"
+#include "vm/jit/arm/md-abi.h"
+
#include "threads/thread.hpp"
#include "vm/os.hpp"
-#include "vm/signallocal.h"
+#include "vm/signallocal.hpp"
#include "vm/vm.hpp"
#include "vm/jit/asmpart.h"
+#include "vm/jit/disass.h"
#include "vm/jit/executionstate.h"
#include "vm/jit/patcher-common.hpp"
#include "vm/jit/trap.h"
intptr_t addr;
int type;
intptr_t val;
- void *p;
_uc = (ucontext_t*) _p;
_sc = &_uc->uc_mcontext;
/* Handle the trap. */
- p = trap_handle(type, val, pv, sp, ra, xpc, _p);
-
- /* set registers */
-
- _sc->arm_r10 = (uintptr_t) p;
- _sc->arm_fp = (uintptr_t) xpc;
- _sc->arm_pc = (uintptr_t) asm_handle_exception;
+ trap_handle(type, val, pv, sp, ra, xpc, _p);
}
int type = (mcode >> 8) & 0x0fff;
intptr_t val = *((int32_t*) _sc + OFFSET(scontext_t, arm_r0)/4 + (mcode & 0x0f));
- // Handle the trap.
- void* p = trap_handle(type, val, pv, sp, ra, xpc, _p);
-
- // Set registers if we have an exception, continue execution
- // otherwise.
- if (p != NULL) {
- _sc->arm_r10 = (uintptr_t) p;
- _sc->arm_fp = (uintptr_t) xpc;
- _sc->arm_pc = (uintptr_t) asm_handle_exception;
+ if (type == TRAP_COMPILER) {
+ /* The XPC is the RA minus 4, because the RA points to the
+ instruction after the call. */
+
+ xpc = (void*) (((uintptr_t) ra) - 4);
}
+
+ // Handle the trap.
+ trap_handle(type, val, pv, sp, ra, xpc, _p);
}
*/
void md_executionstate_read(executionstate_t *es, void *context)
{
- vm_abort("md_executionstate_read: IMPLEMENT ME!");
-
-#if 0
ucontext_t *_uc;
- mcontext_t *_mc;
+ scontext_t *_sc;
int i;
_uc = (ucontext_t *) context;
- _mc = &_uc->uc_mcontext;
+ _sc = &_uc->uc_mcontext;
+
+ /* ATTENTION: glibc included messed up kernel headers we needed a
+ workaround for the ucontext structure. */
/* read special registers */
- es->pc = (u1 *) _mc->sc_pc;
- es->sp = (u1 *) _mc->sc_regs[REG_SP];
- es->pv = (u1 *) _mc->sc_regs[REG_PV];
- es->ra = (u1 *) _mc->sc_regs[REG_RA];
+
+ es->pc = (u1 *) _sc->arm_pc;
+ es->sp = (u1 *) _sc->arm_sp;
+ es->pv = (u1 *) _sc->arm_ip;
+ es->ra = (u1 *) _sc->arm_lr;
/* read integer registers */
+
for (i = 0; i < INT_REG_CNT; i++)
- es->intregs[i] = _mc->sc_regs[i];
+ es->intregs[i] = *((int32_t*) _sc + OFFSET(scontext_t, arm_r0)/4 + i);
/* read float registers */
- /* Do not use the assignment operator '=', as the type of
- * the _mc->sc_fpregs[i] can cause invalid conversions. */
- assert(sizeof(_mc->sc_fpregs) == sizeof(es->fltregs));
- os_memcpy(&es->fltregs, &_mc->sc_fpregs, sizeof(_mc->sc_fpregs));
-#endif
+ for (i = 0; i < FLT_REG_CNT; i++)
+ es->fltregs[i] = 0xdeadbeefdeadbeefULL;
}
*/
void md_executionstate_write(executionstate_t *es, void *context)
{
- vm_abort("md_executionstate_write: IMPLEMENT ME!");
-
-#if 0
ucontext_t *_uc;
- mcontext_t *_mc;
+ scontext_t *_sc;
int i;
_uc = (ucontext_t *) context;
- _mc = &_uc->uc_mcontext;
+ _sc = &_uc->uc_mcontext;
- /* write integer registers */
- for (i = 0; i < INT_REG_CNT; i++)
- _mc->sc_regs[i] = es->intregs[i];
+ /* ATTENTION: glibc included messed up kernel headers we needed a
+ workaround for the ucontext structure. */
- /* write float registers */
- /* Do not use the assignment operator '=', as the type of
- * the _mc->sc_fpregs[i] can cause invalid conversions. */
+ /* write integer registers */
- assert(sizeof(_mc->sc_fpregs) == sizeof(es->fltregs));
- os_memcpy(&_mc->sc_fpregs, &es->fltregs, sizeof(_mc->sc_fpregs));
+ for (i = 0; i < INT_REG_CNT; i++)
+ *((int32_t*) _sc + OFFSET(scontext_t, arm_r0)/4 + i) = es->intregs[i];
/* write special registers */
- _mc->sc_pc = (ptrint) es->pc;
- _mc->sc_regs[REG_SP] = (ptrint) es->sp;
- _mc->sc_regs[REG_PV] = (ptrint) es->pv;
- _mc->sc_regs[REG_RA] = (ptrint) es->ra;
-#endif
+
+ _sc->arm_pc = (ptrint) es->pc;
+ _sc->arm_sp = (ptrint) es->sp;
+ _sc->arm_ip = (ptrint) es->pv;
+ _sc->arm_lr = (ptrint) es->ra;
}