1f08b6170SPaolo Bonzini /* 21ce871a3SPhilippe Mathieu-Daudé * Software MMU support (per-target) 3f08b6170SPaolo Bonzini * 4f08b6170SPaolo Bonzini * This library is free software; you can redistribute it and/or 5f08b6170SPaolo Bonzini * modify it under the terms of the GNU Lesser General Public 6f08b6170SPaolo Bonzini * License as published by the Free Software Foundation; either 7d6ea4236SChetan Pant * version 2.1 of the License, or (at your option) any later version. 8f08b6170SPaolo Bonzini * 9f08b6170SPaolo Bonzini * This library is distributed in the hope that it will be useful, 10f08b6170SPaolo Bonzini * but WITHOUT ANY WARRANTY; without even the implied warranty of 11f08b6170SPaolo Bonzini * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12f08b6170SPaolo Bonzini * Lesser General Public License for more details. 13f08b6170SPaolo Bonzini * 14f08b6170SPaolo Bonzini * You should have received a copy of the GNU Lesser General Public 15f08b6170SPaolo Bonzini * License along with this library; if not, see <http://www.gnu.org/licenses/>. 16f08b6170SPaolo Bonzini * 17f08b6170SPaolo Bonzini */ 18f08b6170SPaolo Bonzini 19f08b6170SPaolo Bonzini /* 20f08b6170SPaolo Bonzini * Generate inline load/store functions for all MMU modes (typically 21f08b6170SPaolo Bonzini * at least _user and _kernel) as well as _data versions, for all data 22f08b6170SPaolo Bonzini * sizes. 23f08b6170SPaolo Bonzini * 24f08b6170SPaolo Bonzini * Used by target op helpers. 25f08b6170SPaolo Bonzini * 26db5fd8d7SPeter Maydell * The syntax for the accessors is: 27db5fd8d7SPeter Maydell * 28b9e60257SRichard Henderson * load: cpu_ld{sign}{size}{end}_{mmusuffix}(env, ptr) 29b9e60257SRichard Henderson * cpu_ld{sign}{size}{end}_{mmusuffix}_ra(env, ptr, retaddr) 30b9e60257SRichard Henderson * cpu_ld{sign}{size}{end}_mmuidx_ra(env, ptr, mmu_idx, retaddr) 31f83bcecbSRichard Henderson * cpu_ld{sign}{size}{end}_mmu(env, ptr, oi, retaddr) 32db5fd8d7SPeter Maydell * 33b9e60257SRichard Henderson * store: cpu_st{size}{end}_{mmusuffix}(env, ptr, val) 34b9e60257SRichard Henderson * cpu_st{size}{end}_{mmusuffix}_ra(env, ptr, val, retaddr) 35b9e60257SRichard Henderson * cpu_st{size}{end}_mmuidx_ra(env, ptr, val, mmu_idx, retaddr) 36f83bcecbSRichard Henderson * cpu_st{size}{end}_mmu(env, ptr, val, oi, retaddr) 37db5fd8d7SPeter Maydell * 38db5fd8d7SPeter Maydell * sign is: 39db5fd8d7SPeter Maydell * (empty): for 32 and 64 bit sizes 40db5fd8d7SPeter Maydell * u : unsigned 41db5fd8d7SPeter Maydell * s : signed 42db5fd8d7SPeter Maydell * 43db5fd8d7SPeter Maydell * size is: 44db5fd8d7SPeter Maydell * b: 8 bits 45db5fd8d7SPeter Maydell * w: 16 bits 46db5fd8d7SPeter Maydell * l: 32 bits 47db5fd8d7SPeter Maydell * q: 64 bits 48db5fd8d7SPeter Maydell * 49b9e60257SRichard Henderson * end is: 50b9e60257SRichard Henderson * (empty): for target native endian, or for 8 bit access 51b9e60257SRichard Henderson * _be: for forced big endian 52b9e60257SRichard Henderson * _le: for forced little endian 53b9e60257SRichard Henderson * 54f4e1bae2SRichard Henderson * mmusuffix is one of the generic suffixes "data" or "code", or "mmuidx". 55f4e1bae2SRichard Henderson * The "mmuidx" suffix carries an extra mmu_idx argument that specifies 56f4e1bae2SRichard Henderson * the index to use; the "data" and "code" suffixes take the index from 57f4e1bae2SRichard Henderson * cpu_mmu_index(). 58f83bcecbSRichard Henderson * 59f83bcecbSRichard Henderson * The "mmu" suffix carries the full MemOpIdx, with both mmu_idx and the 60f83bcecbSRichard Henderson * MemOp including alignment requirements. The alignment will be enforced. 61f08b6170SPaolo Bonzini */ 62*42fa9665SPhilippe Mathieu-Daudé #ifndef ACCEL_TCG_CPU_LDST_H 63*42fa9665SPhilippe Mathieu-Daudé #define ACCEL_TCG_CPU_LDST_H 64f08b6170SPaolo Bonzini 651ce871a3SPhilippe Mathieu-Daudé #ifndef CONFIG_TCG 661ce871a3SPhilippe Mathieu-Daudé #error Can only include this header with TCG 671ce871a3SPhilippe Mathieu-Daudé #endif 681ce871a3SPhilippe Mathieu-Daudé 69d97c3b06SPierrick Bouvier #include "exec/cpu-common.h" 70231a1c0fSPhilippe Mathieu-Daudé #include "accel/tcg/cpu-ldst-common.h" 71efe25c26SRichard Henderson #include "accel/tcg/cpu-mmu-index.h" 72471558cbSPhilippe Mathieu-Daudé #include "exec/abi_ptr.h" 73f83bcecbSRichard Henderson 74c773828aSPaolo Bonzini #if defined(CONFIG_USER_ONLY) 75f9ba56a0SPhilippe Mathieu-Daudé #include "user/guest-host.h" 76471558cbSPhilippe Mathieu-Daudé #endif /* CONFIG_USER_ONLY */ 77c773828aSPaolo Bonzini 78a333692cSRichard Henderson static inline uint32_t 79a333692cSRichard Henderson cpu_ldub_mmuidx_ra(CPUArchState *env, abi_ptr addr, int mmu_idx, uintptr_t ra) 80a333692cSRichard Henderson { 81a333692cSRichard Henderson MemOpIdx oi = make_memop_idx(MO_UB, mmu_idx); 82a333692cSRichard Henderson return cpu_ldb_mmu(env, addr, oi, ra); 83a333692cSRichard Henderson } 84f83bcecbSRichard Henderson 85a333692cSRichard Henderson static inline int 86a333692cSRichard Henderson cpu_ldsb_mmuidx_ra(CPUArchState *env, abi_ptr addr, int mmu_idx, uintptr_t ra) 87a333692cSRichard Henderson { 88a333692cSRichard Henderson return (int8_t)cpu_ldub_mmuidx_ra(env, addr, mmu_idx, ra); 89a333692cSRichard Henderson } 90a333692cSRichard Henderson 91a333692cSRichard Henderson static inline uint32_t 92a333692cSRichard Henderson cpu_lduw_be_mmuidx_ra(CPUArchState *env, abi_ptr addr, 93a333692cSRichard Henderson int mmu_idx, uintptr_t ra) 94a333692cSRichard Henderson { 95a333692cSRichard Henderson MemOpIdx oi = make_memop_idx(MO_BEUW | MO_UNALN, mmu_idx); 96a333692cSRichard Henderson return cpu_ldw_mmu(env, addr, oi, ra); 97a333692cSRichard Henderson } 98a333692cSRichard Henderson 99a333692cSRichard Henderson static inline int 100a333692cSRichard Henderson cpu_ldsw_be_mmuidx_ra(CPUArchState *env, abi_ptr addr, 101a333692cSRichard Henderson int mmu_idx, uintptr_t ra) 102a333692cSRichard Henderson { 103a333692cSRichard Henderson return (int16_t)cpu_lduw_be_mmuidx_ra(env, addr, mmu_idx, ra); 104a333692cSRichard Henderson } 105a333692cSRichard Henderson 106a333692cSRichard Henderson static inline uint32_t 107a333692cSRichard Henderson cpu_ldl_be_mmuidx_ra(CPUArchState *env, abi_ptr addr, 108a333692cSRichard Henderson int mmu_idx, uintptr_t ra) 109a333692cSRichard Henderson { 110a333692cSRichard Henderson MemOpIdx oi = make_memop_idx(MO_BEUL | MO_UNALN, mmu_idx); 111a333692cSRichard Henderson return cpu_ldl_mmu(env, addr, oi, ra); 112a333692cSRichard Henderson } 113a333692cSRichard Henderson 114a333692cSRichard Henderson static inline uint64_t 115a333692cSRichard Henderson cpu_ldq_be_mmuidx_ra(CPUArchState *env, abi_ptr addr, 116a333692cSRichard Henderson int mmu_idx, uintptr_t ra) 117a333692cSRichard Henderson { 118a333692cSRichard Henderson MemOpIdx oi = make_memop_idx(MO_BEUQ | MO_UNALN, mmu_idx); 119a333692cSRichard Henderson return cpu_ldq_mmu(env, addr, oi, ra); 120a333692cSRichard Henderson } 121a333692cSRichard Henderson 122a333692cSRichard Henderson static inline uint32_t 123a333692cSRichard Henderson cpu_lduw_le_mmuidx_ra(CPUArchState *env, abi_ptr addr, 124a333692cSRichard Henderson int mmu_idx, uintptr_t ra) 125a333692cSRichard Henderson { 126a333692cSRichard Henderson MemOpIdx oi = make_memop_idx(MO_LEUW | MO_UNALN, mmu_idx); 127a333692cSRichard Henderson return cpu_ldw_mmu(env, addr, oi, ra); 128a333692cSRichard Henderson } 129a333692cSRichard Henderson 130a333692cSRichard Henderson static inline int 131a333692cSRichard Henderson cpu_ldsw_le_mmuidx_ra(CPUArchState *env, abi_ptr addr, 132a333692cSRichard Henderson int mmu_idx, uintptr_t ra) 133a333692cSRichard Henderson { 134a333692cSRichard Henderson return (int16_t)cpu_lduw_le_mmuidx_ra(env, addr, mmu_idx, ra); 135a333692cSRichard Henderson } 136a333692cSRichard Henderson 137a333692cSRichard Henderson static inline uint32_t 138a333692cSRichard Henderson cpu_ldl_le_mmuidx_ra(CPUArchState *env, abi_ptr addr, 139a333692cSRichard Henderson int mmu_idx, uintptr_t ra) 140a333692cSRichard Henderson { 141a333692cSRichard Henderson MemOpIdx oi = make_memop_idx(MO_LEUL | MO_UNALN, mmu_idx); 142a333692cSRichard Henderson return cpu_ldl_mmu(env, addr, oi, ra); 143a333692cSRichard Henderson } 144a333692cSRichard Henderson 145a333692cSRichard Henderson static inline uint64_t 146a333692cSRichard Henderson cpu_ldq_le_mmuidx_ra(CPUArchState *env, abi_ptr addr, 147a333692cSRichard Henderson int mmu_idx, uintptr_t ra) 148a333692cSRichard Henderson { 149a333692cSRichard Henderson MemOpIdx oi = make_memop_idx(MO_LEUQ | MO_UNALN, mmu_idx); 150a333692cSRichard Henderson return cpu_ldq_mmu(env, addr, oi, ra); 151a333692cSRichard Henderson } 152a333692cSRichard Henderson 153a333692cSRichard Henderson static inline void 154a333692cSRichard Henderson cpu_stb_mmuidx_ra(CPUArchState *env, abi_ptr addr, uint32_t val, 155a333692cSRichard Henderson int mmu_idx, uintptr_t ra) 156a333692cSRichard Henderson { 157a333692cSRichard Henderson MemOpIdx oi = make_memop_idx(MO_UB, mmu_idx); 158a333692cSRichard Henderson cpu_stb_mmu(env, addr, val, oi, ra); 159a333692cSRichard Henderson } 160a333692cSRichard Henderson 161a333692cSRichard Henderson static inline void 162a333692cSRichard Henderson cpu_stw_be_mmuidx_ra(CPUArchState *env, abi_ptr addr, uint32_t val, 163a333692cSRichard Henderson int mmu_idx, uintptr_t ra) 164a333692cSRichard Henderson { 165a333692cSRichard Henderson MemOpIdx oi = make_memop_idx(MO_BEUW | MO_UNALN, mmu_idx); 166a333692cSRichard Henderson cpu_stw_mmu(env, addr, val, oi, ra); 167a333692cSRichard Henderson } 168a333692cSRichard Henderson 169a333692cSRichard Henderson static inline void 170a333692cSRichard Henderson cpu_stl_be_mmuidx_ra(CPUArchState *env, abi_ptr addr, uint32_t val, 171a333692cSRichard Henderson int mmu_idx, uintptr_t ra) 172a333692cSRichard Henderson { 173a333692cSRichard Henderson MemOpIdx oi = make_memop_idx(MO_BEUL | MO_UNALN, mmu_idx); 174a333692cSRichard Henderson cpu_stl_mmu(env, addr, val, oi, ra); 175a333692cSRichard Henderson } 176a333692cSRichard Henderson 177a333692cSRichard Henderson static inline void 178a333692cSRichard Henderson cpu_stq_be_mmuidx_ra(CPUArchState *env, abi_ptr addr, uint64_t val, 179a333692cSRichard Henderson int mmu_idx, uintptr_t ra) 180a333692cSRichard Henderson { 181a333692cSRichard Henderson MemOpIdx oi = make_memop_idx(MO_BEUQ | MO_UNALN, mmu_idx); 182a333692cSRichard Henderson cpu_stq_mmu(env, addr, val, oi, ra); 183a333692cSRichard Henderson } 184a333692cSRichard Henderson 185a333692cSRichard Henderson static inline void 186a333692cSRichard Henderson cpu_stw_le_mmuidx_ra(CPUArchState *env, abi_ptr addr, uint32_t val, 187a333692cSRichard Henderson int mmu_idx, uintptr_t ra) 188a333692cSRichard Henderson { 189a333692cSRichard Henderson MemOpIdx oi = make_memop_idx(MO_LEUW | MO_UNALN, mmu_idx); 190a333692cSRichard Henderson cpu_stw_mmu(env, addr, val, oi, ra); 191a333692cSRichard Henderson } 192a333692cSRichard Henderson 193a333692cSRichard Henderson static inline void 194a333692cSRichard Henderson cpu_stl_le_mmuidx_ra(CPUArchState *env, abi_ptr addr, uint32_t val, 195a333692cSRichard Henderson int mmu_idx, uintptr_t ra) 196a333692cSRichard Henderson { 197a333692cSRichard Henderson MemOpIdx oi = make_memop_idx(MO_LEUL | MO_UNALN, mmu_idx); 198a333692cSRichard Henderson cpu_stl_mmu(env, addr, val, oi, ra); 199a333692cSRichard Henderson } 200a333692cSRichard Henderson 201a333692cSRichard Henderson static inline void 202a333692cSRichard Henderson cpu_stq_le_mmuidx_ra(CPUArchState *env, abi_ptr addr, uint64_t val, 203a333692cSRichard Henderson int mmu_idx, uintptr_t ra) 204a333692cSRichard Henderson { 205a333692cSRichard Henderson MemOpIdx oi = make_memop_idx(MO_LEUQ | MO_UNALN, mmu_idx); 206a333692cSRichard Henderson cpu_stq_mmu(env, addr, val, oi, ra); 207a333692cSRichard Henderson } 208f83bcecbSRichard Henderson 209ef6ffba6SRichard Henderson /*--------------------------*/ 210ef6ffba6SRichard Henderson 211ef6ffba6SRichard Henderson static inline uint32_t 212ef6ffba6SRichard Henderson cpu_ldub_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra) 213ef6ffba6SRichard Henderson { 214ef6ffba6SRichard Henderson int mmu_index = cpu_mmu_index(env_cpu(env), false); 215ef6ffba6SRichard Henderson return cpu_ldub_mmuidx_ra(env, addr, mmu_index, ra); 216ef6ffba6SRichard Henderson } 217ef6ffba6SRichard Henderson 218ef6ffba6SRichard Henderson static inline int 219ef6ffba6SRichard Henderson cpu_ldsb_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra) 220ef6ffba6SRichard Henderson { 221ef6ffba6SRichard Henderson return (int8_t)cpu_ldub_data_ra(env, addr, ra); 222ef6ffba6SRichard Henderson } 223ef6ffba6SRichard Henderson 224ef6ffba6SRichard Henderson static inline uint32_t 225ef6ffba6SRichard Henderson cpu_lduw_be_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra) 226ef6ffba6SRichard Henderson { 227ef6ffba6SRichard Henderson int mmu_index = cpu_mmu_index(env_cpu(env), false); 228ef6ffba6SRichard Henderson return cpu_lduw_be_mmuidx_ra(env, addr, mmu_index, ra); 229ef6ffba6SRichard Henderson } 230ef6ffba6SRichard Henderson 231ef6ffba6SRichard Henderson static inline int 232ef6ffba6SRichard Henderson cpu_ldsw_be_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra) 233ef6ffba6SRichard Henderson { 234ef6ffba6SRichard Henderson return (int16_t)cpu_lduw_be_data_ra(env, addr, ra); 235ef6ffba6SRichard Henderson } 236ef6ffba6SRichard Henderson 237ef6ffba6SRichard Henderson static inline uint32_t 238ef6ffba6SRichard Henderson cpu_ldl_be_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra) 239ef6ffba6SRichard Henderson { 240ef6ffba6SRichard Henderson int mmu_index = cpu_mmu_index(env_cpu(env), false); 241ef6ffba6SRichard Henderson return cpu_ldl_be_mmuidx_ra(env, addr, mmu_index, ra); 242ef6ffba6SRichard Henderson } 243ef6ffba6SRichard Henderson 244ef6ffba6SRichard Henderson static inline uint64_t 245ef6ffba6SRichard Henderson cpu_ldq_be_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra) 246ef6ffba6SRichard Henderson { 247ef6ffba6SRichard Henderson int mmu_index = cpu_mmu_index(env_cpu(env), false); 248ef6ffba6SRichard Henderson return cpu_ldq_be_mmuidx_ra(env, addr, mmu_index, ra); 249ef6ffba6SRichard Henderson } 250ef6ffba6SRichard Henderson 251ef6ffba6SRichard Henderson static inline uint32_t 252ef6ffba6SRichard Henderson cpu_lduw_le_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra) 253ef6ffba6SRichard Henderson { 254ef6ffba6SRichard Henderson int mmu_index = cpu_mmu_index(env_cpu(env), false); 255ef6ffba6SRichard Henderson return cpu_lduw_le_mmuidx_ra(env, addr, mmu_index, ra); 256ef6ffba6SRichard Henderson } 257ef6ffba6SRichard Henderson 258ef6ffba6SRichard Henderson static inline int 259ef6ffba6SRichard Henderson cpu_ldsw_le_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra) 260ef6ffba6SRichard Henderson { 261ef6ffba6SRichard Henderson return (int16_t)cpu_lduw_le_data_ra(env, addr, ra); 262ef6ffba6SRichard Henderson } 263ef6ffba6SRichard Henderson 264ef6ffba6SRichard Henderson static inline uint32_t 265ef6ffba6SRichard Henderson cpu_ldl_le_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra) 266ef6ffba6SRichard Henderson { 267ef6ffba6SRichard Henderson int mmu_index = cpu_mmu_index(env_cpu(env), false); 268ef6ffba6SRichard Henderson return cpu_ldl_le_mmuidx_ra(env, addr, mmu_index, ra); 269ef6ffba6SRichard Henderson } 270ef6ffba6SRichard Henderson 271ef6ffba6SRichard Henderson static inline uint64_t 272ef6ffba6SRichard Henderson cpu_ldq_le_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra) 273ef6ffba6SRichard Henderson { 274ef6ffba6SRichard Henderson int mmu_index = cpu_mmu_index(env_cpu(env), false); 275ef6ffba6SRichard Henderson return cpu_ldq_le_mmuidx_ra(env, addr, mmu_index, ra); 276ef6ffba6SRichard Henderson } 277ef6ffba6SRichard Henderson 278ef6ffba6SRichard Henderson static inline void 279ef6ffba6SRichard Henderson cpu_stb_data_ra(CPUArchState *env, abi_ptr addr, uint32_t val, uintptr_t ra) 280ef6ffba6SRichard Henderson { 281ef6ffba6SRichard Henderson int mmu_index = cpu_mmu_index(env_cpu(env), false); 282ef6ffba6SRichard Henderson cpu_stb_mmuidx_ra(env, addr, val, mmu_index, ra); 283ef6ffba6SRichard Henderson } 284ef6ffba6SRichard Henderson 285ef6ffba6SRichard Henderson static inline void 286ef6ffba6SRichard Henderson cpu_stw_be_data_ra(CPUArchState *env, abi_ptr addr, uint32_t val, uintptr_t ra) 287ef6ffba6SRichard Henderson { 288ef6ffba6SRichard Henderson int mmu_index = cpu_mmu_index(env_cpu(env), false); 289ef6ffba6SRichard Henderson cpu_stw_be_mmuidx_ra(env, addr, val, mmu_index, ra); 290ef6ffba6SRichard Henderson } 291ef6ffba6SRichard Henderson 292ef6ffba6SRichard Henderson static inline void 293ef6ffba6SRichard Henderson cpu_stl_be_data_ra(CPUArchState *env, abi_ptr addr, uint32_t val, uintptr_t ra) 294ef6ffba6SRichard Henderson { 295ef6ffba6SRichard Henderson int mmu_index = cpu_mmu_index(env_cpu(env), false); 296ef6ffba6SRichard Henderson cpu_stl_be_mmuidx_ra(env, addr, val, mmu_index, ra); 297ef6ffba6SRichard Henderson } 298ef6ffba6SRichard Henderson 299ef6ffba6SRichard Henderson static inline void 300ef6ffba6SRichard Henderson cpu_stq_be_data_ra(CPUArchState *env, abi_ptr addr, uint64_t val, uintptr_t ra) 301ef6ffba6SRichard Henderson { 302ef6ffba6SRichard Henderson int mmu_index = cpu_mmu_index(env_cpu(env), false); 303ef6ffba6SRichard Henderson cpu_stq_be_mmuidx_ra(env, addr, val, mmu_index, ra); 304ef6ffba6SRichard Henderson } 305ef6ffba6SRichard Henderson 306ef6ffba6SRichard Henderson static inline void 307ef6ffba6SRichard Henderson cpu_stw_le_data_ra(CPUArchState *env, abi_ptr addr, uint32_t val, uintptr_t ra) 308ef6ffba6SRichard Henderson { 309ef6ffba6SRichard Henderson int mmu_index = cpu_mmu_index(env_cpu(env), false); 310ef6ffba6SRichard Henderson cpu_stw_le_mmuidx_ra(env, addr, val, mmu_index, ra); 311ef6ffba6SRichard Henderson } 312ef6ffba6SRichard Henderson 313ef6ffba6SRichard Henderson static inline void 314ef6ffba6SRichard Henderson cpu_stl_le_data_ra(CPUArchState *env, abi_ptr addr, uint32_t val, uintptr_t ra) 315ef6ffba6SRichard Henderson { 316ef6ffba6SRichard Henderson int mmu_index = cpu_mmu_index(env_cpu(env), false); 317ef6ffba6SRichard Henderson cpu_stl_le_mmuidx_ra(env, addr, val, mmu_index, ra); 318ef6ffba6SRichard Henderson } 319ef6ffba6SRichard Henderson 320ef6ffba6SRichard Henderson static inline void 321ef6ffba6SRichard Henderson cpu_stq_le_data_ra(CPUArchState *env, abi_ptr addr, uint64_t val, uintptr_t ra) 322ef6ffba6SRichard Henderson { 323ef6ffba6SRichard Henderson int mmu_index = cpu_mmu_index(env_cpu(env), false); 324ef6ffba6SRichard Henderson cpu_stq_le_mmuidx_ra(env, addr, val, mmu_index, ra); 325ef6ffba6SRichard Henderson } 326ef6ffba6SRichard Henderson 3270a29f116SRichard Henderson /*--------------------------*/ 3280a29f116SRichard Henderson 3290a29f116SRichard Henderson static inline uint32_t 3300a29f116SRichard Henderson cpu_ldub_data(CPUArchState *env, abi_ptr addr) 3310a29f116SRichard Henderson { 3320a29f116SRichard Henderson return cpu_ldub_data_ra(env, addr, 0); 3330a29f116SRichard Henderson } 3340a29f116SRichard Henderson 3350a29f116SRichard Henderson static inline int 3360a29f116SRichard Henderson cpu_ldsb_data(CPUArchState *env, abi_ptr addr) 3370a29f116SRichard Henderson { 3380a29f116SRichard Henderson return (int8_t)cpu_ldub_data(env, addr); 3390a29f116SRichard Henderson } 3400a29f116SRichard Henderson 3410a29f116SRichard Henderson static inline uint32_t 3420a29f116SRichard Henderson cpu_lduw_be_data(CPUArchState *env, abi_ptr addr) 3430a29f116SRichard Henderson { 3440a29f116SRichard Henderson return cpu_lduw_be_data_ra(env, addr, 0); 3450a29f116SRichard Henderson } 3460a29f116SRichard Henderson 3470a29f116SRichard Henderson static inline int 3480a29f116SRichard Henderson cpu_ldsw_be_data(CPUArchState *env, abi_ptr addr) 3490a29f116SRichard Henderson { 3500a29f116SRichard Henderson return (int16_t)cpu_lduw_be_data(env, addr); 3510a29f116SRichard Henderson } 3520a29f116SRichard Henderson 3530a29f116SRichard Henderson static inline uint32_t 3540a29f116SRichard Henderson cpu_ldl_be_data(CPUArchState *env, abi_ptr addr) 3550a29f116SRichard Henderson { 3560a29f116SRichard Henderson return cpu_ldl_be_data_ra(env, addr, 0); 3570a29f116SRichard Henderson } 3580a29f116SRichard Henderson 3590a29f116SRichard Henderson static inline uint64_t 3600a29f116SRichard Henderson cpu_ldq_be_data(CPUArchState *env, abi_ptr addr) 3610a29f116SRichard Henderson { 3620a29f116SRichard Henderson return cpu_ldq_be_data_ra(env, addr, 0); 3630a29f116SRichard Henderson } 3640a29f116SRichard Henderson 3650a29f116SRichard Henderson static inline uint32_t 3660a29f116SRichard Henderson cpu_lduw_le_data(CPUArchState *env, abi_ptr addr) 3670a29f116SRichard Henderson { 3680a29f116SRichard Henderson return cpu_lduw_le_data_ra(env, addr, 0); 3690a29f116SRichard Henderson } 3700a29f116SRichard Henderson 3710a29f116SRichard Henderson static inline int 3720a29f116SRichard Henderson cpu_ldsw_le_data(CPUArchState *env, abi_ptr addr) 3730a29f116SRichard Henderson { 3740a29f116SRichard Henderson return (int16_t)cpu_lduw_le_data(env, addr); 3750a29f116SRichard Henderson } 3760a29f116SRichard Henderson 3770a29f116SRichard Henderson static inline uint32_t 3780a29f116SRichard Henderson cpu_ldl_le_data(CPUArchState *env, abi_ptr addr) 3790a29f116SRichard Henderson { 3800a29f116SRichard Henderson return cpu_ldl_le_data_ra(env, addr, 0); 3810a29f116SRichard Henderson } 3820a29f116SRichard Henderson 3830a29f116SRichard Henderson static inline uint64_t 3840a29f116SRichard Henderson cpu_ldq_le_data(CPUArchState *env, abi_ptr addr) 3850a29f116SRichard Henderson { 3860a29f116SRichard Henderson return cpu_ldq_le_data_ra(env, addr, 0); 3870a29f116SRichard Henderson } 3880a29f116SRichard Henderson 3890a29f116SRichard Henderson static inline void 3900a29f116SRichard Henderson cpu_stb_data(CPUArchState *env, abi_ptr addr, uint32_t val) 3910a29f116SRichard Henderson { 3920a29f116SRichard Henderson cpu_stb_data_ra(env, addr, val, 0); 3930a29f116SRichard Henderson } 3940a29f116SRichard Henderson 3950a29f116SRichard Henderson static inline void 3960a29f116SRichard Henderson cpu_stw_be_data(CPUArchState *env, abi_ptr addr, uint32_t val) 3970a29f116SRichard Henderson { 3980a29f116SRichard Henderson cpu_stw_be_data_ra(env, addr, val, 0); 3990a29f116SRichard Henderson } 4000a29f116SRichard Henderson 4010a29f116SRichard Henderson static inline void 4020a29f116SRichard Henderson cpu_stl_be_data(CPUArchState *env, abi_ptr addr, uint32_t val) 4030a29f116SRichard Henderson { 4040a29f116SRichard Henderson cpu_stl_be_data_ra(env, addr, val, 0); 4050a29f116SRichard Henderson } 4060a29f116SRichard Henderson 4070a29f116SRichard Henderson static inline void 4080a29f116SRichard Henderson cpu_stq_be_data(CPUArchState *env, abi_ptr addr, uint64_t val) 4090a29f116SRichard Henderson { 4100a29f116SRichard Henderson cpu_stq_be_data_ra(env, addr, val, 0); 4110a29f116SRichard Henderson } 4120a29f116SRichard Henderson 4130a29f116SRichard Henderson static inline void 4140a29f116SRichard Henderson cpu_stw_le_data(CPUArchState *env, abi_ptr addr, uint32_t val) 4150a29f116SRichard Henderson { 4160a29f116SRichard Henderson cpu_stw_le_data_ra(env, addr, val, 0); 4170a29f116SRichard Henderson } 4180a29f116SRichard Henderson 4190a29f116SRichard Henderson static inline void 4200a29f116SRichard Henderson cpu_stl_le_data(CPUArchState *env, abi_ptr addr, uint32_t val) 4210a29f116SRichard Henderson { 4220a29f116SRichard Henderson cpu_stl_le_data_ra(env, addr, val, 0); 4230a29f116SRichard Henderson } 4240a29f116SRichard Henderson 4250a29f116SRichard Henderson static inline void 4260a29f116SRichard Henderson cpu_stq_le_data(CPUArchState *env, abi_ptr addr, uint64_t val) 4270a29f116SRichard Henderson { 4280a29f116SRichard Henderson cpu_stq_le_data_ra(env, addr, val, 0); 4290a29f116SRichard Henderson } 4300a29f116SRichard Henderson 431ee3eb3a7SMarc-André Lureau #if TARGET_BIG_ENDIAN 432b9e60257SRichard Henderson # define cpu_lduw_data cpu_lduw_be_data 433b9e60257SRichard Henderson # define cpu_ldsw_data cpu_ldsw_be_data 434b9e60257SRichard Henderson # define cpu_ldl_data cpu_ldl_be_data 435b9e60257SRichard Henderson # define cpu_ldq_data cpu_ldq_be_data 436b9e60257SRichard Henderson # define cpu_lduw_data_ra cpu_lduw_be_data_ra 437b9e60257SRichard Henderson # define cpu_ldsw_data_ra cpu_ldsw_be_data_ra 438b9e60257SRichard Henderson # define cpu_ldl_data_ra cpu_ldl_be_data_ra 439b9e60257SRichard Henderson # define cpu_ldq_data_ra cpu_ldq_be_data_ra 440b9e60257SRichard Henderson # define cpu_lduw_mmuidx_ra cpu_lduw_be_mmuidx_ra 441b9e60257SRichard Henderson # define cpu_ldsw_mmuidx_ra cpu_ldsw_be_mmuidx_ra 442b9e60257SRichard Henderson # define cpu_ldl_mmuidx_ra cpu_ldl_be_mmuidx_ra 443b9e60257SRichard Henderson # define cpu_ldq_mmuidx_ra cpu_ldq_be_mmuidx_ra 444b9e60257SRichard Henderson # define cpu_stw_data cpu_stw_be_data 445b9e60257SRichard Henderson # define cpu_stl_data cpu_stl_be_data 446b9e60257SRichard Henderson # define cpu_stq_data cpu_stq_be_data 447b9e60257SRichard Henderson # define cpu_stw_data_ra cpu_stw_be_data_ra 448b9e60257SRichard Henderson # define cpu_stl_data_ra cpu_stl_be_data_ra 449b9e60257SRichard Henderson # define cpu_stq_data_ra cpu_stq_be_data_ra 450b9e60257SRichard Henderson # define cpu_stw_mmuidx_ra cpu_stw_be_mmuidx_ra 451b9e60257SRichard Henderson # define cpu_stl_mmuidx_ra cpu_stl_be_mmuidx_ra 452b9e60257SRichard Henderson # define cpu_stq_mmuidx_ra cpu_stq_be_mmuidx_ra 453b9e60257SRichard Henderson #else 454b9e60257SRichard Henderson # define cpu_lduw_data cpu_lduw_le_data 455b9e60257SRichard Henderson # define cpu_ldsw_data cpu_ldsw_le_data 456b9e60257SRichard Henderson # define cpu_ldl_data cpu_ldl_le_data 457b9e60257SRichard Henderson # define cpu_ldq_data cpu_ldq_le_data 458b9e60257SRichard Henderson # define cpu_lduw_data_ra cpu_lduw_le_data_ra 459b9e60257SRichard Henderson # define cpu_ldsw_data_ra cpu_ldsw_le_data_ra 460b9e60257SRichard Henderson # define cpu_ldl_data_ra cpu_ldl_le_data_ra 461b9e60257SRichard Henderson # define cpu_ldq_data_ra cpu_ldq_le_data_ra 462b9e60257SRichard Henderson # define cpu_lduw_mmuidx_ra cpu_lduw_le_mmuidx_ra 463b9e60257SRichard Henderson # define cpu_ldsw_mmuidx_ra cpu_ldsw_le_mmuidx_ra 464b9e60257SRichard Henderson # define cpu_ldl_mmuidx_ra cpu_ldl_le_mmuidx_ra 465b9e60257SRichard Henderson # define cpu_ldq_mmuidx_ra cpu_ldq_le_mmuidx_ra 466b9e60257SRichard Henderson # define cpu_stw_data cpu_stw_le_data 467b9e60257SRichard Henderson # define cpu_stl_data cpu_stl_le_data 468b9e60257SRichard Henderson # define cpu_stq_data cpu_stq_le_data 469b9e60257SRichard Henderson # define cpu_stw_data_ra cpu_stw_le_data_ra 470b9e60257SRichard Henderson # define cpu_stl_data_ra cpu_stl_le_data_ra 471b9e60257SRichard Henderson # define cpu_stq_data_ra cpu_stq_le_data_ra 472b9e60257SRichard Henderson # define cpu_stw_mmuidx_ra cpu_stw_le_mmuidx_ra 473b9e60257SRichard Henderson # define cpu_stl_mmuidx_ra cpu_stl_le_mmuidx_ra 474b9e60257SRichard Henderson # define cpu_stq_mmuidx_ra cpu_stq_le_mmuidx_ra 475b9e60257SRichard Henderson #endif 476b9e60257SRichard Henderson 4774ba597c1SRichard Henderson static inline uint32_t cpu_ldub_code(CPUArchState *env, abi_ptr addr) 4784ba597c1SRichard Henderson { 4794ba597c1SRichard Henderson CPUState *cs = env_cpu(env); 4804ba597c1SRichard Henderson MemOpIdx oi = make_memop_idx(MO_UB, cpu_mmu_index(cs, true)); 4814ba597c1SRichard Henderson return cpu_ldb_code_mmu(env, addr, oi, 0); 4824ba597c1SRichard Henderson } 4834ba597c1SRichard Henderson 4844ba597c1SRichard Henderson static inline uint32_t cpu_lduw_code(CPUArchState *env, abi_ptr addr) 4854ba597c1SRichard Henderson { 4864ba597c1SRichard Henderson CPUState *cs = env_cpu(env); 4874ba597c1SRichard Henderson MemOpIdx oi = make_memop_idx(MO_TEUW, cpu_mmu_index(cs, true)); 4884ba597c1SRichard Henderson return cpu_ldw_code_mmu(env, addr, oi, 0); 4894ba597c1SRichard Henderson } 4904ba597c1SRichard Henderson 4914ba597c1SRichard Henderson static inline uint32_t cpu_ldl_code(CPUArchState *env, abi_ptr addr) 4924ba597c1SRichard Henderson { 4934ba597c1SRichard Henderson CPUState *cs = env_cpu(env); 4944ba597c1SRichard Henderson MemOpIdx oi = make_memop_idx(MO_TEUL, cpu_mmu_index(cs, true)); 4954ba597c1SRichard Henderson return cpu_ldl_code_mmu(env, addr, oi, 0); 4964ba597c1SRichard Henderson } 4974ba597c1SRichard Henderson 4984ba597c1SRichard Henderson static inline uint64_t cpu_ldq_code(CPUArchState *env, abi_ptr addr) 4994ba597c1SRichard Henderson { 5004ba597c1SRichard Henderson CPUState *cs = env_cpu(env); 5014ba597c1SRichard Henderson MemOpIdx oi = make_memop_idx(MO_TEUQ, cpu_mmu_index(cs, true)); 5024ba597c1SRichard Henderson return cpu_ldq_code_mmu(env, addr, oi, 0); 5034ba597c1SRichard Henderson } 504c773828aSPaolo Bonzini 505c773828aSPaolo Bonzini /** 506c773828aSPaolo Bonzini * tlb_vaddr_to_host: 507c773828aSPaolo Bonzini * @env: CPUArchState 508c773828aSPaolo Bonzini * @addr: guest virtual address to look up 509c773828aSPaolo Bonzini * @access_type: 0 for read, 1 for write, 2 for execute 510c773828aSPaolo Bonzini * @mmu_idx: MMU index to use for lookup 511c773828aSPaolo Bonzini * 512c773828aSPaolo Bonzini * Look up the specified guest virtual index in the TCG softmmu TLB. 5134811e909SRichard Henderson * If we can translate a host virtual address suitable for direct RAM 5144811e909SRichard Henderson * access, without causing a guest exception, then return it. 5154811e909SRichard Henderson * Otherwise (TLB entry is for an I/O access, guest software 5164811e909SRichard Henderson * TLB fill required, etc) return NULL. 517c773828aSPaolo Bonzini */ 5184811e909SRichard Henderson #ifdef CONFIG_USER_ONLY 5193e23de15SLaurent Vivier static inline void *tlb_vaddr_to_host(CPUArchState *env, abi_ptr addr, 5204811e909SRichard Henderson MMUAccessType access_type, int mmu_idx) 521c773828aSPaolo Bonzini { 5223e8f1628SRichard Henderson return g2h(env_cpu(env), addr); 5234811e909SRichard Henderson } 5242e83c496SAurelien Jarno #else 5259c6e54f4SPhilippe Mathieu-Daudé void *tlb_vaddr_to_host(CPUArchState *env, vaddr addr, 5264811e909SRichard Henderson MMUAccessType access_type, int mmu_idx); 5274811e909SRichard Henderson #endif 528c773828aSPaolo Bonzini 5293d75856dSRichard Henderson /* 5303d75856dSRichard Henderson * For user-only, helpers that use guest to host address translation 5313d75856dSRichard Henderson * must protect the actual host memory access by recording 'retaddr' 5323d75856dSRichard Henderson * for the signal handler. This is required for a race condition in 5333d75856dSRichard Henderson * which another thread unmaps the page between a probe and the 5343d75856dSRichard Henderson * actual access. 5353d75856dSRichard Henderson */ 5363d75856dSRichard Henderson #ifdef CONFIG_USER_ONLY 5373d75856dSRichard Henderson extern __thread uintptr_t helper_retaddr; 5383d75856dSRichard Henderson 5393d75856dSRichard Henderson static inline void set_helper_retaddr(uintptr_t ra) 5403d75856dSRichard Henderson { 5413d75856dSRichard Henderson helper_retaddr = ra; 5423d75856dSRichard Henderson /* 5433d75856dSRichard Henderson * Ensure that this write is visible to the SIGSEGV handler that 5443d75856dSRichard Henderson * may be invoked due to a subsequent invalid memory operation. 5453d75856dSRichard Henderson */ 5463d75856dSRichard Henderson signal_barrier(); 5473d75856dSRichard Henderson } 5483d75856dSRichard Henderson 5493d75856dSRichard Henderson static inline void clear_helper_retaddr(void) 5503d75856dSRichard Henderson { 5513d75856dSRichard Henderson /* 5523d75856dSRichard Henderson * Ensure that previous memory operations have succeeded before 5533d75856dSRichard Henderson * removing the data visible to the signal handler. 5543d75856dSRichard Henderson */ 5553d75856dSRichard Henderson signal_barrier(); 5563d75856dSRichard Henderson helper_retaddr = 0; 5573d75856dSRichard Henderson } 5583d75856dSRichard Henderson #else 5593d75856dSRichard Henderson #define set_helper_retaddr(ra) do { } while (0) 5603d75856dSRichard Henderson #define clear_helper_retaddr() do { } while (0) 5613d75856dSRichard Henderson #endif 5623d75856dSRichard Henderson 563*42fa9665SPhilippe Mathieu-Daudé #endif /* ACCEL_TCG_CPU_LDST_H */ 564