diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2014-07-31 05:53:06 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2014-07-31 05:53:06 (GMT) |
commit | a5d8e3fc30cda2e13d30f099e93ab1b182fdc0bd (patch) | |
tree | cf183906b2301cd3c726af820292fd0f2458bfa1 /src/arch/arm/processor.c | |
parent | dc436357ff29158dddd836d368d152d42d5b086b (diff) |
Improved the way code is decoded by avoiding to propagate the base address everywhere.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@385 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/arch/arm/processor.c')
-rw-r--r-- | src/arch/arm/processor.c | 63 |
1 files changed, 58 insertions, 5 deletions
diff --git a/src/arch/arm/processor.c b/src/arch/arm/processor.c index 44dcb19..4bd342f 100644 --- a/src/arch/arm/processor.c +++ b/src/arch/arm/processor.c @@ -52,6 +52,12 @@ static void g_arm_processor_class_init(GArmProcessorClass *); /* Initialise une instance de processeur ARM. */ static void g_arm_processor_init(GArmProcessor *); +/* Supprime toutes les références externes. */ +static void g_arm_processor_dispose(GArmProcessor *); + +/* Procède à la libération totale de la mémoire. */ +static void g_arm_processor_finalize(GArmProcessor *); + /* Décode une instruction dans un flux de données. */ static GArchInstruction *g_arm_processor_decode_instruction(const GArmProcessor *, GProcContext *, const bin_t *, off_t *, off_t, vmpa_t, GBinFormat *); @@ -75,6 +81,17 @@ G_DEFINE_TYPE(GArmProcessor, g_arm_processor, G_TYPE_ARCH_PROCESSOR); static void g_arm_processor_class_init(GArmProcessorClass *klass) { + GObjectClass *object; /* Autre version de la classe */ + GArchProcessorClass *proc; /* Encore une autre vision... */ + + object = G_OBJECT_CLASS(klass); + + object->dispose = (GObjectFinalizeFunc/* ! */)g_arm_processor_dispose; + object->finalize = (GObjectFinalizeFunc)g_arm_processor_finalize; + + proc = G_ARCH_PROCESSOR_CLASS(klass); + + proc->decode = (decode_instruction_fc)g_arm_processor_decode_instruction; } @@ -101,7 +118,43 @@ static void g_arm_processor_init(GArmProcessor *proc) parent->memsize = MDS_32_BITS; parent->inssize = MDS_32_BITS; - parent->decode = (decode_instruction_fc)g_arm_processor_decode_instruction; +} + + +/****************************************************************************** +* * +* Paramètres : proc = instance d'objet GLib à traiter. * +* * +* Description : Supprime toutes les références externes. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_arm_processor_dispose(GArmProcessor *proc) +{ + G_OBJECT_CLASS(g_arm_processor_parent_class)->dispose(G_OBJECT(proc)); + +} + + +/****************************************************************************** +* * +* Paramètres : bookmark = instance d'objet GLib à traiter. * +* * +* Description : Procède à la libération totale de la mémoire. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void g_arm_processor_finalize(GArmProcessor *proc) +{ + G_OBJECT_CLASS(g_arm_processor_parent_class)->finalize(G_OBJECT(proc)); } @@ -131,11 +184,11 @@ GArchProcessor *g_arm_processor_new(void) /****************************************************************************** * * -* Paramètres : proc = architecture visée par la procédure. * -* ctx = contexte lié à l'exécution du processeur. * +* 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] * -* len = taille totale des données à analyser. * +* end = limite des données à analyser. * * addr = adresse virtuelle de l'instruction. * * format = format du fichier contenant le code. * * * @@ -149,7 +202,7 @@ GArchProcessor *g_arm_processor_new(void) #include "encoding.h" extern GArchInstruction *try_to_decode_arm_v456_instr(bin_t *); -static GArchInstruction *g_arm_processor_decode_instruction(const GArmProcessor *proc, GProcContext *ctx, const bin_t *data, off_t *pos, off_t len, vmpa_t addr, GBinFormat *format) +static GArchInstruction *g_arm_processor_decode_instruction(const GArmProcessor *proc, GProcContext *ctx, const bin_t *data, off_t *pos, off_t end, vmpa_t addr, GBinFormat *format) { GArchInstruction *result; /* Instruction à renvoyer */ |