diff options
Diffstat (limited to 'src/arch/arm/v7/processor.c')
-rw-r--r-- | src/arch/arm/v7/processor.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/src/arch/arm/v7/processor.c b/src/arch/arm/v7/processor.c index bcd44e9..3ce1623 100644 --- a/src/arch/arm/v7/processor.c +++ b/src/arch/arm/v7/processor.c @@ -24,7 +24,10 @@ #include "processor.h" +#include "arm.h" +#include "../context.h" #include "../processor-int.h" +#include "../../raw.h" @@ -56,6 +59,9 @@ static void g_armv7_processor_dispose(GArmV7Processor *); /* Procède à la libération totale de la mémoire. */ static void g_armv7_processor_finalize(GArmV7Processor *); +/* Décode une instruction dans un flux de données. */ +static GArchInstruction *g_armv7_processor_disassemble(const GArmV7Processor *, GArmContext *, const bin_t *, vmpa2t *, phys_t); + /* Indique le type défini par la GLib pour le processeur ARMv7. */ @@ -77,12 +83,16 @@ G_DEFINE_TYPE(GArmV7Processor, g_armv7_processor, G_TYPE_ARM_PROCESSOR); static void g_armv7_processor_class_init(GArmV7ProcessorClass *klass) { GObjectClass *object_class; /* Autre version de la classe */ + GArchProcessorClass *proc; /* Encore une autre vision... */ object_class = G_OBJECT_CLASS(klass); + proc = G_ARCH_PROCESSOR_CLASS(klass); object_class->dispose = (GObjectFinalizeFunc/* ! */)g_armv7_processor_dispose; object_class->finalize = (GObjectFinalizeFunc)g_armv7_processor_finalize; + proc->disassemble = (disass_instr_fc)g_armv7_processor_disassemble; + } @@ -171,3 +181,70 @@ GArmV7Processor *g_armv7_processor_new(void) return result; } + + +/****************************************************************************** +* * +* Paramètres : proc = architecture visée par la procédure. * +* ctx = contexte lié à l'exécution du processeur. * +* data = flux de données à analyser. * +* pos = position courante dans ce flux. [OUT] * +* end = limite des données à analyser. * +* * +* Description : Désassemble une instruction dans un flux de données. * +* * +* Retour : Instruction mise en place ou NULL en cas d'échec. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static GArchInstruction *g_armv7_processor_disassemble(const GArmV7Processor *proc, GArmContext *ctx, const bin_t *data, vmpa2t *pos, phys_t end) +{ + GArchInstruction *result; /* Instruction à renvoyer */ + phys_t start; /* Point de départ de lecture */ + uint32_t raw; /* Donnée 32 bits à analyser */ + + + + //printf("Position :: 0x%x\n", (unsigned int)get_phy_addr(pos)); + + // @ 0xae6c + // 0xe1a0000a + + // 1110 0001 1010 0000 0000 0000 0000 1010 + + + //exit(1); + + + raw = 0xe1a0000a; + + + start = get_phy_addr(pos); + + if (!read_u32(&raw, data, &start, end, G_ARCH_PROCESSOR(proc)->endianness)) + return NULL; + + + if (raw == 0xe1a0000a) + printf("read !!!!!!!\n"); + + + /* TODO : thumb... */ + + + result = process_armv7_instruction_set_encoding(raw); + + if (result != NULL) + advance_vmpa(pos, 4); + + else + result = g_raw_instruction_new_array(data, MDS_32_BITS, 1, pos, end, + G_ARCH_PROCESSOR(proc)->endianness); + + + + return result; + +} |