diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2014-08-05 20:19:08 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2014-08-05 20:19:08 (GMT) |
commit | 56ee4d3ecddeee05f11083fcc1595e3756b91790 (patch) | |
tree | 5ec6e5449214093280629047c36016a0de09cbeb /src/arch/vmpa.c | |
parent | a2eb5483fe74923e488013b2d8b94ded6340499e (diff) |
Defined the first steps for a new disassembling approach.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@387 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/arch/vmpa.c')
-rw-r--r-- | src/arch/vmpa.c | 115 |
1 files changed, 100 insertions, 15 deletions
diff --git a/src/arch/vmpa.c b/src/arch/vmpa.c index c6972af..4ee0b99 100644 --- a/src/arch/vmpa.c +++ b/src/arch/vmpa.c @@ -26,6 +26,7 @@ #include <inttypes.h> #include <malloc.h> +#include <string.h> #include "../common/io.h" @@ -35,6 +36,76 @@ + +#if 0 +/****************************************************************************** +* * +* Paramètres : src = définition à copier. * +* * +* Description : Crée la copie d'un adressage mémoire en local. * +* * +* Retour : Adressage alloué sur la pile. * +* * +* Remarques : - * +* * +******************************************************************************/ + +inline vmpa2t *local_dup_vmpa(const vmpa2t *src) +{ + vmpa2t *result; /* Adressage à retourner */ + + result = alloca(sizeof(vmpa2t)); + + copy_vmpa(result, src); + + return result; + +} +#endif + + +/****************************************************************************** +* * +* Paramètres : dest = structure de destination pour la copie. * +* src = structure de source pour la copie. * +* * +* Description : Copie la définition d'un adressage dans un autre. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void copy_vmpa(vmpa2t *dest, const vmpa2t *src) +{ + dest->physical = src->physical; + dest->virtual= src->virtual; + + dest->last_phys_size = src->last_phys_size; + dest->last_virt_size = src->last_virt_size; + + strncpy(dest->phys_cache, src->phys_cache, VMPA_MAX_SIZE); + dest->phys_cache[VMPA_MAX_SIZE - 1] = '\0'; + + strncpy(dest->virt_cache, src->virt_cache, VMPA_MAX_SIZE); + dest->virt_cache[VMPA_MAX_SIZE - 1] = '\0'; + +} + + + + + + + + + + + + + + /****************************************************************************** * * * Paramètres : phy = position dans la mémoire physique. * @@ -164,6 +235,7 @@ bool send_vmpa(const vmpa2t *addr, int fd, int flags) * * * Paramètres : addr = adresse virtuelle ou physique à traiter. * * msize = taille de cette adresse, réelle ou désirée. * +* length = transmission de la taille du résultat ou NULL. [OUT]* * * * Description : Transforme une adresse physique en chaîne de caractères. * * * @@ -173,39 +245,45 @@ bool send_vmpa(const vmpa2t *addr, int fd, int flags) * * ******************************************************************************/ -const char *vmpa2_phy_to_string(vmpa2t *addr, MemoryDataSize msize) +const char *vmpa2_phys_to_string(vmpa2t *addr, MemoryDataSize msize, size_t *length) { - if (addr->phy_cache[0] == '\0' || addr->last_phy_size != msize) + size_t ret; /* Retour de l'impression */ + + if (addr->phys_cache[0] == '\0' || addr->last_phys_size != msize) { switch (msize) { case MDS_8_BITS: - snprintf(addr->phy_cache, VMPA_MAX_SIZE,"0x%02" PRIx64, addr->physical); + ret = snprintf(addr->phys_cache, VMPA_MAX_SIZE,"0x%02" PRIx64, addr->physical); break; case MDS_16_BITS: - snprintf(addr->phy_cache, VMPA_MAX_SIZE, "0x%04" PRIx64, addr->physical); + ret = snprintf(addr->phys_cache, VMPA_MAX_SIZE, "0x%04" PRIx64, addr->physical); break; case MDS_32_BITS: - snprintf(addr->phy_cache, VMPA_MAX_SIZE, "0x%08" PRIx64, addr->physical); + ret = snprintf(addr->phys_cache, VMPA_MAX_SIZE, "0x%08" PRIx64, addr->physical); break; case MDS_64_BITS: - snprintf(addr->phy_cache, VMPA_MAX_SIZE, "0x%016" PRIx64, addr->physical); + ret = snprintf(addr->phys_cache, VMPA_MAX_SIZE, "0x%016" PRIx64, addr->physical); break; default: - snprintf(addr->phy_cache, VMPA_MAX_SIZE, "???"); + ret = snprintf(addr->phys_cache, VMPA_MAX_SIZE, "???"); break; } - addr->last_phy_size = msize; + addr->last_phys_size = msize; + addr->last_phys_len = ret; } - return addr->phy_cache; + if (length != NULL) + *length = addr->last_phys_size; + + return addr->phys_cache; } @@ -214,6 +292,7 @@ const char *vmpa2_phy_to_string(vmpa2t *addr, MemoryDataSize msize) * * * Paramètres : addr = adresse virtuelle ou physique à traiter. * * msize = taille de cette adresse, réelle ou désirée. * +* length = transmission de la taille du résultat ou NULL. [OUT]* * * * Description : Transforme une adresse virtuelle en chaîne de caractères. * * * @@ -223,38 +302,44 @@ const char *vmpa2_phy_to_string(vmpa2t *addr, MemoryDataSize msize) * * ******************************************************************************/ -const char *vmpa2_virt_to_string(vmpa2t *addr, MemoryDataSize msize) +const char *vmpa2_virt_to_string(vmpa2t *addr, MemoryDataSize msize, size_t *length) { + size_t ret; /* Retour de l'impression */ + if (addr->virt_cache[0] == '\0' || addr->last_virt_size != msize) { switch (msize) { case MDS_8_BITS: - snprintf(addr->virt_cache, VMPA_MAX_SIZE,"0x%02" PRIx64, addr->virtual); + ret = snprintf(addr->virt_cache, VMPA_MAX_SIZE,"0x%02" PRIx64, addr->virtual); break; case MDS_16_BITS: - snprintf(addr->virt_cache, VMPA_MAX_SIZE, "0x%04" PRIx64, addr->virtual); + ret = snprintf(addr->virt_cache, VMPA_MAX_SIZE, "0x%04" PRIx64, addr->virtual); break; case MDS_32_BITS: - snprintf(addr->virt_cache, VMPA_MAX_SIZE, "0x%08" PRIx64, addr->virtual); + ret = snprintf(addr->virt_cache, VMPA_MAX_SIZE, "0x%08" PRIx64, addr->virtual); break; case MDS_64_BITS: - snprintf(addr->virt_cache, VMPA_MAX_SIZE, "0x%016" PRIx64, addr->virtual); + ret = snprintf(addr->virt_cache, VMPA_MAX_SIZE, "0x%016" PRIx64, addr->virtual); break; default: - snprintf(addr->virt_cache, VMPA_MAX_SIZE, "???"); + ret = snprintf(addr->virt_cache, VMPA_MAX_SIZE, "???"); break; } addr->last_virt_size = msize; + addr->last_virt_len = ret; } + if (length != NULL) + *length = addr->last_virt_size; + return addr->virt_cache; } |