summaryrefslogtreecommitdiff
path: root/src/arch/processor.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2011-10-12 13:31:00 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2011-10-12 13:31:00 (GMT)
commit044b4d6d7ba4de50cd4d05b92621900e929e2231 (patch)
tree70167cbd5c90d0f8b2fc967add38272d21de1e4f /src/arch/processor.c
parente8d2795d9ec2c8845641863fc42ce39f9e92906b (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.c42
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);