/* Chrysalide - Outil d'analyse de fichiers binaires * vmpa.h - prototypes des adressages virtuels ou physiques * * Copyright (C) 2014 Cyrille Bagard * * This file is part of Chrysalide. * * OpenIDA is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * OpenIDA is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Foobar. If not, see . */ #ifndef _ARCH_VMPA_H #define _ARCH_VMPA_H #include #include #include #include #include #include "archbase.h" #include "../common/cpp.h" #define VMPA_MAX_SIZE (sizeof(STR(ULLONG_MAX)) + 1) /* Adresse mémoire ou position physique */ struct _vmpa2_t { off_t physical; /* Position physique */ uint64_t virtual; /* Adresse virtuelle */ MemoryDataSize last_phys_size; /* Dernière taille demandée #1 */ MemoryDataSize last_virt_size; /* Dernière taille demandée #2 */ size_t last_phys_len; /* Dernière taille fournie #1 */ size_t last_virt_len; /* Dernière taille fournie #2 */ char phys_cache[VMPA_MAX_SIZE]; /* Impression physique cachée */ char virt_cache[VMPA_MAX_SIZE]; /* Impression virtuelle cachée */ }; /* Adresse mémoire ou position physique */ typedef struct _vmpa2_t vmpa2_t; typedef struct _vmpa2_t vmpa2t; /* Crée la copie d'un adressage mémoire en local. */ //inline vmpa2t *local_dup_vmpa(const vmpa2t *) __attribute__((always_inline)); #define local_dup_vmpa(src) \ ({ \ vmpa2t *__result; \ __result = alloca(sizeof(vmpa2t)); \ copy_vmpa(__result, src); \ __result; \ }) /* Copie la définition d'un adressage dans un autre. */ void copy_vmpa(vmpa2t *, const vmpa2t *); /* Initialise une localisation dans l'espace mémoire/physique. */ void init_vmpa(vmpa2t *, off_t, uint64_t); /* Crée une localisation dans l'adressage mémoire. */ vmpa2t *make_vmpa(off_t, uint64_t); #define cmp_vmpa(a, b) 0 #define get_phy_addr(a) a->physical #define get_virt_addr(a) a->virtual /* Lit la définition d'une adresse depuis un flux réseau. */ bool recv_vmpa(vmpa2t *, int, int); /* Ecrit la définition d'une adresse dans un flux réseau. */ bool send_vmpa(const vmpa2t *, int, int); /* Transforme une adresse physique en chaîne de caractères. */ const char *vmpa2_phys_to_string(vmpa2t *, MemoryDataSize, size_t *); /* Transforme une adresse virtuelle en chaîne de caractères. */ const char *vmpa2_virt_to_string(vmpa2t *, MemoryDataSize, size_t *); #endif /* _ARCH_VMPA_H */