forked from andoma/vmir
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathvmir_mem.c
157 lines (117 loc) · 2.85 KB
/
vmir_mem.c
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#ifdef VM_TRACE
#define CHECK_MEM_ACCESS() do { \
if(p < iu->iu_mem_low || p >= iu->iu_mem_high) \
vmir_access_violation(iu, p, __FUNCTION__); \
if(p == iu->iu_data_breakpoint) \
vmir_access_trap(iu, p, __FUNCTION__); \
} while(0)
#else
#define CHECK_MEM_ACCESS()
#endif
/*
* Memory access wrappers (and endian conversion routines)
*
* Makes sure we swap endianess when running on a bit endian system
*
*/
static __inline uint8_t mem_rd8(const void *p, ir_unit_t *iu)
{
CHECK_MEM_ACCESS();
return *(uint8_t *)p;
}
static __inline void mem_wr8(void *p, uint8_t v, ir_unit_t *iu)
{
CHECK_MEM_ACCESS();
*(uint8_t *)p = v;
}
#if defined(__BIG_ENDIAN__)
static __inline uint16_t swap16(uint16_t val)
{
return ((val >> 8) & 0xff) | ((val << 8) & 0xff00);
}
static __inline uint16_t mem_rd16(const void *p, ir_unit_t *iu)
{
CHECK_MEM_ACCESS();
return swap16(*(const uint16_t *)p);
}
static __inline uint32_t mem_rd32(const void *p, ir_unit_t *iu)
{
CHECK_MEM_ACCESS();
return __builtin_bswap32(*(const uint32_t *)p);
}
static __inline uint64_t mem_rd64(const void *p, ir_unit_t *iu)
{
CHECK_MEM_ACCESS();
return __builtin_bswap64(*(const uint64_t *)p);
}
static __inline void mem_wr16(void *p, uint16_t v, ir_unit_t *iu)
{
CHECK_MEM_ACCESS();
*(uint16_t *)p = swap16(v);
}
static __inline void mem_wr32(void *p, uint32_t v, ir_unit_t *iu)
{
CHECK_MEM_ACCESS();
*(uint32_t *)p = __builtin_bswap32(v);
}
static __inline void mem_wr64(void *p, uint64_t v, ir_unit_t *iu)
{
CHECK_MEM_ACCESS();
*(uint64_t *)p = __builtin_bswap64(v);
}
static __inline void host_wr16(void *p, uint16_t v)
{
*(uint16_t *)p = swap16(v);
}
static __inline void host_wr32(void *p, uint32_t v)
{
*(uint32_t *)p = __builtin_bswap32(v);
}
static __inline void host_wr64(void *p, uint64_t v)
{
*(uint64_t *)p = __builtin_bswap64(v);
}
#else
static __inline uint16_t mem_rd16(const void *p, ir_unit_t *iu)
{
CHECK_MEM_ACCESS();
return *(const uint16_t *)p;
}
static __inline uint32_t mem_rd32(const void *p, ir_unit_t *iu)
{
CHECK_MEM_ACCESS();
return *(const uint32_t *)p;
}
static __inline uint64_t mem_rd64(const void *p, ir_unit_t *iu)
{
CHECK_MEM_ACCESS();
return *(const uint64_t *)p;
}
static __inline void mem_wr16(void *p, uint16_t v, ir_unit_t *iu)
{
CHECK_MEM_ACCESS();
*(uint16_t *)p = v;
}
static __inline void mem_wr32(void *p, uint32_t v, ir_unit_t *iu)
{
CHECK_MEM_ACCESS();
*(uint32_t *)p = v;
}
static __inline void mem_wr64(void *p, uint64_t v, ir_unit_t *iu)
{
CHECK_MEM_ACCESS();
*(uint64_t *)p = v;
}
static __inline void host_wr16(void *p, uint16_t v)
{
*(uint16_t *)p = v;
}
static __inline void host_wr32(void *p, uint32_t v)
{
*(uint32_t *)p = v;
}
static __inline void host_wr64(void *p, uint64_t v)
{
*(uint64_t *)p = v;
}
#endif