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 | |
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')
-rw-r--r-- | src/arch/arm/instruction.c | 4 | ||||
-rw-r--r-- | src/arch/arm/processor.c | 63 | ||||
-rw-r--r-- | src/arch/arm/v456/instruction.c | 4 |
3 files changed, 62 insertions, 9 deletions
diff --git a/src/arch/arm/instruction.c b/src/arch/arm/instruction.c index 70517b3..77dd621 100644 --- a/src/arch/arm/instruction.c +++ b/src/arch/arm/instruction.c @@ -101,7 +101,7 @@ static void g_arm_instruction_init(GArmInstruction *instr) * * * Paramètres : data = flux de données à analyser. * * pos = position courante dans ce flux. * -* len = taille totale des données à analyser. * +* end = limite des données à analyser. * * * * Description : Recherche l'identifiant de la prochaine instruction. * * * @@ -111,7 +111,7 @@ static void g_arm_instruction_init(GArmInstruction *instr) * * ******************************************************************************/ -ArmOpcodes arm_guess_next_instruction(const bin_t *data, off_t pos, off_t len) +ArmOpcodes arm_guess_next_instruction(const bin_t *data, off_t pos, off_t end) { ArmOpcodes result; /* Identifiant à retourner */ 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 */ diff --git a/src/arch/arm/v456/instruction.c b/src/arch/arm/v456/instruction.c index 0ab85c0..3ba3c54 100644 --- a/src/arch/arm/v456/instruction.c +++ b/src/arch/arm/v456/instruction.c @@ -509,7 +509,7 @@ static void g_dalvik_instruction_get_rw_registers(const GDalvikInstruction *inst * * * Paramètres : data = flux de données à analyser. * * pos = position courante dans ce flux. * -* len = taille totale des données à analyser. * +* end = limite des données à analyser. * * * * Description : Recherche l'identifiant de la prochaine instruction. * * * @@ -519,7 +519,7 @@ static void g_dalvik_instruction_get_rw_registers(const GDalvikInstruction *inst * * ******************************************************************************/ -DalvikOpcodes dalvik_guess_next_instruction(const bin_t *data, off_t pos, off_t len) +DalvikOpcodes dalvik_guess_next_instruction(const bin_t *data, off_t pos, off_t end) { DalvikOpcodes result; /* Identifiant à retourner */ |