diff options
Diffstat (limited to 'src/arch/vmpa.c')
-rw-r--r-- | src/arch/vmpa.c | 181 |
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; + +} |