summaryrefslogtreecommitdiff
path: root/src/arch/vmpa.h
blob: 461780cdbac2e045e30a92edf0e8b231fe3d8e58 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132

/* 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 <http://www.gnu.org/licenses/>.
 */


#ifndef _ARCH_VMPA_H
#define _ARCH_VMPA_H


#include <alloca.h>
#include <limits.h>
#include <stdbool.h>
#include <stdint.h>
#include <sys/types.h>


#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 */