/* src/vm/jit/x86_64/patcher.c - x86_64 code patching functions
- Copyright (C) 1996-2005, 2006, 2007, 2008
+ Copyright (C) 1996-2005, 2006, 2007, 2008, 2009
CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
This file is part of CACAO.
#include "vm/jit/x86_64/codegen.h"
#include "vm/jit/x86_64/md.h"
-#include "mm/memory.h"
+#include "mm/memory.hpp"
#include "native/native.hpp"
md_icacheflush((void*) pr->mpc, PATCHER_CALL_SIZE);
}
+/**
+ * Check if the trap instruction at the given PC is valid.
+ *
+ * @param pc Program counter.
+ *
+ * @return true if valid, false otherwise.
+ */
+bool patcher_is_valid_trap_instruction_at(void* pc)
+{
+ uint16_t mcode = *((uint16_t*) pc);
+
+ // Check for the undefined instruction we use.
+ return (mcode == 0x0b0f);
+}
+
/* patcher_resolve_classref_to_classinfo ***************************************
if (c == NULL)
return false;
+ ra += PATCHER_CALL_SIZE;
+
// Patch class flags.
/* *datap = c->flags; */
*((int32_t*) (ra + 2)) = c->flags;
{
unresolved_field* uf = (unresolved_field*) pr->ref;
uintptr_t* datap = (uintptr_t*) pr->datap;
+ uint8_t* ra = (uint8_t*) pr->mpc;
// Resolve the field.
fieldinfo* fi = resolve_field_eager(uf);
if (fi == NULL)
return false;
+ ra += PATCHER_CALL_SIZE;
+
// Check if the field's class is initialized/
if (!(fi->clazz->state & CLASS_INITIALIZED))
if (!initialize_class(fi->clazz))
if (fi == NULL)
return false;
+ pc += PATCHER_CALL_SIZE;
+
// Patch the field's offset: we check for the field type, because
// the instructions have different lengths.
if (IS_INT_LNG_TYPE(fi->type)) {
if (fi == NULL)
return false;
+ pc += PATCHER_CALL_SIZE;
+
// Patch the field's offset.
if (IS_2_WORD_TYPE(fi->type) || IS_ADR_TYPE(fi->type)) {
// Handle special case when the base register is %r12.
if (m == NULL)
return false;
+ pc += PATCHER_CALL_SIZE;
+
// Patch vftbl index.
*((int32_t*) (pc + 3 + 3)) = (int32_t) (OFFSET(vftbl_t, table[0]) + sizeof(methodptr) * m->vftblindex);
if (m == NULL)
return false;
+ pc += PATCHER_CALL_SIZE;
+
// Patch interfacetable index.
*((int32_t*) (pc + 3 + 3)) = (int32_t) (OFFSET(vftbl_t, interfacetable[0]) - sizeof(methodptr) * m->clazz->index);
if (c == NULL)
return false;
+ pc += PATCHER_CALL_SIZE;
+
// Patch super class index.
*((int32_t*) (pc + 7 + 3)) = c->index;
if (c == NULL)
return false;
+ pc += PATCHER_CALL_SIZE;
+
// Patch super class index.
*((int32_t*) (pc + 7 + 3)) = c->index;