diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2015-12-16 23:46:51 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2015-12-16 23:46:51 (GMT) |
commit | 8ff010a34762737016624a68f593d0e6736d4349 (patch) | |
tree | efcf9b65483ba94dd93d6c6a7227706424160c10 /src/arch/arm/v7/context.c | |
parent | e4b56188b664e6b986733d456e6a0ea9b2da6d53 (diff) |
Tracked the ARM/Thumb areas in a clever way with levels.
Diffstat (limited to 'src/arch/arm/v7/context.c')
-rw-r--r-- | src/arch/arm/v7/context.c | 76 |
1 files changed, 35 insertions, 41 deletions
diff --git a/src/arch/arm/v7/context.c b/src/arch/arm/v7/context.c index 030457e..446a972 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 *, virt_t ); +static void g_armv7_context_push_drop_point(GArmV7Context *, unsigned int, virt_t, va_list); @@ -196,8 +196,10 @@ GArmV7Context *g_armv7_context_new(void) /****************************************************************************** * * -* Paramètres : ctx = contexte de désassemblage à compléter. * -* addr = adresse d'un nouveau point de départ à traiter. * +* Paramètres : ctx = contexte de désassemblage à compléter. * +* level = indication de priorité et d'origine de l'adresse. * +* addr = adresse d'un nouveau point de départ à traiter. * +* ap = forme générique d'un encodage à mémoriser. * * * * Description : Ajoute une adresse virtuelle comme point de départ de code. * * * @@ -207,53 +209,45 @@ GArmV7Context *g_armv7_context_new(void) * * ******************************************************************************/ -static void g_armv7_context_push_drop_point(GArmV7Context *ctx, virt_t addr) +static void g_armv7_context_push_drop_point(GArmV7Context *ctx, unsigned int level, virt_t addr, va_list ap) { - if (addr & 0x1) - { - addr -= 0x1; - g_armv7_context_define_encoding(ctx, addr, AV7IS_THUMB); - } - else - g_armv7_context_define_encoding(ctx, addr, AV7IS_ARM); + ArmV7InstrSet marker; /* Type de jeu d'instructions */ - G_PROC_CONTEXT_CLASS(g_armv7_context_parent_class)->push_point(G_PROC_CONTEXT(ctx), addr); + switch (level) + { + case 0: -} + if (addr & 0x1) + { + addr -= 0x1; + marker = AV7IS_THUMB; + } + else + marker = AV7IS_ARM; -/****************************************************************************** -* * -* Paramètres : ctx = contexte de désassemblage à compléter. * -* addr = adresse d'un nouveau point de départ à traiter. * -* marker = forme générique d'un encodage à mémoriser. * -* * -* Description : Ajoute une adresse virtuelle comme point de départ de code. * -* * -* Retour : - * -* * -* Remarques : - * -* * -******************************************************************************/ + break; + + default: + + marker = va_arg(ap, ArmV7InstrSet); + + /** + * Attention : toute adresse impaire est destinée à du mode Thumb. + * + * Mais la réciproque n'est pas vraie : le mode Thumb peut aussi + * manipuler des adresses paires. + */ + assert(((addr & 0x1) && marker == AV7IS_THUMB) || (addr & 0x1) == 0); + + addr &= ~0x1; + + break; -void g_armv7_context_push_drop_point_ext(GArmV7Context *ctx, virt_t addr, ArmV7InstrSet marker) -{ - if (addr & 0x1) - { - addr -= 0x1; - assert(marker == AV7IS_THUMB); } g_armv7_context_define_encoding(ctx, addr, marker); - /** - * 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); + G_PROC_CONTEXT_CLASS(g_armv7_context_parent_class)->push_point(G_PROC_CONTEXT(ctx), level, addr, ap); } |