diff options
Diffstat (limited to 'src/arch')
-rw-r--r-- | src/arch/archbase.h | 25 | ||||
-rw-r--r-- | src/arch/arm/context-int.h | 1 | ||||
-rw-r--r-- | src/arch/arm/context.c | 18 | ||||
-rw-r--r-- | src/arch/arm/v7/context.c | 10 | ||||
-rw-r--r-- | src/arch/context-int.h | 12 | ||||
-rw-r--r-- | src/arch/context.c | 69 | ||||
-rw-r--r-- | src/arch/context.h | 2 |
7 files changed, 118 insertions, 19 deletions
diff --git a/src/arch/archbase.h b/src/arch/archbase.h index 24cfd77..fc6fe4d 100644 --- a/src/arch/archbase.h +++ b/src/arch/archbase.h @@ -74,6 +74,31 @@ typedef enum _MemoryDataSize #define MDS_IS_SIGNED(mds) (mds & 0x80) +#define MDS_FROM_BYTES(sz) \ + ({ \ + MemoryDataSize __result; \ + switch (sz) \ + { \ + case 1: \ + __result = MDS_8_BITS_UNSIGNED; \ + break; \ + case 2: \ + __result = MDS_16_BITS_UNSIGNED; \ + break; \ + case 4: \ + __result = MDS_32_BITS_UNSIGNED; \ + break; \ + case 8: \ + __result = MDS_64_BITS_UNSIGNED; \ + break; \ + default: \ + __result = MDS_UNDEFINED; \ + break; \ + } \ + __result; \ + }) + + #define MDS_4_BITS MDS_4_BITS_UNSIGNED #define MDS_8_BITS MDS_8_BITS_UNSIGNED #define MDS_16_BITS MDS_16_BITS_UNSIGNED diff --git a/src/arch/arm/context-int.h b/src/arch/arm/context-int.h index 51ed6d0..fbd3a6f 100644 --- a/src/arch/arm/context-int.h +++ b/src/arch/arm/context-int.h @@ -50,6 +50,7 @@ struct _GArmContext disass_arm_area *areas; /* Désassemblage découpé */ size_t acount; /* Nombre de zones définies */ + GMutex areas_access; /* Accès aux découpes de zones */ }; diff --git a/src/arch/arm/context.c b/src/arch/arm/context.c index b54de42..d805e8c 100644 --- a/src/arch/arm/context.c +++ b/src/arch/arm/context.c @@ -139,6 +139,7 @@ static void g_arm_context_class_init(GArmContextClass *klass) static void g_arm_context_init(GArmContext *ctx) { + g_mutex_init(&ctx->areas_access); } @@ -157,6 +158,8 @@ static void g_arm_context_init(GArmContext *ctx) static void g_arm_context_dispose(GArmContext *ctx) { + g_mutex_clear(&ctx->areas_access); + G_OBJECT_CLASS(g_arm_context_parent_class)->dispose(G_OBJECT(ctx)); } @@ -263,11 +266,11 @@ void _g_arm_context_define_encoding(GArmContext *ctx, virt_t addr, unsigned int { size_t selected; /* Zone associée à une adresse */ - /* TODO : pose de verroux ? */ + g_mutex_lock(&ctx->areas_access); selected = find_disass_arm_area(ctx->areas, addr, 0, ctx->acount - 1); - assert(ctx->areas[selected].start != addr || ctx->areas[selected].marker == marker); + //assert(ctx->areas[selected].start != addr || ctx->areas[selected].marker == marker); /* S'agit-il d'une redéfinition ? */ if (ctx->areas[selected].start == addr) @@ -290,6 +293,8 @@ void _g_arm_context_define_encoding(GArmContext *ctx, virt_t addr, unsigned int } + g_mutex_unlock(&ctx->areas_access); + } @@ -308,13 +313,18 @@ void _g_arm_context_define_encoding(GArmContext *ctx, virt_t addr, unsigned int unsigned int _g_arm_context_find_encoding(GArmContext *ctx, virt_t addr) { + unsigned int result; /* Identifiant à retourner */ size_t selected; /* Zone associée à une adresse */ - /* TODO : pose de verroux ? */ + g_mutex_lock(&ctx->areas_access); selected = find_disass_arm_area(ctx->areas, addr, 0, ctx->acount - 1); - return ctx->areas[selected].marker; + result = ctx->areas[selected].marker; + + g_mutex_unlock(&ctx->areas_access); + + return result; } diff --git a/src/arch/arm/v7/context.c b/src/arch/arm/v7/context.c index 885ce70..030457e 100644 --- a/src/arch/arm/v7/context.c +++ b/src/arch/arm/v7/context.c @@ -245,7 +245,15 @@ void g_armv7_context_push_drop_point_ext(GArmV7Context *ctx, virt_t addr, ArmV7I g_armv7_context_define_encoding(ctx, addr, marker); - G_PROC_CONTEXT_CLASS(g_armv7_context_parent_class)->push_point(G_PROC_CONTEXT(ctx), addr); + /** + * Il faut impérativement passer pour l'interface publique afin : + * - de poser le verrou associé. + * - de déclencher l'émission du signal lié. + * + * Pas d'appel via G_PROC_CONTEXT_CLASS(g_armv7_context_parent_class)->push_point() donc. + */ + + g_proc_context_push_drop_point(G_PROC_CONTEXT(ctx), addr); } diff --git a/src/arch/context-int.h b/src/arch/context-int.h index 64465a2..086a8ec 100644 --- a/src/arch/context-int.h +++ b/src/arch/context-int.h @@ -29,6 +29,10 @@ +/* Granularité des allocations */ +#define DP_ALLOC_BLOCK 10 + + /* Ajoute une adresse virtuelle comme point de départ de code. */ typedef void (* push_drop_point_fc) (GProcContext *, virt_t); @@ -39,7 +43,9 @@ struct _GProcContext GObject parent; /* A laisser en premier */ virt_t *drop_points; /* Liste de points de départ */ - size_t dp_count; /* Taille de cette liste */ + size_t dp_allocated; /* Taille de liste allouée */ + size_t dp_count; /* Quantité utile de la liste */ + GMutex dp_access; /* Accès à la liste FIFO */ vmpa2t *extra_symbols; /* Adresses de symboles */ size_t esyms_count; /* Nombres de nouveautés */ @@ -54,6 +60,10 @@ struct _GProcContextClass push_drop_point_fc push_point; /* Inclusion de points de chute*/ + /* Signaux */ + + void (* drop_point_pushed) (GProcContext *); + }; diff --git a/src/arch/context.c b/src/arch/context.c index 5427e4a..968a6ea 100644 --- a/src/arch/context.c +++ b/src/arch/context.c @@ -65,6 +65,14 @@ static void g_proc_context_class_init(GProcContextClass *klass) { klass->push_point = (push_drop_point_fc)_g_proc_context_push_drop_point; + g_signal_new("drop-point-pushed", + G_TYPE_PROC_CONTEXT, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(GProcContextClass, drop_point_pushed), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + } @@ -83,7 +91,9 @@ 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; + g_mutex_init(&ctx->dp_access); ctx->extra_symbols = NULL; ctx->esyms_count = 0; @@ -106,9 +116,15 @@ static void g_proc_context_init(GProcContext *ctx) static 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)); + if (ctx->dp_count >= ctx->dp_allocated) + { + ctx->dp_allocated += DP_ALLOC_BLOCK; + + ctx->drop_points = (virt_t *)realloc(ctx->drop_points, ctx->dp_allocated * sizeof(virt_t)); + + } - ctx->drop_points[ctx->dp_count - 1] = addr; + ctx->drop_points[ctx->dp_count++] = addr; } @@ -128,7 +144,13 @@ static void _g_proc_context_push_drop_point(GProcContext *ctx, virt_t addr) void g_proc_context_push_drop_point(GProcContext *ctx, virt_t addr) { - return G_PROC_CONTEXT_GET_CLASS(ctx)->push_point(ctx, addr); + g_mutex_lock(&ctx->dp_access); + + G_PROC_CONTEXT_GET_CLASS(ctx)->push_point(ctx, addr); + + g_mutex_unlock(&ctx->dp_access); + + g_signal_emit_by_name(ctx, "drop-point-pushed"); } @@ -147,7 +169,15 @@ void g_proc_context_push_drop_point(GProcContext *ctx, virt_t addr) bool g_proc_context_has_drop_points(const GProcContext *ctx) { - return ctx->dp_count > 0; + bool result; /* Etat à retourner */ + + g_mutex_lock(&ctx->dp_access); + + result = (ctx->dp_count > 0); + + g_mutex_unlock(&ctx->dp_access); + + return result; } @@ -172,9 +202,13 @@ bool g_proc_context_has_addr_as_drop_points(const GProcContext *ctx, virt_t addr result = false; + g_mutex_lock(&ctx->dp_access); + for (i = 0; i < ctx->dp_count && !result; i++) result = (ctx->drop_points[i] == addr); + g_mutex_unlock(&ctx->dp_access); + return result; } @@ -183,27 +217,38 @@ bool g_proc_context_has_addr_as_drop_points(const GProcContext *ctx, virt_t addr /****************************************************************************** * * * Paramètres : ctx = contexte de désassemblage à compléter. * +* virt = adresse d'un point de départ de code à traiter. * * * * Description : Fournit une adresse virtuelle comme point de départ de code. * * * -* Retour : Adresse d'un point de départ de code à traiter. * +* Retour : true si une adresse a pu être dépilée, false sinon. * * * * Remarques : - * * * ******************************************************************************/ -virt_t g_proc_context_pop_drop_point(GProcContext *ctx) +bool g_proc_context_pop_drop_point(GProcContext *ctx, virt_t *virt) { - virt_t result; /* Adresse à retourner */ + bool result; /* Bilan d'accès à retourner */ - assert(ctx->dp_count > 0); + g_mutex_lock(&ctx->dp_access); - result = ctx->drop_points[0]; + if (ctx->dp_count > 0) + { + result = true; + + *virt = 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)); - if (ctx->dp_count > 1) - memmove(&ctx->drop_points[0], &ctx->drop_points[1], (ctx->dp_count - 1) * sizeof(virt_t)); + ctx->dp_count--; + + } + else + result = false; - ctx->drop_points = (virt_t *)realloc(ctx->drop_points, --ctx->dp_count * sizeof(virt_t)); + g_mutex_unlock(&ctx->dp_access); return result; diff --git a/src/arch/context.h b/src/arch/context.h index 390d9f9..973b7ae 100644 --- a/src/arch/context.h +++ b/src/arch/context.h @@ -61,7 +61,7 @@ bool g_proc_context_has_drop_points(const GProcContext *); bool g_proc_context_has_addr_as_drop_points(const GProcContext *, virt_t); /* Fournit une adresse virtuelle comme point de départ de code. */ -virt_t g_proc_context_pop_drop_point(GProcContext *); +bool g_proc_context_pop_drop_point(GProcContext *, virt_t *); /* Empile une adresse de nouveau symbole à prendre en compte. */ void g_proc_context_push_new_symbol_at(GProcContext *, const vmpa2t *); |