summaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/arm/v7/context.c7
-rw-r--r--src/arch/arm/v7/fetch.c19
-rw-r--r--src/arch/context-int.h8
-rw-r--r--src/arch/context.c62
-rw-r--r--src/arch/context.h16
-rw-r--r--src/arch/dalvik/fetch.c2
6 files changed, 74 insertions, 40 deletions
diff --git a/src/arch/arm/v7/context.c b/src/arch/arm/v7/context.c
index 446a972..659fdd1 100644
--- a/src/arch/arm/v7/context.c
+++ b/src/arch/arm/v7/context.c
@@ -63,7 +63,7 @@ static void g_armv7_context_dispose(GArmV7Context *);
static void g_armv7_context_finalize(GArmV7Context *);
/* Ajoute une adresse virtuelle comme point de départ de code. */
-static void g_armv7_context_push_drop_point(GArmV7Context *, unsigned int, virt_t, va_list);
+static void g_armv7_context_push_drop_point(GArmV7Context *, DisassPriorityLevel, virt_t, va_list);
@@ -209,13 +209,14 @@ GArmV7Context *g_armv7_context_new(void)
* *
******************************************************************************/
-static void g_armv7_context_push_drop_point(GArmV7Context *ctx, unsigned int level, virt_t addr, va_list ap)
+static void g_armv7_context_push_drop_point(GArmV7Context *ctx, DisassPriorityLevel level, virt_t addr, va_list ap)
{
ArmV7InstrSet marker; /* Type de jeu d'instructions */
switch (level)
{
- case 0:
+ case DPL_ENTRY_POINT:
+ case DPL_SYMBOL:
if (addr & 0x1)
{
diff --git a/src/arch/arm/v7/fetch.c b/src/arch/arm/v7/fetch.c
index 206e6e6..67129b2 100644
--- a/src/arch/arm/v7/fetch.c
+++ b/src/arch/arm/v7/fetch.c
@@ -99,7 +99,7 @@ void help_fetching_with_instruction_b_with_orig(GArchInstruction *instr, GArchPr
target = pc + offset;
//g_armv7_context_define_encoding(context, target, iset);
- g_proc_context_push_drop_point(G_PROC_CONTEXT(context), 3, target, iset);
+ g_proc_context_push_drop_point(G_PROC_CONTEXT(context), DPL_OTHER, target, iset);
}
@@ -168,7 +168,7 @@ void help_fetching_with_instruction_bl_with_orig(GArchInstruction *instr, GArchP
target = pc + offset;
//g_armv7_context_define_encoding(context, target, iset);
- g_proc_context_push_drop_point(G_PROC_CONTEXT(context), 3, target, iset);
+ g_proc_context_push_drop_point(G_PROC_CONTEXT(context), DPL_OTHER, target, iset);
}
@@ -227,7 +227,7 @@ void help_fetching_with_instruction_blx_with_dest(GArchInstruction *instr, GArch
target = pc + offset;
//g_armv7_context_define_encoding(context, target, iset);
- g_proc_context_push_drop_point(G_PROC_CONTEXT(context), 3, target, iset);
+ g_proc_context_push_drop_point(G_PROC_CONTEXT(context), DPL_OTHER, target, iset);
}
@@ -280,12 +280,12 @@ void help_fetching_with_instruction_bx_with_orig(GArchInstruction *instr, GArchP
case AV7IS_ARM:
pc += 8;
//g_armv7_context_define_encoding(context,
- g_proc_context_push_drop_point(G_PROC_CONTEXT(context), 3, pc, AV7IS_THUMB);
+ g_proc_context_push_drop_point(G_PROC_CONTEXT(context), DPL_OTHER, pc, AV7IS_THUMB);
break;
case AV7IS_THUMB:
pc += 4;
//g_armv7_context_define_encoding(context,
- g_proc_context_push_drop_point(G_PROC_CONTEXT(context), 3, pc, AV7IS_ARM);
+ g_proc_context_push_drop_point(G_PROC_CONTEXT(context), DPL_OTHER, pc, AV7IS_ARM);
break;
default:
assert(0);
@@ -342,7 +342,7 @@ void help_fetching_with_instruction_cb_n_z(GArchInstruction *instr, GArchProcess
target = pc + offset;
//g_armv7_context_define_encoding(context, target, AV7IS_THUMB);
- g_proc_context_push_drop_point(G_PROC_CONTEXT(context), 3, target, AV7IS_THUMB);
+ g_proc_context_push_drop_point(G_PROC_CONTEXT(context), DPL_OTHER, target, AV7IS_THUMB);
}
@@ -518,8 +518,13 @@ void help_fetching_with_instruction_ldr_literal_with_orig(GArchInstruction *inst
//target = pc + offset;
+ if (target & 0x1)
+ iset = AV7IS_THUMB;
+ //else
+ // iset = AV7IS_ARM;
+
//g_armv7_context_define_encoding(context, target, AV7IS_THUMB);
- g_proc_context_push_drop_point(G_PROC_CONTEXT(context), 0/*FIXME*/, target);
+ g_proc_context_push_drop_point(G_PROC_CONTEXT(context), DPL_OTHER, target, iset);
//exit(0);
diff --git a/src/arch/context-int.h b/src/arch/context-int.h
index 59a06bb..1ea8b6c 100644
--- a/src/arch/context-int.h
+++ b/src/arch/context-int.h
@@ -37,7 +37,7 @@
/* Ajoute une adresse virtuelle comme point de départ de code. */
-typedef void (* push_drop_point_fc) (GProcContext *, unsigned int, virt_t, va_list);
+typedef void (* push_drop_point_fc) (GProcContext *, DisassPriorityLevel, virt_t, va_list);
/* Définition d'un contexte pour processeur (instance) */
@@ -45,9 +45,9 @@ struct _GProcContext
{
GObject parent; /* A laisser en premier */
- virt_t *drop_points; /* Liste de points de départ */
- size_t dp_allocated; /* Taille de liste allouée */
- size_t dp_count; /* Quantité utile de la liste */
+ virt_t *drop_points[DPL_COUNT]; /* Liste de points de départ */
+ size_t dp_allocated[DPL_COUNT]; /* Taille de liste allouée */
+ size_t dp_count[DPL_COUNT]; /* Quantité utile de la liste */
GMutex dp_access; /* Accès à la liste FIFO */
vmpa2t *extra_symbols; /* Adresses de symboles */
diff --git a/src/arch/context.c b/src/arch/context.c
index 98eebb2..979a403 100644
--- a/src/arch/context.c
+++ b/src/arch/context.c
@@ -40,7 +40,7 @@ static void g_proc_context_class_init(GProcContextClass *);
static void g_proc_context_init(GProcContext *);
/* Ajoute une adresse virtuelle comme point de départ de code. */
-static void _g_proc_context_push_drop_point(GProcContext *, unsigned int, virt_t, va_list);
+static void _g_proc_context_push_drop_point(GProcContext *, DisassPriorityLevel, virt_t, va_list);
@@ -90,9 +90,15 @@ static void g_proc_context_class_init(GProcContextClass *klass)
static void g_proc_context_init(GProcContext *ctx)
{
- ctx->drop_points = NULL;
- ctx->dp_allocated = 0;
- ctx->dp_count = 0;
+ DisassPriorityLevel i; /* Boucle de parcours */
+
+ for (i = 0; i < DPL_COUNT; i++)
+ {
+ ctx->drop_points[i] = NULL;
+ ctx->dp_allocated[i] = 0;
+ ctx->dp_count[i] = 0;
+ }
+
g_mutex_init(&ctx->dp_access);
ctx->extra_symbols = NULL;
@@ -137,17 +143,22 @@ void g_proc_context_attach_counter(GProcContext *ctx, gint *counter)
* *
******************************************************************************/
-static void _g_proc_context_push_drop_point(GProcContext *ctx, unsigned int level, virt_t addr, va_list ap)
+static void _g_proc_context_push_drop_point(GProcContext *ctx, DisassPriorityLevel level, virt_t addr, va_list ap)
{
- if (ctx->dp_count >= ctx->dp_allocated)
+ assert(level < DPL_COUNT);
+
+ if (ctx->dp_count[level] >= ctx->dp_allocated[level])
{
- ctx->dp_allocated += DP_ALLOC_BLOCK;
+ ctx->dp_allocated[level] += DP_ALLOC_BLOCK;
- ctx->drop_points = (virt_t *)realloc(ctx->drop_points, ctx->dp_allocated * sizeof(virt_t));
+ ctx->drop_points[level] = (virt_t *)realloc(ctx->drop_points[level],
+ ctx->dp_allocated[level] * sizeof(virt_t));
}
- ctx->drop_points[ctx->dp_count++] = addr;
+ ctx->drop_points[level][ctx->dp_count[level]] = addr;
+
+ ctx->dp_count[level]++;
}
@@ -167,7 +178,7 @@ static void _g_proc_context_push_drop_point(GProcContext *ctx, unsigned int leve
* *
******************************************************************************/
-void g_proc_context_push_drop_point(GProcContext *ctx, unsigned int level, virt_t addr, ...)
+void g_proc_context_push_drop_point(GProcContext *ctx, DisassPriorityLevel level, virt_t addr, ...)
{
va_list ap; /* Arguments complémentaires ? */
@@ -191,8 +202,9 @@ void g_proc_context_push_drop_point(GProcContext *ctx, unsigned int level, virt_
/******************************************************************************
* *
-* Paramètres : ctx = contexte de désassemblage à compléter. *
-* virt = adresse d'un point de départ de code à traiter. *
+* Paramètres : ctx = contexte de désassemblage à compléter. *
+* level = degré d'importance de l'adresse retournée. [OUT] *
+* virt = adresse d'un point de départ de code à traiter. [OUT]*
* *
* Description : Fournit une adresse virtuelle comme point de départ de code. *
* *
@@ -202,26 +214,30 @@ void g_proc_context_push_drop_point(GProcContext *ctx, unsigned int level, virt_
* *
******************************************************************************/
-bool g_proc_context_pop_drop_point(GProcContext *ctx, virt_t *virt)
+bool g_proc_context_pop_drop_point(GProcContext *ctx, DisassPriorityLevel *level, virt_t *virt)
{
bool result; /* Bilan d'accès à retourner */
+ DisassPriorityLevel i; /* Boucle de parcours */
+
+ result = false;
g_mutex_lock(&ctx->dp_access);
- if (ctx->dp_count > 0)
- {
- result = true;
+ for (i = 0; i < DPL_COUNT && !result; i++)
+ if (ctx->dp_count[i] > 0)
+ {
+ result = true;
- *virt = ctx->drop_points[0];
+ *level = i;
+ *virt = ctx->drop_points[i][0];
- if (ctx->dp_count > 1)
- memmove(&ctx->drop_points[0], &ctx->drop_points[1], (ctx->dp_count - 1) * sizeof(virt_t));
+ if (ctx->dp_count[i] > 1)
+ memmove(&ctx->drop_points[i][0], &ctx->drop_points[i][1],
+ (ctx->dp_count[i] - 1) * sizeof(virt_t));
- ctx->dp_count--;
+ ctx->dp_count[i]--;
- }
- else
- result = false;
+ }
g_mutex_unlock(&ctx->dp_access);
diff --git a/src/arch/context.h b/src/arch/context.h
index 334eaf1..d8b5793 100644
--- a/src/arch/context.h
+++ b/src/arch/context.h
@@ -48,6 +48,18 @@ typedef struct _GProcContext GProcContext;
typedef struct _GProcContextClass GProcContextClass;
+/* Degré de priorité des points à désassembler */
+typedef enum _DisassPriorityLevel
+{
+ DPL_ENTRY_POINT, /* Validité indiscutable */
+ DPL_SYMBOL, /* Symboles utilisés */
+ DPL_OTHER, /* Injections complémentaires */
+
+ DPL_COUNT
+
+} DisassPriorityLevel;
+
+
/* Indique le type définit par la GLib pour le contexte de processeur. */
GType g_proc_context_get_type(void);
@@ -55,10 +67,10 @@ GType g_proc_context_get_type(void);
void g_proc_context_attach_counter(GProcContext *, gint *);
/* Ajoute une adresse virtuelle comme point de départ de code. */
-void g_proc_context_push_drop_point(GProcContext *, unsigned int, virt_t, ...);
+void g_proc_context_push_drop_point(GProcContext *, DisassPriorityLevel, virt_t, ...);
/* Fournit une adresse virtuelle comme point de départ de code. */
-bool g_proc_context_pop_drop_point(GProcContext *, virt_t *);
+bool g_proc_context_pop_drop_point(GProcContext *, DisassPriorityLevel *, virt_t *);
/* Empile une adresse de nouveau symbole à prendre en compte. */
void g_proc_context_push_new_symbol_at(GProcContext *, const vmpa2t *);
diff --git a/src/arch/dalvik/fetch.c b/src/arch/dalvik/fetch.c
index a557601..d9bbf9b 100644
--- a/src/arch/dalvik/fetch.c
+++ b/src/arch/dalvik/fetch.c
@@ -57,6 +57,6 @@ void help_fetching_with_dalvik_instruction(GArchInstruction *instr, GArchProcess
assert(status);
if (status)
- g_proc_context_push_drop_point(G_PROC_CONTEXT(context), 3, target);
+ g_proc_context_push_drop_point(G_PROC_CONTEXT(context), DPL_OTHER, target);
}