diff options
Diffstat (limited to 'src/arch')
-rw-r--r-- | src/arch/processor-int.h | 19 | ||||
-rw-r--r-- | src/arch/processor.c | 171 | ||||
-rw-r--r-- | src/arch/processor.h | 29 |
3 files changed, 216 insertions, 3 deletions
diff --git a/src/arch/processor-int.h b/src/arch/processor-int.h index 0a95fde..a308bb8 100644 --- a/src/arch/processor-int.h +++ b/src/arch/processor-int.h @@ -59,6 +59,16 @@ typedef GArchInstruction * (* disass_instr_fc) (const GArchProcessor *, GProcCon +/* Description d'une erreur */ +typedef struct _proc_error +{ + ArchProcessingError type; /* Type d'erreur */ + + vmpa2t addr; /* Localisation du problème */ + char *desc; /* Description du soucis */ + +} proc_error; + /* Couverture d'un groupe d'instructions */ struct _instr_coverage { @@ -70,8 +80,6 @@ struct _instr_coverage }; - - /* Définition générique d'un processeur d'architecture (instance) */ struct _GArchProcessor { @@ -92,6 +100,13 @@ struct _GArchProcessor gint locked; /* Statut d'accès à la liste */ #endif + proc_error *errors; /* Liste d'erreurs rencontrées */ + size_t error_count; /* Taille de cette liste */ + GMutex error_mutex; /* Verrou pour l'accès */ +#ifndef NDEBUG + gint error_locked; /* Statut d'accès à la liste */ +#endif + instr_coverage *coverages; /* Liste de couvertures */ size_t cov_allocated; /* Taille de la liste allouée */ size_t cov_count; /* Taille de la liste utilisée */ diff --git a/src/arch/processor.c b/src/arch/processor.c index 38c39e6..21b6c49 100644 --- a/src/arch/processor.c +++ b/src/arch/processor.c @@ -27,6 +27,7 @@ #include <assert.h> #include <malloc.h> #include <stdlib.h> +#include <string.h> @@ -129,10 +130,17 @@ static void g_arch_processor_class_init(GArchProcessorClass *klass) static void g_arch_processor_init(GArchProcessor *proc) { + g_mutex_init(&proc->mutex); #ifndef DEBUG g_atomic_int_set(&proc->locked, 0); #endif - g_mutex_init(&proc->mutex); + + proc->errors = NULL; + proc->error_count = 0; + g_mutex_init(&proc->error_mutex); +#ifndef DEBUG + g_atomic_int_set(&proc->error_locked, 0); +#endif proc->coverages = NULL; proc->cov_allocated = 0; @@ -157,6 +165,8 @@ static void g_arch_processor_dispose(GArchProcessor *proc) { g_mutex_clear(&proc->mutex); + g_mutex_clear(&proc->error_mutex); + G_OBJECT_CLASS(g_arch_processor_parent_class)->dispose(G_OBJECT(proc)); } @@ -176,6 +186,18 @@ static void g_arch_processor_dispose(GArchProcessor *proc) static void g_arch_processor_finalize(GArchProcessor *proc) { + size_t i; /* Boucle de parcours */ + + if (proc->errors != NULL) + { + for (i = 0; i < proc->error_count; i++) + if (proc->errors[i].desc != NULL) + free(proc->errors[i].desc); + + free(proc->errors); + + } + G_OBJECT_CLASS(g_arch_processor_parent_class)->finalize(G_OBJECT(proc)); } @@ -498,6 +520,153 @@ GArchInstruction *g_arch_processor_get_instruction(const GArchProcessor *proc, s /* ---------------------------------------------------------------------------------- */ +/* CONSERVATION DES SOUCIS DURANT LE CHARGEMENT */ +/* ---------------------------------------------------------------------------------- */ + + +/****************************************************************************** +* * +* Paramètres : proc = architecture à manipuler. * +* state = nouvel état de l'accès aux erreurs relevées. * +* * +* Description : Protège ou lève la protection de l'accès aux erreurs. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_arch_processor_lock_unlock_errors(GArchProcessor *proc, bool state) +{ + if (state) + { + g_mutex_lock(&proc->error_mutex); + g_atomic_int_set(&proc->error_locked, 1); + } + else + { + g_atomic_int_set(&proc->error_locked, 0); + g_mutex_unlock(&proc->error_mutex); + } + +} + + +/****************************************************************************** +* * +* Paramètres : proc = architecture concernée par la procédure. * +* index = indice du problème visé. * +* type = type d'erreur retrouvée. * +* addr = localisation associée. * +* desc = éventuelle description humaine de description. * +* * +* Description : Etend la liste des soucis détectés avec de nouvelles infos. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void g_arch_processor_add_error(GArchProcessor *proc, ArchProcessingError type, const vmpa2t *addr, const char *desc) +{ + proc_error *error; /* Raccourci de confort */ + + g_arch_processor_lock_errors(proc); + + proc->errors = realloc(proc->errors, ++proc->error_count * sizeof(proc_error)); + + error = &proc->errors[proc->error_count - 1]; + + error->type = type; + + copy_vmpa(&error->addr, addr); + + if (desc != NULL) + error->desc = strdup(desc); + else + error->desc = NULL; + + g_arch_processor_unlock_errors(proc); + +} + + +/****************************************************************************** +* * +* Paramètres : proc = architecture à consulter durant la procédure. * +* * +* Description : Indique le nombre d'erreurs relevées au niveau assembleur. * +* * +* Retour : Nombre d'erreurs en stock. * +* * +* Remarques : - * +* * +******************************************************************************/ + +size_t g_arch_processor_count_errors(GArchProcessor *proc) +{ + size_t result; /* Quantité à retourner */ + + assert(g_atomic_int_get(&proc->error_locked) == 1); + + result = proc->error_count; + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : proc = architecture concernée par la procédure. * +* index = indice du problème visé. * +* type = type d'erreur retrouvée. [OUT] * +* addr = localisation associée. [OUT] * +* desc = éventuelle description humaine de description. [OUT] * +* * +* Description : Fournit les éléments concernant un soucis détecté. * +* * +* Retour : Validité des informations renseignées. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool g_arch_processor_get_error(GArchProcessor *proc, size_t index, ArchProcessingError *type, vmpa2t *addr, char **desc) +{ + bool result; /* Bilan à retourner */ + proc_error *error; /* Raccourci de confort */ + + assert(g_atomic_int_get(&proc->error_locked) == 1); + + result = (index < proc->error_count); + + assert(result); + + if (result) + { + error = &proc->errors[index]; + + *type = error->type; + + copy_vmpa(addr, &error->addr); + + if (error->desc != NULL) + *desc = strdup(error->desc); + else + *desc = NULL; + + } + + return result; + +} + + + +/* ---------------------------------------------------------------------------------- */ /* MANIPULATIONS DES INSTRUCTIONS DESASSEMBLEES */ /* ---------------------------------------------------------------------------------- */ diff --git a/src/arch/processor.h b/src/arch/processor.h index 2a8a8c1..87c0738 100644 --- a/src/arch/processor.h +++ b/src/arch/processor.h @@ -98,6 +98,35 @@ GArchInstruction *g_arch_processor_get_instruction(const GArchProcessor *, size_ +/* ------------------ CONSERVATION DES SOUCIS DURANT LE CHARGEMENT ------------------ */ + + +/* Types d'erreurs détectées */ +typedef enum _ArchProcessingError +{ + APE_DISASSEMBLY = ((0 << 2) | (1 << 0)),/* Code non reconnu */ + APE_LABEL = ((1 << 2) | (1 << 0)) /* Etiquette non référencée */ + +} ArchProcessingError; + + +/* Protège ou lève la protection de l'accès aux erreurs. */ +void g_arch_processor_lock_unlock_errors(GArchProcessor *, bool); + +#define g_arch_processor_lock_errors(p) g_arch_processor_lock_unlock_errors(p, true) +#define g_arch_processor_unlock_errors(p) g_arch_processor_lock_unlock_errors(p, false) + +/* Etend la liste des soucis détectés avec de nouvelles infos. */ +void g_arch_processor_add_error(GArchProcessor *, ArchProcessingError, const vmpa2t *, const char *); + +/* Indique le nombre d'erreurs relevées au niveau assembleur. */ +size_t g_arch_processor_count_errors(GArchProcessor *); + +/* Fournit les éléments concernant un soucis détecté. */ +bool g_arch_processor_get_error(GArchProcessor *, size_t, ArchProcessingError *, vmpa2t *, char **); + + + /* ------------------ MANIPULATIONS DES INSTRUCTIONS DESASSEMBLEES ------------------ */ |