mirror of
https://github.com/Zenithsiz/ftmemsim-valgrind.git
synced 2026-02-16 23:53:49 +00:00
Merged into linker.c
git-svn-id: svn://svn.valgrind.org/vex/trunk@12
This commit is contained in:
119
VEX/runner.c
119
VEX/runner.c
@@ -1,119 +0,0 @@
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <malloc.h>
|
||||
#include <assert.h>
|
||||
|
||||
/* --------------------------------------------------------- */
|
||||
/* TRANSLATION TABLE/CACHE */
|
||||
/* --------------------------------------------------------- */
|
||||
|
||||
|
||||
#define N_TT_ENTRIES 1000
|
||||
|
||||
typedef
|
||||
struct {
|
||||
char* orig;
|
||||
int orig_size;
|
||||
char* trans;
|
||||
int trans_size;
|
||||
}
|
||||
TTEntry;
|
||||
|
||||
int n_transtab_used = 0;
|
||||
TTEntry transtab[N_TT_ENTRIES];
|
||||
|
||||
|
||||
/* Called by Haskell to add a translation to the trans cache.
|
||||
Supplied translation is in mallocville. add_translation should
|
||||
copy it out as the caller will free it on return. */
|
||||
|
||||
/* EXPORTED */
|
||||
void add_translation ( char* orig, int orig_size, char* trans, int trans_size )
|
||||
{
|
||||
int i;
|
||||
assert(n_transtab_used < N_TT_ENTRIES);
|
||||
transtab[n_transtab_used].orig = orig;
|
||||
transtab[n_transtab_used].orig_size = orig_size;
|
||||
transtab[n_transtab_used].trans_size = trans_size;
|
||||
|
||||
transtab[n_transtab_used].trans = malloc(trans_size);
|
||||
assert(transtab[n_transtab_used].trans != NULL);
|
||||
for (i = 0; i < trans_size; i++)
|
||||
transtab[n_transtab_used].trans[i] = trans[i];
|
||||
|
||||
n_transtab_used++;
|
||||
}
|
||||
|
||||
static
|
||||
char* find_translation ( char* orig )
|
||||
{
|
||||
int i;
|
||||
for (i = 0; i < n_transtab_used; i++)
|
||||
if (transtab[i].orig == orig)
|
||||
return transtab[i].trans;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* --------------------------------------------------------- */
|
||||
/* SIMULATED STATE */
|
||||
/* --------------------------------------------------------- */
|
||||
|
||||
typedef unsigned int Word;
|
||||
|
||||
/* ARM state */
|
||||
/* r0 .. r15, flags */
|
||||
Word regs_arm[16+1];
|
||||
|
||||
#define REG_PC 15
|
||||
#define REG_SP 14
|
||||
|
||||
Word* sim_stack;
|
||||
|
||||
//---------------------------------------------
|
||||
|
||||
/* Calling convention: enter the translation with r0 pointing at
|
||||
regs_arm. Translation may trash r1 .. r12 inclusive. */
|
||||
|
||||
static
|
||||
void run_translation ( char* trans )
|
||||
{
|
||||
/* r0 holds trans */
|
||||
__asm __volatile
|
||||
("stmfd sp!, {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13}\n\t"
|
||||
"mov r12, %0\n\t"
|
||||
"mov r0, %1\n\t"
|
||||
"bl r12\n\t"
|
||||
"ldmea sp!, {r0,r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13}\n\t"
|
||||
:
|
||||
: "ir" (trans), "ir" (®s_arm[0]) );
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Called by Haskell to initialise the simulated machine, and tell it
|
||||
its starting pc. */
|
||||
|
||||
/* EXPORTED */
|
||||
void initialise_machine ( char* first_pc )
|
||||
{
|
||||
n_transtab_used = 0;
|
||||
regs_arm[REG_PC] = (Word)first_pc;
|
||||
sim_stack = malloc(10000 * sizeof(Word));
|
||||
regs_arm[REG_SP] = (Word)(&sim_stack[9999]);
|
||||
}
|
||||
|
||||
/* Run the simulated machine for a while. Returns when a new BB needs
|
||||
to be translated, and returns its address. */
|
||||
|
||||
/* EXPORTED */
|
||||
char* run_machine ( void )
|
||||
{
|
||||
char* trans;
|
||||
while (1) {
|
||||
trans = find_translation((char*)(regs_arm[15]));
|
||||
if (trans == NULL) return (char*)(regs_arm[15]);
|
||||
run_translation(trans);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user