summaryrefslogtreecommitdiff
path: root/plugins/arm/register.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/arm/register.c')
-rw-r--r--plugins/arm/register.c108
1 files changed, 104 insertions, 4 deletions
diff --git a/plugins/arm/register.c b/plugins/arm/register.c
index 0ae7072..3e1251b 100644
--- a/plugins/arm/register.c
+++ b/plugins/arm/register.c
@@ -31,6 +31,9 @@
+/* ------------------------- GESTION UNITAIRE DES REGISTRES ------------------------- */
+
+
/* Initialise la classe des registres ARM. */
static void g_arm_register_class_init(GArmRegisterClass *);
@@ -51,6 +54,22 @@ static int g_arm_register_compare(const GArmRegister *, const GArmRegister *);
+/* --------------------- TRANSPOSITIONS VIA CACHE DES REGISTRES --------------------- */
+
+
+/* Charge un registre depuis une mémoire tampon. */
+static GArchRegister *g_arm_register_unserialize(GArmRegister *, GAsmStorage *, packed_buffer *);
+
+/* Sauvegarde un registre dans une mémoire tampon. */
+static bool g_arm_register_serialize(const GArmRegister *, GAsmStorage *, packed_buffer *);
+
+
+
+/* ---------------------------------------------------------------------------------- */
+/* GESTION UNITAIRE DES REGISTRES */
+/* ---------------------------------------------------------------------------------- */
+
+
/* Indique le type défini pour une représentation d'un registre ARM. */
G_DEFINE_TYPE(GArmRegister, g_arm_register, G_TYPE_ARCH_REGISTER);
@@ -70,16 +89,19 @@ G_DEFINE_TYPE(GArmRegister, g_arm_register, G_TYPE_ARCH_REGISTER);
static void g_arm_register_class_init(GArmRegisterClass *klass)
{
GObjectClass *object_class; /* Autre version de la classe */
- GArchRegisterClass *register_class; /* Classe de haut niveau */
+ GArchRegisterClass *reg_class; /* Classe de haut niveau */
object_class = G_OBJECT_CLASS(klass);
- register_class = G_ARCH_REGISTER_CLASS(klass);
object_class->dispose = (GObjectFinalizeFunc/* ! */)g_arm_register_dispose;
object_class->finalize = (GObjectFinalizeFunc)g_arm_register_finalize;
- register_class->hash = (reg_hash_fc)g_arm_register_hash;
- register_class->compare = (reg_compare_fc)g_arm_register_compare;
+ reg_class = G_ARCH_REGISTER_CLASS(klass);
+
+ reg_class->hash = (reg_hash_fc)g_arm_register_hash;
+ reg_class->compare = (reg_compare_fc)g_arm_register_compare;
+ reg_class->unserialize = (reg_unserialize_fc)g_arm_register_unserialize;
+ reg_class->serialize = (reg_serialize_fc)g_arm_register_serialize;
}
@@ -200,3 +222,81 @@ static int g_arm_register_compare(const GArmRegister *a, const GArmRegister *b)
return result;
}
+
+
+
+/* ---------------------------------------------------------------------------------- */
+/* TRANSPOSITIONS VIA CACHE DES OPERANDES */
+/* ---------------------------------------------------------------------------------- */
+
+
+/******************************************************************************
+* *
+* Paramètres : reg = registre d'architecture à constituer. *
+* storage = mécanisme de sauvegarde à manipuler. *
+* pbuf = zone tampon à remplir. *
+* *
+* Description : Charge un registre depuis une mémoire tampon. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static GArchRegister *g_arm_register_unserialize(GArmRegister *reg, GAsmStorage *storage, packed_buffer *pbuf)
+{
+ GArchRegister *result; /* Instance à retourner */
+ GArchRegisterClass *parent; /* Classe parente à consulter */
+
+ /**
+ * L'indice de registre est utilisé par les sous-classes pour la regénération
+ * à partir du cache.
+ *
+ * Il est donc lu depuis le tempon avant l'appel à cette fonction, et est
+ * ainsi déjà pris en compte.
+ */
+
+ result = G_ARCH_REGISTER(reg);
+
+ parent = G_ARCH_REGISTER_CLASS(g_arm_register_parent_class);
+
+ result = parent->unserialize(result, storage, pbuf);
+
+ return result;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : reg = registre d'architecture à consulter. *
+* storage = mécanisme de sauvegarde à manipuler. *
+* pbuf = zone tampon à remplir. *
+* *
+* Description : Sauvegarde un registre dans une mémoire tampon. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+static bool g_arm_register_serialize(const GArmRegister *reg, GAsmStorage *storage, packed_buffer *pbuf)
+{
+ bool result; /* Bilan à retourner */
+ GArchRegisterClass *parent; /* Classe parente à consulter */
+
+ result = extend_packed_buffer(pbuf, &reg->index, sizeof(uint8_t), false);
+
+ if (result)
+ {
+ parent = G_ARCH_REGISTER_CLASS(g_arm_register_parent_class);
+
+ result = parent->serialize(G_ARCH_REGISTER(reg), storage, pbuf);
+
+ }
+
+ return result;
+
+}