summaryrefslogtreecommitdiff
path: root/src/arch/arm/v7/processor.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2014-10-06 20:52:21 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2014-10-06 20:52:21 (GMT)
commit1d5f7f28f92251dc4d3bff8d87b3e3052ab9cab2 (patch)
tree1ad4346a8cbcd8379850f68d04cb8757371c05e1 /src/arch/arm/v7/processor.c
parentada6b756efd6ca109f6c46aa4d3eb11c17ad6b84 (diff)
Got prepared to disassemble some ARMv7 instructions.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@409 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/arch/arm/v7/processor.c')
-rw-r--r--src/arch/arm/v7/processor.c77
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;
+
+}