From 23bc425f9c35c31a80d65d824452c8728614a206 Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Tue, 13 Nov 2018 22:42:10 +0100 Subject: Exported extra processor features. --- plugins/pychrysalide/arch/processor.c | 113 ++++++++++++++++++++++++++++++++++ src/analysis/disass/area.c | 26 +++++++- src/arch/processor.c | 4 +- src/arch/processor.h | 2 +- 4 files changed, 141 insertions(+), 4 deletions(-) diff --git a/plugins/pychrysalide/arch/processor.c b/plugins/pychrysalide/arch/processor.c index 6466fc9..7ff374b 100644 --- a/plugins/pychrysalide/arch/processor.c +++ b/plugins/pychrysalide/arch/processor.c @@ -49,6 +49,15 @@ /* ---------------------------- DEFINITION DE PROCESSEUR ---------------------------- */ +/* Fournit le boustime du processeur d'une architecture. */ +static PyObject *py_arch_processor_get_endianness(PyObject *, void *); + +/* Fournit la taille de l'espace mémoire d'une architecture. */ +static PyObject *py_arch_processor_get_memory_size(PyObject *, void *); + +/* Fournit la taille min. des instructions d'une architecture. */ +static PyObject *py_arch_processor_get_instruction_min_size(PyObject *, void *); + /* Indique si l'architecture possède un espace virtuel ou non. */ static PyObject *py_arch_processor_has_virtual_space(PyObject *, void *); @@ -91,10 +100,102 @@ static bool define_python_arch_processor_constants(PyTypeObject *); +/* ---------------------------------------------------------------------------------- */ +/* DEFINITION DE PROCESSEUR */ +/* ---------------------------------------------------------------------------------- */ + +/****************************************************************************** +* * +* Paramètres : self = objet Python concerné par l'appel. * +* closure = non utilisé ici. * +* * +* Description : Fournit le boustime du processeur d'une architecture. * +* * +* Retour : Boutisme associé au processeur. * +* * +* Remarques : - * +* * +******************************************************************************/ +static PyObject *py_arch_processor_get_endianness(PyObject *self, void *closure) +{ + PyObject *result; /* Instance Python à retourner */ + GArchProcessor *proc; /* Version GLib de l'opérande */ + SourceEndian endianness; /* Boutisme du processeur */ + proc = G_ARCH_PROCESSOR(pygobject_get(self)); + assert(proc != NULL); + endianness = g_arch_processor_get_endianness(proc); + + result = Py_BuildValue("I", endianness); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : self = objet Python concerné par l'appel. * +* closure = non utilisé ici. * +* * +* Description : Fournit la taille de l'espace mémoire d'une architecture. * +* * +* Retour : Taille de l'espace mémoire. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_arch_processor_get_memory_size(PyObject *self, void *closure) +{ + PyObject *result; /* Instance Python à retourner */ + GArchProcessor *proc; /* Version GLib de l'opérande */ + MemoryDataSize size; /* Type de donnée représentée */ + + proc = G_ARCH_PROCESSOR(pygobject_get(self)); + assert(proc != NULL); + + size = g_arch_processor_get_memory_size(proc); + + result = Py_BuildValue("I", size); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : self = objet Python concerné par l'appel. * +* closure = non utilisé ici. * +* * +* Description : Fournit la taille min. des instructions d'une architecture. * +* * +* Retour : Taille d'encodage des instructions. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static PyObject *py_arch_processor_get_instruction_min_size(PyObject *self, void *closure) +{ + PyObject *result; /* Instance Python à retourner */ + GArchProcessor *proc; /* Version GLib de l'opérande */ + MemoryDataSize size; /* Type de donnée représentée */ + + proc = G_ARCH_PROCESSOR(pygobject_get(self)); + assert(proc != NULL); + + size = g_arch_processor_get_instruction_min_size(proc); + + result = Py_BuildValue("I", size); + + return result; + +} /****************************************************************************** @@ -440,6 +541,18 @@ PyTypeObject *get_python_arch_processor_type(void) static PyGetSetDef py_arch_processor_getseters[] = { { + "endianness", py_arch_processor_get_endianness, NULL, + "Provide the processor endianness.", NULL + }, + { + "mem_size", py_arch_processor_get_memory_size, NULL, + "Provide the size of memory addresses for the given architecture.", NULL + }, + { + "ins_min_size", py_arch_processor_get_instruction_min_size, NULL, + "Provide the minimal size of one processor instruction.", NULL + }, + { "virtual_space", py_arch_processor_has_virtual_space, NULL, "Tell if the processor provides a virtual address space.", NULL }, diff --git a/src/analysis/disass/area.c b/src/analysis/disass/area.c index 2dca001..0a82b99 100644 --- a/src/analysis/disass/area.c +++ b/src/analysis/disass/area.c @@ -286,7 +286,31 @@ static void init_mem_area_from_addr(mem_area *area, const vmpa2t *addr, phys_t l area->content = g_restricted_content_new(content, &area->range); - area->packing_size = 2; /* FIXME */ + switch (g_arch_processor_get_instruction_min_size(area->proc)) + { + case MDS_4_BITS: + case MDS_8_BITS: + area->packing_size = 1; + break; + + case MDS_16_BITS: + area->packing_size = 2; + break; + + case MDS_32_BITS: + area->packing_size = 4; + break; + + case MDS_64_BITS: + area->packing_size = 8; + break; + + default: + assert(false); + area->packing_size = 1; + break; + + } area->processed = create_bit_field(len, false); area->instructions = (GArchInstruction **)calloc(len, sizeof(GArchInstruction *)); diff --git a/src/arch/processor.c b/src/arch/processor.c index 06f9c2f..4450208 100644 --- a/src/arch/processor.c +++ b/src/arch/processor.c @@ -297,13 +297,13 @@ MemoryDataSize g_arch_processor_get_memory_size(const GArchProcessor *proc) * * * Description : Fournit la taille min. des instructions d'une architecture. * * * -* Retour : Taille d'encodage des instructions * +* Retour : Taille d'encodage des instructions. * * * * Remarques : - * * * ******************************************************************************/ -MemoryDataSize g_arch_processor_get_instruction_size(const GArchProcessor *proc) +MemoryDataSize g_arch_processor_get_instruction_min_size(const GArchProcessor *proc) { return proc->inssize; diff --git a/src/arch/processor.h b/src/arch/processor.h index 762d547..24d9287 100644 --- a/src/arch/processor.h +++ b/src/arch/processor.h @@ -65,7 +65,7 @@ SourceEndian g_arch_processor_get_endianness(const GArchProcessor *); MemoryDataSize g_arch_processor_get_memory_size(const GArchProcessor *); /* Fournit la taille min. des instructions d'une architecture. */ -MemoryDataSize g_arch_processor_get_instruction_size(const GArchProcessor *); +MemoryDataSize g_arch_processor_get_instruction_min_size(const GArchProcessor *); /* Indique si l'architecture possède un espace virtuel ou non. */ bool g_arch_processor_has_virtual_space(const GArchProcessor *); -- cgit v0.11.2-87-g4458