summaryrefslogtreecommitdiff
path: root/src/arch/context.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2014-12-25 16:31:33 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2014-12-25 16:31:33 (GMT)
commit19e1a97fafb1b73d0efcd995b31951daf1a5c661 (patch)
tree9cbc897ddb1d3005fb8dadfa3ad830c607acdddd /src/arch/context.c
parent9cab778bfaaca2589a383445e8569d99d73374d5 (diff)
Cleaned all the code for immediate operands.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@444 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/arch/context.c')
-rw-r--r--src/arch/context.c108
1 files changed, 107 insertions, 1 deletions
diff --git a/src/arch/context.c b/src/arch/context.c
index 220ed14..46c4dd1 100644
--- a/src/arch/context.c
+++ b/src/arch/context.c
@@ -2,7 +2,7 @@
/* Chrysalide - Outil d'analyse de fichiers binaires
* context.c - contexte lié à l'exécution d'un processeur
*
- * Copyright (C) 2011 Cyrille Bagard
+ * Copyright (C) 2011-2014 Cyrille Bagard
*
* This file is part of Chrysalide.
*
@@ -24,6 +24,11 @@
#include "context.h"
+#include <assert.h>
+#include <malloc.h>
+#include <string.h>
+
+
#include "context-int.h"
@@ -73,5 +78,106 @@ static void g_proc_context_class_init(GProcContextClass *klass)
static void g_proc_context_init(GProcContext *ctx)
{
+ ctx->drop_points = NULL;
+ ctx->dp_count = 0;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : ctx = contexte de désassemblage à compléter. *
+* addr = adresse d'un nouveau point de départ à traiter. *
+* *
+* Description : Ajoute une adresse virtuelle comme point de départ de code. *
+* *
+* Retour : - *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+void g_proc_context_push_drop_point(GProcContext *ctx, virt_t addr)
+{
+ ctx->drop_points = (virt_t *)realloc(ctx->drop_points, ++ctx->dp_count * sizeof(virt_t));
+
+ ctx->drop_points[ctx->dp_count - 1] = addr;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : ctx = contexte de désassemblage à consulter. *
+* *
+* Description : Indique si des points de départ restent à traiter ou non. *
+* *
+* Retour : true s'il existe encore au moins un point, false sinon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool g_proc_context_has_drop_points(const GProcContext *ctx)
+{
+ return ctx->dp_count > 0;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : ctx = contexte de désassemblage à consulter. *
+* addr = adresse de mémoire virtuelle à rechercher. *
+* *
+* Description : Précise si une adresse donnée figure comme point de départ. *
+* *
+* Retour : true si l'adresse est connue en interne, false sinon. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool g_proc_context_has_addr_as_drop_points(const GProcContext *ctx, virt_t addr)
+{
+ bool result; /* Bilan à retourner */
+ size_t i; /* Boucle de parcours */
+
+ result = false;
+
+ for (i = 0; i < ctx->dp_count && !result; i++)
+ result = (ctx->drop_points[i] == addr);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : ctx = contexte de désassemblage à compléter. *
+* *
+* Description : Fournit une adresse virtuelle comme point de départ de code. *
+* *
+* Retour : Adresse d'un point de départ de code à traiter. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+virt_t g_proc_context_pop_drop_point(GProcContext *ctx)
+{
+ virt_t result; /* Adresse à retourner */
+
+ assert(ctx->dp_count > 0);
+
+ result = ctx->drop_points[0];
+
+ if (ctx->dp_count > 1)
+ memmove(&ctx->drop_points[0], &ctx->drop_points[1], (ctx->dp_count - 1) * sizeof(virt_t));
+
+ ctx->drop_points = (virt_t *)realloc(ctx->drop_points, --ctx->dp_count * sizeof(virt_t));
+
+ return result;
}