summaryrefslogtreecommitdiff
path: root/src/arch/vmpa.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2014-07-31 05:53:06 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2014-07-31 05:53:06 (GMT)
commita5d8e3fc30cda2e13d30f099e93ab1b182fdc0bd (patch)
treecf183906b2301cd3c726af820292fd0f2458bfa1 /src/arch/vmpa.c
parentdc436357ff29158dddd836d368d152d42d5b086b (diff)
Improved the way code is decoded by avoiding to propagate the base address everywhere.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@385 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/arch/vmpa.c')
-rw-r--r--src/arch/vmpa.c181
1 files changed, 177 insertions, 4 deletions
diff --git a/src/arch/vmpa.c b/src/arch/vmpa.c
index 24d5792..c6972af 100644
--- a/src/arch/vmpa.c
+++ b/src/arch/vmpa.c
@@ -28,6 +28,8 @@
#include <malloc.h>
+#include "../common/io.h"
+
@@ -46,11 +48,11 @@
* *
******************************************************************************/
-vmpa2_t *make_vmpa(off_t phy, uint64_t virt)
+vmpa2t *make_vmpa(off_t phy, uint64_t virt)
{
- vmpa2_t *result; /* Structure à retourner */
+ vmpa2t *result; /* Structure à retourner */
- result = (vmpa2_t *)calloc(1, sizeof(vmpa2_t));
+ result = (vmpa2t *)calloc(1, sizeof(vmpa2t));
result->physical = phy;
result->virtual = virt;
@@ -77,11 +79,182 @@ vmpa2_t *make_vmpa(off_t phy, uint64_t virt)
* *
******************************************************************************/
-void init_vmpa(vmpa2_t *addr, off_t phy, uint64_t virt)
+void init_vmpa(vmpa2t *addr, off_t phy, uint64_t virt)
{
addr->physical = phy;
addr->virtual = virt;
+
+
+ MDS_UNDEFINED;
+
+
+
+}
+
+
+
+
+
+
+/******************************************************************************
+* *
+* Paramètres : addr = élément à venir lire. [OUT] *
+* fd = flux ouvert en lecture pour l'importation. *
+* flags = éventuelles options d'envoi supplémentaires. *
+* *
+* Description : Lit la définition d'une adresse depuis un flux réseau. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool recv_vmpa(vmpa2t *addr, int fd, int flags)
+{
+ uint64_t val64; /* Valeur sur 64 bits */
+ bool status; /* Bilan d'une réception */
+
+ status = safe_recv(fd, &val64, sizeof(uint64_t), flags);
+ if (!status) return false;
+
+ addr->physical = be64toh(val64);
+
+ status = safe_recv(fd, &val64, sizeof(uint64_t), flags);
+ if (!status) return false;
+
+ addr->virtual = be64toh(val64);
+
+ return true;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : addr = élément à venir écrire. *
+* fd = flux ouvert en écriture pour l'exportation. *
+* flags = éventuelles options d'envoi supplémentaires. *
+* *
+* Description : Ecrit la définition d'une adresse dans un flux réseau. *
+* *
+* Retour : Bilan de l'opération. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+bool send_vmpa(const vmpa2t *addr, int fd, int flags)
+{
+ bool status; /* Bilan d'une émission */
+
+ status = safe_send(fd, (uint64_t []) { htobe64(addr->physical) }, sizeof(uint64_t), flags);
+ if (!status) return false;
+
+ status = safe_send(fd, (uint64_t []) { htobe64(addr->virtual) }, sizeof(uint64_t), flags);
+ if (!status) return false;
+
+ return true;
+
+}
+
+
+/******************************************************************************
+* *
+* Paramètres : addr = adresse virtuelle ou physique à traiter. *
+* msize = taille de cette adresse, réelle ou désirée. *
+* *
+* Description : Transforme une adresse physique en chaîne de caractères. *
+* *
+* Retour : Chaîne de caractères constituée. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+const char *vmpa2_phy_to_string(vmpa2t *addr, MemoryDataSize msize)
+{
+ if (addr->phy_cache[0] == '\0' || addr->last_phy_size != msize)
+ {
+ switch (msize)
+ {
+ case MDS_8_BITS:
+ snprintf(addr->phy_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);
+ break;
+
+ case MDS_32_BITS:
+ snprintf(addr->phy_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);
+ break;
+
+ default:
+ snprintf(addr->phy_cache, VMPA_MAX_SIZE, "???");
+ break;
+
+ }
+
+ addr->last_phy_size = msize;
+
+ }
+
+ return addr->phy_cache;
+
}
+/******************************************************************************
+* *
+* Paramètres : addr = adresse virtuelle ou physique à traiter. *
+* msize = taille de cette adresse, réelle ou désirée. *
+* *
+* Description : Transforme une adresse virtuelle en chaîne de caractères. *
+* *
+* Retour : Chaîne de caractères constituée. *
+* *
+* Remarques : - *
+* *
+******************************************************************************/
+
+const char *vmpa2_virt_to_string(vmpa2t *addr, MemoryDataSize msize)
+{
+ 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);
+ break;
+
+ case MDS_16_BITS:
+ 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);
+ break;
+
+ case MDS_64_BITS:
+ snprintf(addr->virt_cache, VMPA_MAX_SIZE, "0x%016" PRIx64, addr->virtual);
+ break;
+
+ default:
+ snprintf(addr->virt_cache, VMPA_MAX_SIZE, "???");
+ break;
+
+ }
+
+ addr->last_virt_size = msize;
+
+ }
+
+ return addr->virt_cache;
+
+}