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