summaryrefslogtreecommitdiff
path: root/src/arch/processor.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/processor.c')
-rw-r--r--src/arch/processor.c196
1 files changed, 154 insertions, 42 deletions
diff --git a/src/arch/processor.c b/src/arch/processor.c
index 615aa86..26c7170 100644
--- a/src/arch/processor.c
+++ b/src/arch/processor.c
@@ -59,6 +59,12 @@ static void g_arch_processor_class_init(GArchProcessorClass *);
/* Initialise une instance de processeur d'architecture. */
static void g_arch_processor_init(GArchProcessor *);
+/* Supprime toutes les références externes. */
+static void g_arch_processor_dispose(GArchProcessor *);
+
+/* Procède à la libération totale de la mémoire. */
+static void g_arch_processor_finalize(GArchProcessor *);
+
@@ -76,6 +82,9 @@ static void g_arch_processor_finish_last_coverage(GArchProcessor *, GArchInstruc
+
+
+
/* Indique le type défini pour un processeur d'architecture. */
G_DEFINE_TYPE(GArchProcessor, g_arch_processor, G_TYPE_OBJECT);
@@ -94,6 +103,12 @@ G_DEFINE_TYPE(GArchProcessor, g_arch_processor, G_TYPE_OBJECT);
static void g_arch_processor_class_init(GArchProcessorClass *klass)
{
+ GObjectClass *object; /* Autre version de la classe */
+
+ object = G_OBJECT_CLASS(klass);
+
+ object->dispose = (GObjectFinalizeFunc/* ! */)g_arch_processor_dispose;
+ object->finalize = (GObjectFinalizeFunc)g_arch_processor_finalize;
}
@@ -112,6 +127,11 @@ static void g_arch_processor_class_init(GArchProcessorClass *klass)
static void g_arch_processor_init(GArchProcessor *proc)
{
+#ifndef DEBUG
+ g_atomic_int_set(&proc->loacked, 0);
+#endif
+ g_mutex_init(&proc->mutex);
+
proc->coverages = NULL;
proc->cov_allocated = 0;
proc->cov_count = 0;
@@ -121,6 +141,46 @@ static void g_arch_processor_init(GArchProcessor *proc)
/******************************************************************************
* *
+* Paramètres : proc = instance d'objet GLib à traiter. *
+* *
+* Description : Supprime toutes les références externes. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_arch_processor_dispose(GArchProcessor *proc)
+{
+ g_mutex_clear(&proc->mutex);
+
+ G_OBJECT_CLASS(g_arch_processor_parent_class)->dispose(G_OBJECT(proc));
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : proc = instance d'objet GLib à traiter. *
+* *
+* Description : Procède à la libération totale de la mémoire. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static void g_arch_processor_finalize(GArchProcessor *proc)
+{
+ G_OBJECT_CLASS(g_arch_processor_parent_class)->finalize(G_OBJECT(proc));
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : proc = architecture visée par la procédure. *
* *
* Description : Fournit un contexte propre au processeur d'une architecture. *
@@ -268,6 +328,62 @@ GArchInstruction *g_arch_processor_disassemble(const GArchProcessor *proc, GProc
/* ---------------------------------------------------------------------------------- */
+/* RASSEMBLEMENT DES INSTRUCTIONS DESASSEMBLEES */
+/* ---------------------------------------------------------------------------------- */
+
+
+/******************************************************************************
+* *
+* Paramètres : proc = architecture à manipuler. *
+* state = nouvel état de l'accès aux instructions. *
+* *
+* Description : Protège ou lève la protection de l'accès aux instructions. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_arch_processor_lock_unlock(GArchProcessor *proc, bool state)
+{
+ if (state)
+ {
+ g_mutex_lock(&proc->mutex);
+ g_atomic_int_set(&proc->locked, 1);
+ }
+ else
+ {
+ g_atomic_int_set(&proc->locked, 0);
+ g_mutex_unlock(&proc->mutex);
+ }
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : proc = architecture à consulter via la procédure. *
+* *
+* Description : Fournit la marque de dernière modification des instructions. *
+* *
+* Retour : Marque de la dernière modification de la liste d'instruct°. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+unsigned int g_arch_processor_get_stamp(const GArchProcessor *proc)
+{
+ //assert(g_atomic_int_get(&proc->locked) == 1);
+
+ return proc->stamp;
+
+}
+
+
+
+/* ---------------------------------------------------------------------------------- */
/* MANIPULATIONS DES INSTRUCTIONS DESASSEMBLEES */
/* ---------------------------------------------------------------------------------- */
@@ -348,48 +464,6 @@ static void g_arch_processor_finish_last_coverage(GArchProcessor *proc, GArchIns
/******************************************************************************
* *
-* Paramètres : proc = processeur recensant diverses instructions. *
-* addr = position en mémoire ou physique à chercher. *
-* *
-* Description : Recherche un groupe d'instruction d'après son adresse. *
-* *
-* Retour : Couverture trouvée ou NULL si aucune. *
-* *
-* Remarques : - *
-* *
-******************************************************************************/
-
-const instr_coverage *g_arch_processor_find_coverage_by_address(const GArchProcessor *proc, const vmpa2t *addr)
-{
- instr_coverage *result; /* Trouvaille à retourner */
- void *ptr; /* Résultat des recherches */
-
- int search_for_coverage_by_addr(const vmpa2t *a, const instr_coverage *c)
- {
- int status; /* Bilan d'une comparaison */
-
- status = cmp_mrange_with_vmpa(&c->range, a);
-
- return status;
-
- }
-
- ptr = bsearch(addr, proc->coverages, proc->cov_count,
- sizeof(instr_coverage), (__compar_fn_t)search_for_coverage_by_addr);
-
- result = ((instr_coverage *)ptr);
-
- return result;
-
-}
-
-
-
-
-
-
-/******************************************************************************
-* *
* Paramètres : proc = architecture visée par la procédure. *
* list = liste des instructions désassemblées. *
* *
@@ -519,6 +593,44 @@ size_t g_arch_processor_count_disassembled_instructions(const GArchProcessor *pr
/******************************************************************************
* *
+* Paramètres : proc = processeur recensant diverses instructions. *
+* addr = position en mémoire ou physique à chercher. *
+* *
+* Description : Recherche un groupe d'instruction d'après son adresse. *
+* *
+* Retour : Couverture trouvée ou NULL si aucune. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+const instr_coverage *g_arch_processor_find_coverage_by_address(const GArchProcessor *proc, const vmpa2t *addr)
+{
+ instr_coverage *result; /* Trouvaille à retourner */
+ void *ptr; /* Résultat des recherches */
+
+ int search_for_coverage_by_addr(const vmpa2t *a, const instr_coverage *c)
+ {
+ int status; /* Bilan d'une comparaison */
+
+ status = cmp_mrange_with_vmpa(&c->range, a);
+
+ return status;
+
+ }
+
+ ptr = bsearch(addr, proc->coverages, proc->cov_count,
+ sizeof(instr_coverage), (__compar_fn_t)search_for_coverage_by_addr);
+
+ result = ((instr_coverage *)ptr);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
* Paramètres : proc = processeur recensant diverses instructions. *
* addr = position en mémoire ou physique à chercher. *
* nearby = la recherche s'effectue-t-elle de façon stricte ? *