summaryrefslogtreecommitdiff
path: root/src/arch/vmpa.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2014-08-05 20:19:08 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2014-08-05 20:19:08 (GMT)
commit56ee4d3ecddeee05f11083fcc1595e3756b91790 (patch)
tree5ec6e5449214093280629047c36016a0de09cbeb /src/arch/vmpa.c
parenta2eb5483fe74923e488013b2d8b94ded6340499e (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.c115
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;
}