xref: /openbmc/qemu/docs/devel/loads-stores.rst (revision b38d263bca64bbba36d4b175ea0f5746b4c5604d)
1b7ecba0fSPeter Maydell..
2b7ecba0fSPeter Maydell   Copyright (c) 2017 Linaro Limited
3b7ecba0fSPeter Maydell   Written by Peter Maydell
4b7ecba0fSPeter Maydell
5b7ecba0fSPeter Maydell===================
6b7ecba0fSPeter MaydellLoad and Store APIs
7b7ecba0fSPeter Maydell===================
8b7ecba0fSPeter Maydell
9b7ecba0fSPeter MaydellQEMU internally has multiple families of functions for performing
10b7ecba0fSPeter Maydellloads and stores. This document attempts to enumerate them all
11b7ecba0fSPeter Maydelland indicate when to use them. It does not provide detailed
12b7ecba0fSPeter Maydelldocumentation of each API -- for that you should look at the
13b7ecba0fSPeter Maydelldocumentation comments in the relevant header files.
14b7ecba0fSPeter Maydell
15b7ecba0fSPeter Maydell
16b7ecba0fSPeter Maydell``ld*_p and st*_p``
17b7ecba0fSPeter Maydell~~~~~~~~~~~~~~~~~~~
18b7ecba0fSPeter Maydell
19b7ecba0fSPeter MaydellThese functions operate on a host pointer, and should be used
20b7ecba0fSPeter Maydellwhen you already have a pointer into host memory (corresponding
21b7ecba0fSPeter Maydellto guest ram or a local buffer). They deal with doing accesses
22b7ecba0fSPeter Maydellwith the desired endianness and with correctly handling
23b7ecba0fSPeter Maydellpotentially unaligned pointer values.
24b7ecba0fSPeter Maydell
25b7ecba0fSPeter MaydellFunction names follow the pattern:
26b7ecba0fSPeter Maydell
27f930224fSPeter Maydellload: ``ld{sign}{size}_{endian}_p(ptr)``
28b7ecba0fSPeter Maydell
29f930224fSPeter Maydellstore: ``st{size}_{endian}_p(ptr, val)``
30b7ecba0fSPeter Maydell
31b7ecba0fSPeter Maydell``sign``
32f930224fSPeter Maydell - (empty) : for 32 or 64 bit sizes
33b7ecba0fSPeter Maydell - ``u`` : unsigned
34b7ecba0fSPeter Maydell - ``s`` : signed
35b7ecba0fSPeter Maydell
36b7ecba0fSPeter Maydell``size``
37b7ecba0fSPeter Maydell - ``b`` : 8 bits
38b7ecba0fSPeter Maydell - ``w`` : 16 bits
3914180d62SIra Weiny - ``24`` : 24 bits
40b7ecba0fSPeter Maydell - ``l`` : 32 bits
41b7ecba0fSPeter Maydell - ``q`` : 64 bits
42b7ecba0fSPeter Maydell
43b7ecba0fSPeter Maydell``endian``
44b7ecba0fSPeter Maydell - ``he`` : host endian
45b7ecba0fSPeter Maydell - ``be`` : big endian
46b7ecba0fSPeter Maydell - ``le`` : little endian
47b7ecba0fSPeter Maydell
48b7ecba0fSPeter MaydellThe ``_{endian}`` infix is omitted for target-endian accesses.
49b7ecba0fSPeter Maydell
50b7ecba0fSPeter MaydellThe target endian accessors are only available to source
51b7ecba0fSPeter Maydellfiles which are built per-target.
52b7ecba0fSPeter Maydell
53afa4f665SPeter MaydellThere are also functions which take the size as an argument:
54afa4f665SPeter Maydell
55afa4f665SPeter Maydellload: ``ldn{endian}_p(ptr, sz)``
56afa4f665SPeter Maydell
57afa4f665SPeter Maydellwhich performs an unsigned load of ``sz`` bytes from ``ptr``
58afa4f665SPeter Maydellas an ``{endian}`` order value and returns it in a uint64_t.
59afa4f665SPeter Maydell
60afa4f665SPeter Maydellstore: ``stn{endian}_p(ptr, sz, val)``
61afa4f665SPeter Maydell
62afa4f665SPeter Maydellwhich stores ``val`` to ``ptr`` as an ``{endian}`` order value
63afa4f665SPeter Maydellof size ``sz`` bytes.
64afa4f665SPeter Maydell
65afa4f665SPeter Maydell
66e8d68450SPeter MaydellRegexes for git grep:
67f930224fSPeter Maydell - ``\<ld[us]\?[bwlq]\(_[hbl]e\)\?_p\>``
68f930224fSPeter Maydell - ``\<st[bwlq]\(_[hbl]e\)\?_p\>``
6914180d62SIra Weiny - ``\<st24\(_[hbl]e\)\?_p\>``
70e8d68450SPeter Maydell - ``\<ldn_\([hbl]e\)\?_p\>``
71e8d68450SPeter Maydell - ``\<stn_\([hbl]e\)\?_p\>``
72b7ecba0fSPeter Maydell
73f83bcecbSRichard Henderson``cpu_{ld,st}*_mmu``
74f83bcecbSRichard Henderson~~~~~~~~~~~~~~~~~~~~
75b7ecba0fSPeter Maydell
76f83bcecbSRichard HendersonThese functions operate on a guest virtual address, plus a context
77f83bcecbSRichard Hendersonknown as a "mmu index" which controls how that virtual address is
78f83bcecbSRichard Hendersontranslated, plus a ``MemOp`` which contains alignment requirements
79f83bcecbSRichard Hendersonamong other things.  The ``MemOp`` and mmu index are combined into
80f83bcecbSRichard Hendersona single argument of type ``MemOpIdx``.
81f83bcecbSRichard Henderson
82f83bcecbSRichard HendersonThe meaning of the indexes are target specific, but specifying a
83f83bcecbSRichard Hendersonparticular index might be necessary if, for instance, the helper
84f83bcecbSRichard Hendersonrequires a "always as non-privileged" access rather than the
85f83bcecbSRichard Hendersondefault access for the current state of the guest CPU.
86b7ecba0fSPeter Maydell
87f4e1bae2SRichard HendersonThese functions may cause a guest CPU exception to be taken
88f4e1bae2SRichard Henderson(e.g. for an alignment fault or MMU fault) which will result in
89f4e1bae2SRichard Hendersonguest CPU state being updated and control longjmp'ing out of the
90f4e1bae2SRichard Hendersonfunction call.  They should therefore only be used in code that is
91f4e1bae2SRichard Hendersonimplementing emulation of the guest CPU.
92f4e1bae2SRichard Henderson
93f4e1bae2SRichard HendersonThe ``retaddr`` parameter is used to control unwinding of the
94f4e1bae2SRichard Hendersonguest CPU state in case of a guest CPU exception.  This is passed
95f4e1bae2SRichard Hendersonto ``cpu_restore_state()``.  Therefore the value should either be 0,
96f4e1bae2SRichard Hendersonto indicate that the guest CPU state is already synchronized, or
97f4e1bae2SRichard Hendersonthe result of ``GETPC()`` from the top level ``HELPER(foo)``
98*381d2c36SPaolo Bonzinifunction, which is a return address into the generated code\ [#gpc]_.
99a0c0c9f8SEmanuele Giuseppe Esposito
100a0c0c9f8SEmanuele Giuseppe Esposito.. [#gpc] Note that ``GETPC()`` should be used with great care: calling
101a0c0c9f8SEmanuele Giuseppe Esposito          it in other functions that are *not* the top level
102a0c0c9f8SEmanuele Giuseppe Esposito          ``HELPER(foo)`` will cause unexpected behavior. Instead, the
103a0c0c9f8SEmanuele Giuseppe Esposito          value of ``GETPC()`` should be read from the helper and passed
104a0c0c9f8SEmanuele Giuseppe Esposito          if needed to the functions that the helper calls.
105b7ecba0fSPeter Maydell
106b7ecba0fSPeter MaydellFunction names follow the pattern:
107b7ecba0fSPeter Maydell
108f83bcecbSRichard Hendersonload: ``cpu_ld{size}{end}_mmu(env, ptr, oi, retaddr)``
109f83bcecbSRichard Henderson
110f83bcecbSRichard Hendersonstore: ``cpu_st{size}{end}_mmu(env, ptr, val, oi, retaddr)``
111f83bcecbSRichard Henderson
112f83bcecbSRichard Henderson``size``
113f83bcecbSRichard Henderson - ``b`` : 8 bits
114f83bcecbSRichard Henderson - ``w`` : 16 bits
115f83bcecbSRichard Henderson - ``l`` : 32 bits
116f83bcecbSRichard Henderson - ``q`` : 64 bits
117f83bcecbSRichard Henderson
118f83bcecbSRichard Henderson``end``
119f83bcecbSRichard Henderson - (empty) : for target endian, or 8 bit sizes
120f83bcecbSRichard Henderson - ``_be`` : big endian
121f83bcecbSRichard Henderson - ``_le`` : little endian
122f83bcecbSRichard Henderson
123f83bcecbSRichard HendersonRegexes for git grep:
124e8d68450SPeter Maydell - ``\<cpu_ld[bwlq]\(_[bl]e\)\?_mmu\>``
125e8d68450SPeter Maydell - ``\<cpu_st[bwlq]\(_[bl]e\)\?_mmu\>``
126f83bcecbSRichard Henderson
127f83bcecbSRichard Henderson
128f83bcecbSRichard Henderson``cpu_{ld,st}*_mmuidx_ra``
129f83bcecbSRichard Henderson~~~~~~~~~~~~~~~~~~~~~~~~~~
130f83bcecbSRichard Henderson
131f83bcecbSRichard HendersonThese functions work like the ``cpu_{ld,st}_mmu`` functions except
132f83bcecbSRichard Hendersonthat the ``mmuidx`` parameter is not combined with a ``MemOp``,
133f83bcecbSRichard Hendersonand therefore there is no required alignment supplied or enforced.
134f83bcecbSRichard Henderson
135f83bcecbSRichard HendersonFunction names follow the pattern:
136f83bcecbSRichard Henderson
137b9e60257SRichard Hendersonload: ``cpu_ld{sign}{size}{end}_mmuidx_ra(env, ptr, mmuidx, retaddr)``
138b7ecba0fSPeter Maydell
139b9e60257SRichard Hendersonstore: ``cpu_st{size}{end}_mmuidx_ra(env, ptr, val, mmuidx, retaddr)``
140b7ecba0fSPeter Maydell
141b7ecba0fSPeter Maydell``sign``
142b7ecba0fSPeter Maydell - (empty) : for 32 or 64 bit sizes
143b7ecba0fSPeter Maydell - ``u`` : unsigned
144b7ecba0fSPeter Maydell - ``s`` : signed
145b7ecba0fSPeter Maydell
146b7ecba0fSPeter Maydell``size``
147b7ecba0fSPeter Maydell - ``b`` : 8 bits
148b7ecba0fSPeter Maydell - ``w`` : 16 bits
149b7ecba0fSPeter Maydell - ``l`` : 32 bits
150b7ecba0fSPeter Maydell - ``q`` : 64 bits
151b7ecba0fSPeter Maydell
152b9e60257SRichard Henderson``end``
153b9e60257SRichard Henderson - (empty) : for target endian, or 8 bit sizes
154b9e60257SRichard Henderson - ``_be`` : big endian
155b9e60257SRichard Henderson - ``_le`` : little endian
156b9e60257SRichard Henderson
157f4e1bae2SRichard HendersonRegexes for git grep:
158e8d68450SPeter Maydell - ``\<cpu_ld[us]\?[bwlq]\(_[bl]e\)\?_mmuidx_ra\>``
159e8d68450SPeter Maydell - ``\<cpu_st[bwlq]\(_[bl]e\)\?_mmuidx_ra\>``
160b7ecba0fSPeter Maydell
161f4e1bae2SRichard Henderson``cpu_{ld,st}*_data_ra``
162f4e1bae2SRichard Henderson~~~~~~~~~~~~~~~~~~~~~~~~
163b7ecba0fSPeter Maydell
164f4e1bae2SRichard HendersonThese functions work like the ``cpu_{ld,st}_mmuidx_ra`` functions
165f4e1bae2SRichard Hendersonexcept that the ``mmuidx`` parameter is taken from the current mode
166f4e1bae2SRichard Hendersonof the guest CPU, as determined by ``cpu_mmu_index(env, false)``.
167b7ecba0fSPeter Maydell
168b7ecba0fSPeter MaydellThese are generally the preferred way to do accesses by guest
169f4e1bae2SRichard Hendersonvirtual address from helper functions, unless the access should
170f83bcecbSRichard Hendersonbe performed with a context other than the default, or alignment
171f83bcecbSRichard Hendersonshould be enforced for the access.
172b7ecba0fSPeter Maydell
173b7ecba0fSPeter MaydellFunction names follow the pattern:
174b7ecba0fSPeter Maydell
175b9e60257SRichard Hendersonload: ``cpu_ld{sign}{size}{end}_data_ra(env, ptr, ra)``
176b7ecba0fSPeter Maydell
177b9e60257SRichard Hendersonstore: ``cpu_st{size}{end}_data_ra(env, ptr, val, ra)``
178f4e1bae2SRichard Henderson
179f4e1bae2SRichard Henderson``sign``
180f4e1bae2SRichard Henderson - (empty) : for 32 or 64 bit sizes
181f4e1bae2SRichard Henderson - ``u`` : unsigned
182f4e1bae2SRichard Henderson - ``s`` : signed
183f4e1bae2SRichard Henderson
184f4e1bae2SRichard Henderson``size``
185f4e1bae2SRichard Henderson - ``b`` : 8 bits
186f4e1bae2SRichard Henderson - ``w`` : 16 bits
187f4e1bae2SRichard Henderson - ``l`` : 32 bits
188f4e1bae2SRichard Henderson - ``q`` : 64 bits
189f4e1bae2SRichard Henderson
190b9e60257SRichard Henderson``end``
191b9e60257SRichard Henderson - (empty) : for target endian, or 8 bit sizes
192b9e60257SRichard Henderson - ``_be`` : big endian
193b9e60257SRichard Henderson - ``_le`` : little endian
194b9e60257SRichard Henderson
195f4e1bae2SRichard HendersonRegexes for git grep:
196e8d68450SPeter Maydell - ``\<cpu_ld[us]\?[bwlq]\(_[bl]e\)\?_data_ra\>``
197e8d68450SPeter Maydell - ``\<cpu_st[bwlq]\(_[bl]e\)\?_data_ra\>``
198f4e1bae2SRichard Henderson
199f4e1bae2SRichard Henderson``cpu_{ld,st}*_data``
200f4e1bae2SRichard Henderson~~~~~~~~~~~~~~~~~~~~~
201f4e1bae2SRichard Henderson
202f4e1bae2SRichard HendersonThese functions work like the ``cpu_{ld,st}_data_ra`` functions
203f4e1bae2SRichard Hendersonexcept that the ``retaddr`` parameter is 0, and thus does not
204f4e1bae2SRichard Hendersonunwind guest CPU state.
205f4e1bae2SRichard Henderson
206f4e1bae2SRichard HendersonThis means they must only be used from helper functions where the
207f4e1bae2SRichard Hendersontranslator has saved all necessary CPU state.  These functions are
208f4e1bae2SRichard Hendersonthe right choice for calls made from hooks like the CPU ``do_interrupt``
209f4e1bae2SRichard Hendersonhook or when you know for certain that the translator had to save all
210f4e1bae2SRichard Hendersonthe CPU state anyway.
211f4e1bae2SRichard Henderson
212f4e1bae2SRichard HendersonFunction names follow the pattern:
213f4e1bae2SRichard Henderson
214b9e60257SRichard Hendersonload: ``cpu_ld{sign}{size}{end}_data(env, ptr)``
215f4e1bae2SRichard Henderson
216b9e60257SRichard Hendersonstore: ``cpu_st{size}{end}_data(env, ptr, val)``
217f4e1bae2SRichard Henderson
218f4e1bae2SRichard Henderson``sign``
219f4e1bae2SRichard Henderson - (empty) : for 32 or 64 bit sizes
220f4e1bae2SRichard Henderson - ``u`` : unsigned
221f4e1bae2SRichard Henderson - ``s`` : signed
222f4e1bae2SRichard Henderson
223f4e1bae2SRichard Henderson``size``
224f4e1bae2SRichard Henderson - ``b`` : 8 bits
225f4e1bae2SRichard Henderson - ``w`` : 16 bits
226f4e1bae2SRichard Henderson - ``l`` : 32 bits
227f4e1bae2SRichard Henderson - ``q`` : 64 bits
228b7ecba0fSPeter Maydell
229b9e60257SRichard Henderson``end``
230b9e60257SRichard Henderson - (empty) : for target endian, or 8 bit sizes
231b9e60257SRichard Henderson - ``_be`` : big endian
232b9e60257SRichard Henderson - ``_le`` : little endian
233b9e60257SRichard Henderson
234e8d68450SPeter MaydellRegexes for git grep:
235e8d68450SPeter Maydell - ``\<cpu_ld[us]\?[bwlq]\(_[bl]e\)\?_data\>``
236e8d68450SPeter Maydell - ``\<cpu_st[bwlq]\(_[bl]e\)\?_data\+\>``
237b7ecba0fSPeter Maydell
238f4e1bae2SRichard Henderson``cpu_ld*_code``
239f4e1bae2SRichard Henderson~~~~~~~~~~~~~~~~
240f4e1bae2SRichard Henderson
241f4e1bae2SRichard HendersonThese functions perform a read for instruction execution.  The ``mmuidx``
242f4e1bae2SRichard Hendersonparameter is taken from the current mode of the guest CPU, as determined
243f4e1bae2SRichard Hendersonby ``cpu_mmu_index(env, true)``.  The ``retaddr`` parameter is 0, and
244f4e1bae2SRichard Hendersonthus does not unwind guest CPU state, because CPU state is always
245f4e1bae2SRichard Hendersonsynchronized while translating instructions.  Any guest CPU exception
246f4e1bae2SRichard Hendersonthat is raised will indicate an instruction execution fault rather than
247f4e1bae2SRichard Hendersona data read fault.
248f4e1bae2SRichard Henderson
249f4e1bae2SRichard HendersonIn general these functions should not be used directly during translation.
250f4e1bae2SRichard HendersonThere are wrapper functions that are to be used which also take care of
251f4e1bae2SRichard Hendersonplugins for tracing.
252f4e1bae2SRichard Henderson
253f4e1bae2SRichard HendersonFunction names follow the pattern:
254f4e1bae2SRichard Henderson
255f4e1bae2SRichard Hendersonload: ``cpu_ld{sign}{size}_code(env, ptr)``
256f4e1bae2SRichard Henderson
257f4e1bae2SRichard Henderson``sign``
258f4e1bae2SRichard Henderson - (empty) : for 32 or 64 bit sizes
259f4e1bae2SRichard Henderson - ``u`` : unsigned
260f4e1bae2SRichard Henderson - ``s`` : signed
261f4e1bae2SRichard Henderson
262f4e1bae2SRichard Henderson``size``
263f4e1bae2SRichard Henderson - ``b`` : 8 bits
264f4e1bae2SRichard Henderson - ``w`` : 16 bits
265f4e1bae2SRichard Henderson - ``l`` : 32 bits
266f4e1bae2SRichard Henderson - ``q`` : 64 bits
267f4e1bae2SRichard Henderson
268f4e1bae2SRichard HendersonRegexes for git grep:
269f4e1bae2SRichard Henderson - ``\<cpu_ld[us]\?[bwlq]_code\>``
270f4e1bae2SRichard Henderson
271f4e1bae2SRichard Henderson``translator_ld*``
272f4e1bae2SRichard Henderson~~~~~~~~~~~~~~~~~~
273f4e1bae2SRichard Henderson
274f4e1bae2SRichard HendersonThese functions are a wrapper for ``cpu_ld*_code`` which also perform
275f4e1bae2SRichard Hendersonany actions required by any tracing plugins.  They are only to be
276f4e1bae2SRichard Hendersoncalled during the translator callback ``translate_insn``.
277f4e1bae2SRichard Henderson
278f4e1bae2SRichard HendersonThere is a set of functions ending in ``_swap`` which, if the parameter
279f4e1bae2SRichard Hendersonis true, returns the value in the endianness that is the reverse of
280ee3eb3a7SMarc-André Lureauthe guest native endianness, as determined by ``TARGET_BIG_ENDIAN``.
281f4e1bae2SRichard Henderson
282f4e1bae2SRichard HendersonFunction names follow the pattern:
283f4e1bae2SRichard Henderson
284f4e1bae2SRichard Hendersonload: ``translator_ld{sign}{size}(env, ptr)``
285f4e1bae2SRichard Henderson
286f4e1bae2SRichard Hendersonswap: ``translator_ld{sign}{size}_swap(env, ptr, swap)``
287f4e1bae2SRichard Henderson
288f4e1bae2SRichard Henderson``sign``
289f4e1bae2SRichard Henderson - (empty) : for 32 or 64 bit sizes
290f4e1bae2SRichard Henderson - ``u`` : unsigned
291f4e1bae2SRichard Henderson - ``s`` : signed
292f4e1bae2SRichard Henderson
293f4e1bae2SRichard Henderson``size``
294f4e1bae2SRichard Henderson - ``b`` : 8 bits
295f4e1bae2SRichard Henderson - ``w`` : 16 bits
296f4e1bae2SRichard Henderson - ``l`` : 32 bits
297f4e1bae2SRichard Henderson - ``q`` : 64 bits
298f4e1bae2SRichard Henderson
299e8d68450SPeter MaydellRegexes for git grep:
300f4e1bae2SRichard Henderson - ``\<translator_ld[us]\?[bwlq]\(_swap\)\?\>``
301f4e1bae2SRichard Henderson
3020cadc1edSRichard Henderson``helper_{ld,st}*_mmu``
303f4e1bae2SRichard Henderson~~~~~~~~~~~~~~~~~~~~~~~~~
304b7ecba0fSPeter Maydell
305b7ecba0fSPeter MaydellThese functions are intended primarily to be called by the code
3060cadc1edSRichard Hendersongenerated by the TCG backend.  Like the ``cpu_{ld,st}_mmu`` functions
3070cadc1edSRichard Hendersonthey perform accesses by guest virtual address, with a given ``MemOpIdx``.
308b7ecba0fSPeter Maydell
3090cadc1edSRichard HendersonThey differ from ``cpu_{ld,st}_mmu`` in that they take the endianness
3100cadc1edSRichard Hendersonof the operation only from the MemOpIdx, and loads extend the return
3110cadc1edSRichard Hendersonvalue to the size of a host general register (``tcg_target_ulong``).
312b7ecba0fSPeter Maydell
3130cadc1edSRichard Hendersonload: ``helper_ld{sign}{size}_mmu(env, addr, opindex, retaddr)``
314b7ecba0fSPeter Maydell
3150cadc1edSRichard Hendersonstore: ``helper_{size}_mmu(env, addr, val, opindex, retaddr)``
316b7ecba0fSPeter Maydell
317b7ecba0fSPeter Maydell``sign``
318b7ecba0fSPeter Maydell - (empty) : for 32 or 64 bit sizes
319b7ecba0fSPeter Maydell - ``u`` : unsigned
320b7ecba0fSPeter Maydell - ``s`` : signed
321b7ecba0fSPeter Maydell
322b7ecba0fSPeter Maydell``size``
323b7ecba0fSPeter Maydell - ``b`` : 8 bits
324b7ecba0fSPeter Maydell - ``w`` : 16 bits
325b7ecba0fSPeter Maydell - ``l`` : 32 bits
326b7ecba0fSPeter Maydell - ``q`` : 64 bits
327b7ecba0fSPeter Maydell
328e8d68450SPeter MaydellRegexes for git grep:
3290cadc1edSRichard Henderson - ``\<helper_ld[us]\?[bwlq]_mmu\>``
3300cadc1edSRichard Henderson - ``\<helper_st[bwlq]_mmu\>``
331b7ecba0fSPeter Maydell
332b7ecba0fSPeter Maydell``address_space_*``
333b7ecba0fSPeter Maydell~~~~~~~~~~~~~~~~~~~
334b7ecba0fSPeter Maydell
335b7ecba0fSPeter MaydellThese functions are the primary ones to use when emulating CPU
336b7ecba0fSPeter Maydellor device memory accesses. They take an AddressSpace, which is the
337b7ecba0fSPeter Maydellway QEMU defines the view of memory that a device or CPU has.
338b7ecba0fSPeter Maydell(They generally correspond to being the "master" end of a hardware bus
339b7ecba0fSPeter Maydellor bus fabric.)
340b7ecba0fSPeter Maydell
341b7ecba0fSPeter MaydellEach CPU has an AddressSpace. Some kinds of CPU have more than
3426fe6d6c9SPeter Maydellone AddressSpace (for instance Arm guest CPUs have an AddressSpace
343b7ecba0fSPeter Maydellfor the Secure world and one for NonSecure if they implement TrustZone).
344b7ecba0fSPeter MaydellDevices which can do DMA-type operations should generally have an
345b7ecba0fSPeter MaydellAddressSpace. There is also a "system address space" which typically
346b7ecba0fSPeter Maydellhas all the devices and memory that all CPUs can see. (Some older
347b7ecba0fSPeter Maydelldevice models use the "system address space" rather than properly
348b7ecba0fSPeter Maydellmodelling that they have an AddressSpace of their own.)
349b7ecba0fSPeter Maydell
350b7ecba0fSPeter MaydellFunctions are provided for doing byte-buffer reads and writes,
351b7ecba0fSPeter Maydelland also for doing one-data-item loads and stores.
352b7ecba0fSPeter Maydell
353b7ecba0fSPeter MaydellIn all cases the caller provides a MemTxAttrs to specify bus
354b7ecba0fSPeter Maydelltransaction attributes, and can check whether the memory transaction
355b7ecba0fSPeter Maydellsucceeded using a MemTxResult return code.
356b7ecba0fSPeter Maydell
357b7ecba0fSPeter Maydell``address_space_read(address_space, addr, attrs, buf, len)``
358b7ecba0fSPeter Maydell
359b7ecba0fSPeter Maydell``address_space_write(address_space, addr, attrs, buf, len)``
360b7ecba0fSPeter Maydell
361b7ecba0fSPeter Maydell``address_space_rw(address_space, addr, attrs, buf, len, is_write)``
362b7ecba0fSPeter Maydell
363b7ecba0fSPeter Maydell``address_space_ld{sign}{size}_{endian}(address_space, addr, attrs, txresult)``
364b7ecba0fSPeter Maydell
365b7ecba0fSPeter Maydell``address_space_st{size}_{endian}(address_space, addr, val, attrs, txresult)``
366b7ecba0fSPeter Maydell
367b7ecba0fSPeter Maydell``sign``
368b7ecba0fSPeter Maydell - (empty) : for 32 or 64 bit sizes
369b7ecba0fSPeter Maydell - ``u`` : unsigned
370b7ecba0fSPeter Maydell
371b7ecba0fSPeter Maydell(No signed load operations are provided.)
372b7ecba0fSPeter Maydell
373b7ecba0fSPeter Maydell``size``
374b7ecba0fSPeter Maydell - ``b`` : 8 bits
375b7ecba0fSPeter Maydell - ``w`` : 16 bits
376b7ecba0fSPeter Maydell - ``l`` : 32 bits
377b7ecba0fSPeter Maydell - ``q`` : 64 bits
378b7ecba0fSPeter Maydell
379b7ecba0fSPeter Maydell``endian``
380b7ecba0fSPeter Maydell - ``le`` : little endian
381b7ecba0fSPeter Maydell - ``be`` : big endian
382b7ecba0fSPeter Maydell
383b7ecba0fSPeter MaydellThe ``_{endian}`` suffix is omitted for byte accesses.
384b7ecba0fSPeter Maydell
385e8d68450SPeter MaydellRegexes for git grep:
386b7ecba0fSPeter Maydell - ``\<address_space_\(read\|write\|rw\)\>``
387b7ecba0fSPeter Maydell - ``\<address_space_ldu\?[bwql]\(_[lb]e\)\?\>``
388b7ecba0fSPeter Maydell - ``\<address_space_st[bwql]\(_[lb]e\)\?\>``
389b7ecba0fSPeter Maydell
3903c8133f9SPeter Maydell``address_space_write_rom``
3913c8133f9SPeter Maydell~~~~~~~~~~~~~~~~~~~~~~~~~~~
3923c8133f9SPeter Maydell
3933c8133f9SPeter MaydellThis function performs a write by physical address like
3943c8133f9SPeter Maydell``address_space_write``, except that if the write is to a ROM then
3953c8133f9SPeter Maydellthe ROM contents will be modified, even though a write by the guest
3963c8133f9SPeter MaydellCPU to the ROM would be ignored. This is used for non-guest writes
3973c8133f9SPeter Maydelllike writes from the gdb debug stub or initial loading of ROM contents.
3983c8133f9SPeter Maydell
3993c8133f9SPeter MaydellNote that portions of the write which attempt to write data to a
4003c8133f9SPeter Maydelldevice will be silently ignored -- only real RAM and ROM will
4013c8133f9SPeter Maydellbe written to.
4023c8133f9SPeter Maydell
403e8d68450SPeter MaydellRegexes for git grep:
4043c8133f9SPeter Maydell - ``address_space_write_rom``
4053c8133f9SPeter Maydell
406b7ecba0fSPeter Maydell``{ld,st}*_phys``
407b7ecba0fSPeter Maydell~~~~~~~~~~~~~~~~~
408b7ecba0fSPeter Maydell
409b7ecba0fSPeter MaydellThese are functions which are identical to
410b7ecba0fSPeter Maydell``address_space_{ld,st}*``, except that they always pass
411b7ecba0fSPeter Maydell``MEMTXATTRS_UNSPECIFIED`` for the transaction attributes, and ignore
412b7ecba0fSPeter Maydellwhether the transaction succeeded or failed.
413b7ecba0fSPeter Maydell
414b7ecba0fSPeter MaydellThe fact that they ignore whether the transaction succeeded means
415b7ecba0fSPeter Maydellthey should not be used in new code, unless you know for certain
416b7ecba0fSPeter Maydellthat your code will only be used in a context where the CPU or
417b7ecba0fSPeter Maydelldevice doing the access has no way to report such an error.
418b7ecba0fSPeter Maydell
419b7ecba0fSPeter Maydell``load: ld{sign}{size}_{endian}_phys``
420b7ecba0fSPeter Maydell
421b7ecba0fSPeter Maydell``store: st{size}_{endian}_phys``
422b7ecba0fSPeter Maydell
423b7ecba0fSPeter Maydell``sign``
424b7ecba0fSPeter Maydell - (empty) : for 32 or 64 bit sizes
425b7ecba0fSPeter Maydell - ``u`` : unsigned
426b7ecba0fSPeter Maydell
427b7ecba0fSPeter Maydell(No signed load operations are provided.)
428b7ecba0fSPeter Maydell
429b7ecba0fSPeter Maydell``size``
430b7ecba0fSPeter Maydell - ``b`` : 8 bits
431b7ecba0fSPeter Maydell - ``w`` : 16 bits
432b7ecba0fSPeter Maydell - ``l`` : 32 bits
433b7ecba0fSPeter Maydell - ``q`` : 64 bits
434b7ecba0fSPeter Maydell
435b7ecba0fSPeter Maydell``endian``
436b7ecba0fSPeter Maydell - ``le`` : little endian
437b7ecba0fSPeter Maydell - ``be`` : big endian
438b7ecba0fSPeter Maydell
439b7ecba0fSPeter MaydellThe ``_{endian}_`` infix is omitted for byte accesses.
440b7ecba0fSPeter Maydell
441e8d68450SPeter MaydellRegexes for git grep:
442b7ecba0fSPeter Maydell - ``\<ldu\?[bwlq]\(_[bl]e\)\?_phys\>``
443b7ecba0fSPeter Maydell - ``\<st[bwlq]\(_[bl]e\)\?_phys\>``
444b7ecba0fSPeter Maydell
445b7ecba0fSPeter Maydell``cpu_physical_memory_*``
446b7ecba0fSPeter Maydell~~~~~~~~~~~~~~~~~~~~~~~~~
447b7ecba0fSPeter Maydell
448b7ecba0fSPeter MaydellThese are convenience functions which are identical to
449b7ecba0fSPeter Maydell``address_space_*`` but operate specifically on the system address space,
450b7ecba0fSPeter Maydellalways pass a ``MEMTXATTRS_UNSPECIFIED`` set of memory attributes and
451b7ecba0fSPeter Maydellignore whether the memory transaction succeeded or failed.
452b7ecba0fSPeter MaydellFor new code they are better avoided:
453b7ecba0fSPeter Maydell
454b7ecba0fSPeter Maydell* there is likely to be behaviour you need to model correctly for a
455b7ecba0fSPeter Maydell  failed read or write operation
456b7ecba0fSPeter Maydell* a device should usually perform operations on its own AddressSpace
457b7ecba0fSPeter Maydell  rather than using the system address space
458b7ecba0fSPeter Maydell
459b7ecba0fSPeter Maydell``cpu_physical_memory_read``
460b7ecba0fSPeter Maydell
461b7ecba0fSPeter Maydell``cpu_physical_memory_write``
462b7ecba0fSPeter Maydell
463b7ecba0fSPeter Maydell``cpu_physical_memory_rw``
464b7ecba0fSPeter Maydell
465e8d68450SPeter MaydellRegexes for git grep:
466b7ecba0fSPeter Maydell - ``\<cpu_physical_memory_\(read\|write\|rw\)\>``
467b7ecba0fSPeter Maydell
468b7ecba0fSPeter Maydell``cpu_memory_rw_debug``
469b7ecba0fSPeter Maydell~~~~~~~~~~~~~~~~~~~~~~~
470b7ecba0fSPeter Maydell
471b7ecba0fSPeter MaydellAccess CPU memory by virtual address for debug purposes.
472b7ecba0fSPeter Maydell
473b7ecba0fSPeter MaydellThis function is intended for use by the GDB stub and similar code.
474b7ecba0fSPeter MaydellIt takes a virtual address, converts it to a physical address via
475b7ecba0fSPeter Maydellan MMU lookup using the current settings of the specified CPU,
476b7ecba0fSPeter Maydelland then performs the access (using ``address_space_rw`` for
477b7ecba0fSPeter Maydellreads or ``cpu_physical_memory_write_rom`` for writes).
478b7ecba0fSPeter MaydellThis means that if the access is a write to a ROM then this
479b7ecba0fSPeter Maydellfunction will modify the contents (whereas a normal guest CPU access
480b7ecba0fSPeter Maydellwould ignore the write attempt).
481b7ecba0fSPeter Maydell
482b7ecba0fSPeter Maydell``cpu_memory_rw_debug``
483b7ecba0fSPeter Maydell
484b7ecba0fSPeter Maydell``dma_memory_*``
485b7ecba0fSPeter Maydell~~~~~~~~~~~~~~~~
486b7ecba0fSPeter Maydell
487b7ecba0fSPeter MaydellThese behave like ``address_space_*``, except that they perform a DMA
488b7ecba0fSPeter Maydellbarrier operation first.
489b7ecba0fSPeter Maydell
490b7ecba0fSPeter Maydell**TODO**: We should provide guidance on when you need the DMA
491b7ecba0fSPeter Maydellbarrier operation and when it's OK to use ``address_space_*``, and
492b7ecba0fSPeter Maydellmake sure our existing code is doing things correctly.
493b7ecba0fSPeter Maydell
494b7ecba0fSPeter Maydell``dma_memory_read``
495b7ecba0fSPeter Maydell
496b7ecba0fSPeter Maydell``dma_memory_write``
497b7ecba0fSPeter Maydell
498b7ecba0fSPeter Maydell``dma_memory_rw``
499b7ecba0fSPeter Maydell
500e8d68450SPeter MaydellRegexes for git grep:
501b7ecba0fSPeter Maydell - ``\<dma_memory_\(read\|write\|rw\)\>``
502a6195b5bSPhilippe Mathieu-Daudé - ``\<ldu\?[bwlq]\(_[bl]e\)\?_dma\>``
503a6195b5bSPhilippe Mathieu-Daudé - ``\<st[bwlq]\(_[bl]e\)\?_dma\>``
504b7ecba0fSPeter Maydell
505b7ecba0fSPeter Maydell``pci_dma_*`` and ``{ld,st}*_pci_dma``
506b7ecba0fSPeter Maydell~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
507b7ecba0fSPeter Maydell
508b7ecba0fSPeter MaydellThese functions are specifically for PCI device models which need to
509b7ecba0fSPeter Maydellperform accesses where the PCI device is a bus master. You pass them a
510b7ecba0fSPeter Maydell``PCIDevice *`` and they will do ``dma_memory_*`` operations on the
511b7ecba0fSPeter Maydellcorrect address space for that device.
512b7ecba0fSPeter Maydell
513b7ecba0fSPeter Maydell``pci_dma_read``
514b7ecba0fSPeter Maydell
515b7ecba0fSPeter Maydell``pci_dma_write``
516b7ecba0fSPeter Maydell
517b7ecba0fSPeter Maydell``pci_dma_rw``
518b7ecba0fSPeter Maydell
519b7ecba0fSPeter Maydell``load: ld{sign}{size}_{endian}_pci_dma``
520b7ecba0fSPeter Maydell
521b7ecba0fSPeter Maydell``store: st{size}_{endian}_pci_dma``
522b7ecba0fSPeter Maydell
523b7ecba0fSPeter Maydell``sign``
524b7ecba0fSPeter Maydell - (empty) : for 32 or 64 bit sizes
525b7ecba0fSPeter Maydell - ``u`` : unsigned
526b7ecba0fSPeter Maydell
527b7ecba0fSPeter Maydell(No signed load operations are provided.)
528b7ecba0fSPeter Maydell
529b7ecba0fSPeter Maydell``size``
530b7ecba0fSPeter Maydell - ``b`` : 8 bits
531b7ecba0fSPeter Maydell - ``w`` : 16 bits
532b7ecba0fSPeter Maydell - ``l`` : 32 bits
533b7ecba0fSPeter Maydell - ``q`` : 64 bits
534b7ecba0fSPeter Maydell
535b7ecba0fSPeter Maydell``endian``
536b7ecba0fSPeter Maydell - ``le`` : little endian
537b7ecba0fSPeter Maydell - ``be`` : big endian
538b7ecba0fSPeter Maydell
539b7ecba0fSPeter MaydellThe ``_{endian}_`` infix is omitted for byte accesses.
540b7ecba0fSPeter Maydell
541e8d68450SPeter MaydellRegexes for git grep:
542b7ecba0fSPeter Maydell - ``\<pci_dma_\(read\|write\|rw\)\>``
543b7ecba0fSPeter Maydell - ``\<ldu\?[bwlq]\(_[bl]e\)\?_pci_dma\>``
544b7ecba0fSPeter Maydell - ``\<st[bwlq]\(_[bl]e\)\?_pci_dma\>``
545