diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2011-10-12 13:31:00 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2011-10-12 13:31:00 (GMT) |
commit | 044b4d6d7ba4de50cd4d05b92621900e929e2231 (patch) | |
tree | 70167cbd5c90d0f8b2fc967add38272d21de1e4f /src/arch/processor.c | |
parent | e8d2795d9ec2c8845641863fc42ce39f9e92906b (diff) |
Processed skipped instructions and used contexts.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@212 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/arch/processor.c')
-rw-r--r-- | src/arch/processor.c | 42 |
1 files changed, 38 insertions, 4 deletions
diff --git a/src/arch/processor.c b/src/arch/processor.c index 2b1f060..0e4fc3f 100644 --- a/src/arch/processor.c +++ b/src/arch/processor.c @@ -115,6 +115,33 @@ static void g_arch_processor_init(GArchProcessor *proc) /****************************************************************************** * * +* Paramètres : proc = architecture visée par la procédure. * +* * +* Description : Fournit un contexte propre au processeur d'une architecture. * +* * +* Retour : Nouveau contexte mise à disposition. * +* * +* Remarques : - * +* * +******************************************************************************/ + +GProcContext *g_arch_processor_get_context(const GArchProcessor *proc) +{ + GProcContext *result; /* Contexte à retourner */ + + if (proc->get_ctx != NULL) + result = proc->get_ctx(proc); + + else + result = NULL; + + return result; + +} + + +/****************************************************************************** +* * * Paramètres : proc = processeur d'architecture à consulter. * * * * Description : Fournit le boustime du processeur d'une architecture. * @@ -173,6 +200,7 @@ MemoryDataSize g_arch_processor_get_instruction_size(const GArchProcessor *proc) /****************************************************************************** * * * 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. * @@ -187,20 +215,26 @@ MemoryDataSize g_arch_processor_get_instruction_size(const GArchProcessor *proc) * * ******************************************************************************/ -GArchInstruction *g_arch_processor_decode_instruction(const GArchProcessor *proc, const bin_t *data, off_t *pos, off_t len, off_t base, vmpa_t addr) +GArchInstruction *g_arch_processor_decode_instruction(const GArchProcessor *proc, GProcContext *ctx, const bin_t *data, off_t *pos, off_t len, off_t base, vmpa_t addr) { GArchInstruction *result; /* Instruction à renvoyer */ off_t old_pos; /* Sauvegarde de la position */ + bool skipped; /* Données prise en compte ? */ old_pos = *pos; - result = proc->decode(proc, data, pos, len, addr); + result = proc->decode(proc, ctx, data, pos, len, addr); - if (result == NULL) + if (result == NULL || result == SKIPPED_INSTR) { + skipped = (result == SKIPPED_INSTR); + *pos = old_pos; - printf("ERRerr while decoding opcode 0x%02hhx at 0x%08llx\n", data[*pos], addr); result = g_db_instruction_new_from_data(data, pos, len, base, proc); + + if (skipped) + g_db_instruction_mark_as_skipped(G_DB_INSTRUCTION(result)); + } g_arch_instruction_set_location(result, base + old_pos, *pos - old_pos, addr); |