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