summaryrefslogtreecommitdiff
path: root/src/arch/arm/v7/context.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2015-12-16 23:46:51 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2015-12-16 23:46:51 (GMT)
commit8ff010a34762737016624a68f593d0e6736d4349 (patch)
treeefcf9b65483ba94dd93d6c6a7227706424160c10 /src/arch/arm/v7/context.c
parente4b56188b664e6b986733d456e6a0ea9b2da6d53 (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.c76
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);
}