1 /////////////////////////////////////////////////////////////////////////
2 // $Id: access.h 13486 2018-04-04 19:31:56Z sshwarts $
3 /////////////////////////////////////////////////////////////////////////
4 //
5 // Copyright (c) 2015-2018 Stanislav Shwartsman
6 // Written by Stanislav Shwartsman [sshwarts at sourceforge net]
7 //
8 // This library is free software; you can redistribute it and/or
9 // modify it under the terms of the GNU Lesser General Public
10 // License as published by the Free Software Foundation; either
11 // version 2 of the License, or (at your option) any later version.
12 //
13 // This library is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 // Lesser General Public License for more details.
17 //
18 // You should have received a copy of the GNU Lesser General Public
19 // License along with this library; if not, write to the Free Software
20 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA B 02110-1301 USA
21 //
22 /////////////////////////////////////////////////////////////////////////
23
24 #ifndef BX_MEMACCESS_H
25 #define BX_MEMACCESS_H
26
27 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
write_virtual_byte_32(unsigned s,Bit32u offset,Bit8u data)28 BX_CPU_C::write_virtual_byte_32(unsigned s, Bit32u offset, Bit8u data)
29 {
30 Bit32u laddr = agen_write32(s, offset, 1);
31 write_linear_byte(s, laddr, data);
32 }
33
34 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
write_virtual_word_32(unsigned s,Bit32u offset,Bit16u data)35 BX_CPU_C::write_virtual_word_32(unsigned s, Bit32u offset, Bit16u data)
36 {
37 Bit32u laddr = agen_write32(s, offset, 2);
38 write_linear_word(s, laddr, data);
39 }
40
41 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
write_virtual_dword_32(unsigned s,Bit32u offset,Bit32u data)42 BX_CPU_C::write_virtual_dword_32(unsigned s, Bit32u offset, Bit32u data)
43 {
44 Bit32u laddr = agen_write32(s, offset, 4);
45 write_linear_dword(s, laddr, data);
46 }
47
48 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
write_virtual_qword_32(unsigned s,Bit32u offset,Bit64u data)49 BX_CPU_C::write_virtual_qword_32(unsigned s, Bit32u offset, Bit64u data)
50 {
51 Bit32u laddr = agen_write32(s, offset, 8);
52 write_linear_qword(s, laddr, data);
53 }
54
55 #if BX_CPU_LEVEL >= 6
56
57 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
write_virtual_xmmword_32(unsigned s,Bit32u offset,const BxPackedXmmRegister * data)58 BX_CPU_C::write_virtual_xmmword_32(unsigned s, Bit32u offset, const BxPackedXmmRegister *data)
59 {
60 Bit32u laddr = agen_write32(s, offset, 16);
61 write_linear_xmmword(s, laddr, data);
62 }
63
64 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
write_virtual_xmmword_aligned_32(unsigned s,Bit32u offset,const BxPackedXmmRegister * data)65 BX_CPU_C::write_virtual_xmmword_aligned_32(unsigned s, Bit32u offset, const BxPackedXmmRegister *data)
66 {
67 Bit32u laddr = agen_write_aligned32(s, offset, 16);
68 write_linear_xmmword_aligned(s, laddr, data);
69 }
70
71 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
write_virtual_ymmword_32(unsigned s,Bit32u offset,const BxPackedYmmRegister * data)72 BX_CPU_C::write_virtual_ymmword_32(unsigned s, Bit32u offset, const BxPackedYmmRegister *data)
73 {
74 Bit32u laddr = agen_write32(s, offset, 32);
75 write_linear_ymmword(s, laddr, data);
76 }
77
78 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
write_virtual_ymmword_aligned_32(unsigned s,Bit32u offset,const BxPackedYmmRegister * data)79 BX_CPU_C::write_virtual_ymmword_aligned_32(unsigned s, Bit32u offset, const BxPackedYmmRegister *data)
80 {
81 Bit32u laddr = agen_write_aligned32(s, offset, 32);
82 write_linear_ymmword_aligned(s, laddr, data);
83 }
84
85 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
write_virtual_zmmword_32(unsigned s,Bit32u offset,const BxPackedZmmRegister * data)86 BX_CPU_C::write_virtual_zmmword_32(unsigned s, Bit32u offset, const BxPackedZmmRegister *data)
87 {
88 Bit32u laddr = agen_write32(s, offset, 64);
89 write_linear_zmmword(s, laddr, data);
90 }
91
92 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
write_virtual_zmmword_aligned_32(unsigned s,Bit32u offset,const BxPackedZmmRegister * data)93 BX_CPU_C::write_virtual_zmmword_aligned_32(unsigned s, Bit32u offset, const BxPackedZmmRegister *data)
94 {
95 Bit32u laddr = agen_write_aligned32(s, offset, 64);
96 write_linear_zmmword_aligned(s, laddr, data);
97 }
98
99 #endif // BX_CPU_LEVEL >= 6
100
101 BX_CPP_INLINE void BX_CPP_AttrRegparmN(2)
tickle_read_virtual_32(unsigned s,Bit32u offset)102 BX_CPU_C::tickle_read_virtual_32(unsigned s, Bit32u offset)
103 {
104 Bit32u laddr = agen_read32(s, offset, 1);
105 tickle_read_linear(s, laddr);
106 }
107
108 BX_CPP_INLINE Bit8u BX_CPP_AttrRegparmN(2)
read_virtual_byte_32(unsigned s,Bit32u offset)109 BX_CPU_C::read_virtual_byte_32(unsigned s, Bit32u offset)
110 {
111 Bit32u laddr = agen_read32(s, offset, 1);
112 return read_linear_byte(s, laddr);
113 }
114
115 BX_CPP_INLINE Bit16u BX_CPP_AttrRegparmN(2)
read_virtual_word_32(unsigned s,Bit32u offset)116 BX_CPU_C::read_virtual_word_32(unsigned s, Bit32u offset)
117 {
118 Bit32u laddr = agen_read32(s, offset, 2);
119 return read_linear_word(s, laddr);
120 }
121
122 BX_CPP_INLINE Bit32u BX_CPP_AttrRegparmN(2)
read_virtual_dword_32(unsigned s,Bit32u offset)123 BX_CPU_C::read_virtual_dword_32(unsigned s, Bit32u offset)
124 {
125 Bit32u laddr = agen_read32(s, offset, 4);
126 return read_linear_dword(s, laddr);
127 }
128
129 BX_CPP_INLINE Bit64u BX_CPP_AttrRegparmN(2)
read_virtual_qword_32(unsigned s,Bit32u offset)130 BX_CPU_C::read_virtual_qword_32(unsigned s, Bit32u offset)
131 {
132 Bit32u laddr = agen_read32(s, offset, 8);
133 return read_linear_qword(s, laddr);
134 }
135
136 #if BX_CPU_LEVEL >= 6
137
138 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
read_virtual_xmmword_32(unsigned s,Bit32u offset,BxPackedXmmRegister * data)139 BX_CPU_C::read_virtual_xmmword_32(unsigned s, Bit32u offset, BxPackedXmmRegister *data)
140 {
141 Bit32u laddr = agen_read32(s, offset, 16);
142 read_linear_xmmword(s, laddr, data);
143 }
144
145 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
read_virtual_xmmword_aligned_32(unsigned s,Bit32u offset,BxPackedXmmRegister * data)146 BX_CPU_C::read_virtual_xmmword_aligned_32(unsigned s, Bit32u offset, BxPackedXmmRegister *data)
147 {
148 Bit32u laddr = agen_read_aligned32(s, offset, 16);
149 read_linear_xmmword_aligned(s, laddr, data);
150 }
151
152 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
read_virtual_ymmword_32(unsigned s,Bit32u offset,BxPackedYmmRegister * data)153 BX_CPU_C::read_virtual_ymmword_32(unsigned s, Bit32u offset, BxPackedYmmRegister *data)
154 {
155 Bit32u laddr = agen_read32(s, offset, 32);
156 read_linear_ymmword(s, laddr, data);
157 }
158
159 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
read_virtual_ymmword_aligned_32(unsigned s,Bit32u offset,BxPackedYmmRegister * data)160 BX_CPU_C::read_virtual_ymmword_aligned_32(unsigned s, Bit32u offset, BxPackedYmmRegister *data)
161 {
162 Bit32u laddr = agen_read_aligned32(s, offset, 32);
163 read_linear_ymmword_aligned(s, laddr, data);
164 }
165
166 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
read_virtual_zmmword_32(unsigned s,Bit32u offset,BxPackedZmmRegister * data)167 BX_CPU_C::read_virtual_zmmword_32(unsigned s, Bit32u offset, BxPackedZmmRegister *data)
168 {
169 Bit32u laddr = agen_read32(s, offset, 64);
170 read_linear_zmmword(s, laddr, data);
171 }
172
173 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
read_virtual_zmmword_aligned_32(unsigned s,Bit32u offset,BxPackedZmmRegister * data)174 BX_CPU_C::read_virtual_zmmword_aligned_32(unsigned s, Bit32u offset, BxPackedZmmRegister *data)
175 {
176 Bit32u laddr = agen_read_aligned32(s, offset, 64);
177 read_linear_zmmword_aligned(s, laddr, data);
178 }
179
180 #endif // BX_CPU_LEVEL >= 6
181
182 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
write_virtual_byte(unsigned s,bx_address offset,Bit8u data)183 BX_CPU_C::write_virtual_byte(unsigned s, bx_address offset, Bit8u data)
184 {
185 bx_address laddr = agen_write(s, offset, 1);
186 write_linear_byte(s, laddr, data);
187 }
188
189 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
write_virtual_word(unsigned s,bx_address offset,Bit16u data)190 BX_CPU_C::write_virtual_word(unsigned s, bx_address offset, Bit16u data)
191 {
192 bx_address laddr = agen_write(s, offset, 2);
193 write_linear_word(s, laddr, data);
194 }
195
196 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
write_virtual_dword(unsigned s,bx_address offset,Bit32u data)197 BX_CPU_C::write_virtual_dword(unsigned s, bx_address offset, Bit32u data)
198 {
199 bx_address laddr = agen_write(s, offset, 4);
200 write_linear_dword(s, laddr, data);
201 }
202
203 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
write_virtual_qword(unsigned s,bx_address offset,Bit64u data)204 BX_CPU_C::write_virtual_qword(unsigned s, bx_address offset, Bit64u data)
205 {
206 bx_address laddr = agen_write(s, offset, 8);
207 write_linear_qword(s, laddr, data);
208 }
209
210 #if BX_CPU_LEVEL >= 6
211
212 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
write_virtual_xmmword(unsigned s,bx_address offset,const BxPackedXmmRegister * data)213 BX_CPU_C::write_virtual_xmmword(unsigned s, bx_address offset, const BxPackedXmmRegister *data)
214 {
215 bx_address laddr = agen_write(s, offset, 16);
216 write_linear_xmmword(s, laddr, data);
217 }
218
219 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
write_virtual_xmmword_aligned(unsigned s,bx_address offset,const BxPackedXmmRegister * data)220 BX_CPU_C::write_virtual_xmmword_aligned(unsigned s, bx_address offset, const BxPackedXmmRegister *data)
221 {
222 bx_address laddr = agen_write_aligned(s, offset, 16);
223 write_linear_xmmword_aligned(s, laddr, data);
224 }
225
226 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
write_virtual_ymmword(unsigned s,bx_address offset,const BxPackedYmmRegister * data)227 BX_CPU_C::write_virtual_ymmword(unsigned s, bx_address offset, const BxPackedYmmRegister *data)
228 {
229 bx_address laddr = agen_write(s, offset, 32);
230 write_linear_ymmword(s, laddr, data);
231 }
232
233 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
write_virtual_ymmword_aligned(unsigned s,bx_address offset,const BxPackedYmmRegister * data)234 BX_CPU_C::write_virtual_ymmword_aligned(unsigned s, bx_address offset, const BxPackedYmmRegister *data)
235 {
236 bx_address laddr = agen_write_aligned(s, offset, 32);
237 write_linear_ymmword_aligned(s, laddr, data);
238 }
239
240 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
write_virtual_zmmword(unsigned s,bx_address offset,const BxPackedZmmRegister * data)241 BX_CPU_C::write_virtual_zmmword(unsigned s, bx_address offset, const BxPackedZmmRegister *data)
242 {
243 bx_address laddr = agen_write(s, offset, 64);
244 write_linear_zmmword(s, laddr, data);
245 }
246
247 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
write_virtual_zmmword_aligned(unsigned s,bx_address offset,const BxPackedZmmRegister * data)248 BX_CPU_C::write_virtual_zmmword_aligned(unsigned s, bx_address offset, const BxPackedZmmRegister *data)
249 {
250 bx_address laddr = agen_write_aligned(s, offset, 64);
251 write_linear_zmmword_aligned(s, laddr, data);
252 }
253
254 #endif // BX_CPU_LEVEL >= 6
255
256 BX_CPP_INLINE void BX_CPP_AttrRegparmN(2)
tickle_read_virtual(unsigned s,bx_address offset)257 BX_CPU_C::tickle_read_virtual(unsigned s, bx_address offset)
258 {
259 bx_address laddr = agen_read(s, offset, 1);
260 tickle_read_linear(s, laddr);
261 }
262
263 BX_CPP_INLINE Bit8u BX_CPP_AttrRegparmN(2)
read_virtual_byte(unsigned s,bx_address offset)264 BX_CPU_C::read_virtual_byte(unsigned s, bx_address offset)
265 {
266 bx_address laddr = agen_read(s, offset, 1);
267 return read_linear_byte(s, laddr);
268 }
269
270 BX_CPP_INLINE Bit16u BX_CPP_AttrRegparmN(2)
read_virtual_word(unsigned s,bx_address offset)271 BX_CPU_C::read_virtual_word(unsigned s, bx_address offset)
272 {
273 bx_address laddr = agen_read(s, offset, 2);
274 return read_linear_word(s, laddr);
275 }
276
277 BX_CPP_INLINE Bit32u BX_CPP_AttrRegparmN(2)
read_virtual_dword(unsigned s,bx_address offset)278 BX_CPU_C::read_virtual_dword(unsigned s, bx_address offset)
279 {
280 bx_address laddr = agen_read(s, offset, 4);
281 return read_linear_dword(s, laddr);
282 }
283
284 BX_CPP_INLINE Bit64u BX_CPP_AttrRegparmN(2)
read_virtual_qword(unsigned s,bx_address offset)285 BX_CPU_C::read_virtual_qword(unsigned s, bx_address offset)
286 {
287 bx_address laddr = agen_read(s, offset, 8);
288 return read_linear_qword(s, laddr);
289 }
290
291 #if BX_CPU_LEVEL >= 6
292
293 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
read_virtual_xmmword(unsigned s,bx_address offset,BxPackedXmmRegister * data)294 BX_CPU_C::read_virtual_xmmword(unsigned s, bx_address offset, BxPackedXmmRegister *data)
295 {
296 bx_address laddr = agen_read(s, offset, 16);
297 read_linear_xmmword(s, laddr, data);
298 }
299
300 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
read_virtual_xmmword_aligned(unsigned s,bx_address offset,BxPackedXmmRegister * data)301 BX_CPU_C::read_virtual_xmmword_aligned(unsigned s, bx_address offset, BxPackedXmmRegister *data)
302 {
303 bx_address laddr = agen_read_aligned(s, offset, 16);
304 read_linear_xmmword_aligned(s, laddr, data);
305 }
306
307 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
read_virtual_ymmword(unsigned s,bx_address offset,BxPackedYmmRegister * data)308 BX_CPU_C::read_virtual_ymmword(unsigned s, bx_address offset, BxPackedYmmRegister *data)
309 {
310 bx_address laddr = agen_read(s, offset, 32);
311 read_linear_ymmword(s, laddr, data);
312 }
313
314 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
read_virtual_ymmword_aligned(unsigned s,bx_address offset,BxPackedYmmRegister * data)315 BX_CPU_C::read_virtual_ymmword_aligned(unsigned s, bx_address offset, BxPackedYmmRegister *data)
316 {
317 bx_address laddr = agen_read_aligned(s, offset, 32);
318 read_linear_ymmword_aligned(s, laddr, data);
319 }
320
321 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
read_virtual_zmmword(unsigned s,bx_address offset,BxPackedZmmRegister * data)322 BX_CPU_C::read_virtual_zmmword(unsigned s, bx_address offset, BxPackedZmmRegister *data)
323 {
324 bx_address laddr = agen_read(s, offset, 64);
325 read_linear_zmmword(s, laddr, data);
326 }
327
328 BX_CPP_INLINE void BX_CPP_AttrRegparmN(3)
read_virtual_zmmword_aligned(unsigned s,bx_address offset,BxPackedZmmRegister * data)329 BX_CPU_C::read_virtual_zmmword_aligned(unsigned s, bx_address offset, BxPackedZmmRegister *data)
330 {
331 bx_address laddr = agen_read_aligned(s, offset, 64);
332 read_linear_zmmword_aligned(s, laddr, data);
333 }
334
335 #endif // BX_CPU_LEVEL >= 6
336
337 //////////////////////////////////////////////////////////////
338 // special Read-Modify-Write operations //
339 // address translation info is kept across read/write calls //
340 //////////////////////////////////////////////////////////////
341
342 BX_CPP_INLINE Bit8u BX_CPP_AttrRegparmN(2)
read_RMW_virtual_byte_32(unsigned s,Bit32u offset)343 BX_CPU_C::read_RMW_virtual_byte_32(unsigned s, Bit32u offset)
344 {
345 Bit32u laddr = agen_write32(s, offset, 1);
346 return read_RMW_linear_byte(s, laddr);
347 }
348
349 BX_CPP_INLINE Bit16u BX_CPP_AttrRegparmN(2)
read_RMW_virtual_word_32(unsigned s,Bit32u offset)350 BX_CPU_C::read_RMW_virtual_word_32(unsigned s, Bit32u offset)
351 {
352 Bit32u laddr = agen_write32(s, offset, 2);
353 return read_RMW_linear_word(s, laddr);
354 }
355
356 BX_CPP_INLINE Bit32u BX_CPP_AttrRegparmN(2)
read_RMW_virtual_dword_32(unsigned s,Bit32u offset)357 BX_CPU_C::read_RMW_virtual_dword_32(unsigned s, Bit32u offset)
358 {
359 Bit32u laddr = agen_write32(s, offset, 4);
360 return read_RMW_linear_dword(s, laddr);
361 }
362
363 BX_CPP_INLINE Bit64u BX_CPP_AttrRegparmN(2)
read_RMW_virtual_qword_32(unsigned s,Bit32u offset)364 BX_CPU_C::read_RMW_virtual_qword_32(unsigned s, Bit32u offset)
365 {
366 Bit32u laddr = agen_write32(s, offset, 8);
367 return read_RMW_linear_qword(s, laddr);
368 }
369
370 BX_CPP_INLINE Bit8u BX_CPP_AttrRegparmN(2)
read_RMW_virtual_byte(unsigned s,bx_address offset)371 BX_CPU_C::read_RMW_virtual_byte(unsigned s, bx_address offset)
372 {
373 bx_address laddr = agen_write(s, offset, 1);
374 return read_RMW_linear_byte(s, laddr);
375 }
376
377 BX_CPP_INLINE Bit16u BX_CPP_AttrRegparmN(2)
read_RMW_virtual_word(unsigned s,bx_address offset)378 BX_CPU_C::read_RMW_virtual_word(unsigned s, bx_address offset)
379 {
380 bx_address laddr = agen_write(s, offset, 2);
381 return read_RMW_linear_word(s, laddr);
382 }
383
384 BX_CPP_INLINE Bit32u BX_CPP_AttrRegparmN(2)
read_RMW_virtual_dword(unsigned s,bx_address offset)385 BX_CPU_C::read_RMW_virtual_dword(unsigned s, bx_address offset)
386 {
387 bx_address laddr = agen_write(s, offset, 4);
388 return read_RMW_linear_dword(s, laddr);
389 }
390
391 BX_CPP_INLINE Bit64u BX_CPP_AttrRegparmN(2)
read_RMW_virtual_qword(unsigned s,bx_address offset)392 BX_CPU_C::read_RMW_virtual_qword(unsigned s, bx_address offset)
393 {
394 bx_address laddr = agen_write(s, offset, 8);
395 return read_RMW_linear_qword(s, laddr);
396 }
397
398 #endif
399