diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2018-05-28 17:37:46 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2018-05-28 17:37:46 (GMT) |
commit | 9f5ed46de568d3db882c939c8ca9d0117bff3369 (patch) | |
tree | 9d2090cd640e54379dc1b982e03dc284b2d23ae7 /plugins/arm/register.c | |
parent | 2fd186a84cba4f39f6f1bb8bd34d52b4e1d4f814 (diff) |
Relied on register objects as often as possible.
Diffstat (limited to 'plugins/arm/register.c')
-rw-r--r-- | plugins/arm/register.c | 108 |
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, ®->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; + +} |