1*42fa9665SPhilippe Mathieu-Daudé /* 2*42fa9665SPhilippe Mathieu-Daudé * Software MMU support (per-target) 3*42fa9665SPhilippe Mathieu-Daudé * 4*42fa9665SPhilippe Mathieu-Daudé * This library is free software; you can redistribute it and/or 5*42fa9665SPhilippe Mathieu-Daudé * modify it under the terms of the GNU Lesser General Public 6*42fa9665SPhilippe Mathieu-Daudé * License as published by the Free Software Foundation; either 7*42fa9665SPhilippe Mathieu-Daudé * version 2.1 of the License, or (at your option) any later version. 8*42fa9665SPhilippe Mathieu-Daudé * 9*42fa9665SPhilippe Mathieu-Daudé * This library is distributed in the hope that it will be useful, 10*42fa9665SPhilippe Mathieu-Daudé * but WITHOUT ANY WARRANTY; without even the implied warranty of 11*42fa9665SPhilippe Mathieu-Daudé * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12*42fa9665SPhilippe Mathieu-Daudé * Lesser General Public License for more details. 13*42fa9665SPhilippe Mathieu-Daudé * 14*42fa9665SPhilippe Mathieu-Daudé * You should have received a copy of the GNU Lesser General Public 15*42fa9665SPhilippe Mathieu-Daudé * License along with this library; if not, see <http://www.gnu.org/licenses/>. 16*42fa9665SPhilippe Mathieu-Daudé * 17*42fa9665SPhilippe Mathieu-Daudé */ 18*42fa9665SPhilippe Mathieu-Daudé 19*42fa9665SPhilippe Mathieu-Daudé /* 20*42fa9665SPhilippe Mathieu-Daudé * Generate inline load/store functions for all MMU modes (typically 21*42fa9665SPhilippe Mathieu-Daudé * at least _user and _kernel) as well as _data versions, for all data 22*42fa9665SPhilippe Mathieu-Daudé * sizes. 23*42fa9665SPhilippe Mathieu-Daudé * 24*42fa9665SPhilippe Mathieu-Daudé * Used by target op helpers. 25*42fa9665SPhilippe Mathieu-Daudé * 26*42fa9665SPhilippe Mathieu-Daudé * The syntax for the accessors is: 27*42fa9665SPhilippe Mathieu-Daudé * 28*42fa9665SPhilippe Mathieu-Daudé * load: cpu_ld{sign}{size}{end}_{mmusuffix}(env, ptr) 29*42fa9665SPhilippe Mathieu-Daudé * cpu_ld{sign}{size}{end}_{mmusuffix}_ra(env, ptr, retaddr) 30*42fa9665SPhilippe Mathieu-Daudé * cpu_ld{sign}{size}{end}_mmuidx_ra(env, ptr, mmu_idx, retaddr) 31*42fa9665SPhilippe Mathieu-Daudé * cpu_ld{sign}{size}{end}_mmu(env, ptr, oi, retaddr) 32*42fa9665SPhilippe Mathieu-Daudé * 33*42fa9665SPhilippe Mathieu-Daudé * store: cpu_st{size}{end}_{mmusuffix}(env, ptr, val) 34*42fa9665SPhilippe Mathieu-Daudé * cpu_st{size}{end}_{mmusuffix}_ra(env, ptr, val, retaddr) 35*42fa9665SPhilippe Mathieu-Daudé * cpu_st{size}{end}_mmuidx_ra(env, ptr, val, mmu_idx, retaddr) 36*42fa9665SPhilippe Mathieu-Daudé * cpu_st{size}{end}_mmu(env, ptr, val, oi, retaddr) 37*42fa9665SPhilippe Mathieu-Daudé * 38*42fa9665SPhilippe Mathieu-Daudé * sign is: 39*42fa9665SPhilippe Mathieu-Daudé * (empty): for 32 and 64 bit sizes 40*42fa9665SPhilippe Mathieu-Daudé * u : unsigned 41*42fa9665SPhilippe Mathieu-Daudé * s : signed 42*42fa9665SPhilippe Mathieu-Daudé * 43*42fa9665SPhilippe Mathieu-Daudé * size is: 44*42fa9665SPhilippe Mathieu-Daudé * b: 8 bits 45*42fa9665SPhilippe Mathieu-Daudé * w: 16 bits 46*42fa9665SPhilippe Mathieu-Daudé * l: 32 bits 47*42fa9665SPhilippe Mathieu-Daudé * q: 64 bits 48*42fa9665SPhilippe Mathieu-Daudé * 49*42fa9665SPhilippe Mathieu-Daudé * end is: 50*42fa9665SPhilippe Mathieu-Daudé * (empty): for target native endian, or for 8 bit access 51*42fa9665SPhilippe Mathieu-Daudé * _be: for forced big endian 52*42fa9665SPhilippe Mathieu-Daudé * _le: for forced little endian 53*42fa9665SPhilippe Mathieu-Daudé * 54*42fa9665SPhilippe Mathieu-Daudé * mmusuffix is one of the generic suffixes "data" or "code", or "mmuidx". 55*42fa9665SPhilippe Mathieu-Daudé * The "mmuidx" suffix carries an extra mmu_idx argument that specifies 56*42fa9665SPhilippe Mathieu-Daudé * the index to use; the "data" and "code" suffixes take the index from 57*42fa9665SPhilippe Mathieu-Daudé * cpu_mmu_index(). 58*42fa9665SPhilippe Mathieu-Daudé * 59*42fa9665SPhilippe Mathieu-Daudé * The "mmu" suffix carries the full MemOpIdx, with both mmu_idx and the 60*42fa9665SPhilippe Mathieu-Daudé * MemOp including alignment requirements. The alignment will be enforced. 61*42fa9665SPhilippe Mathieu-Daudé */ 62*42fa9665SPhilippe Mathieu-Daudé #ifndef ACCEL_TCG_CPU_LDST_H 63*42fa9665SPhilippe Mathieu-Daudé #define ACCEL_TCG_CPU_LDST_H 64*42fa9665SPhilippe Mathieu-Daudé 65*42fa9665SPhilippe Mathieu-Daudé #ifndef CONFIG_TCG 66*42fa9665SPhilippe Mathieu-Daudé #error Can only include this header with TCG 67*42fa9665SPhilippe Mathieu-Daudé #endif 68*42fa9665SPhilippe Mathieu-Daudé 69*42fa9665SPhilippe Mathieu-Daudé #include "exec/cpu-common.h" 70*42fa9665SPhilippe Mathieu-Daudé #include "accel/tcg/cpu-ldst-common.h" 71*42fa9665SPhilippe Mathieu-Daudé #include "accel/tcg/cpu-mmu-index.h" 72*42fa9665SPhilippe Mathieu-Daudé #include "exec/abi_ptr.h" 73*42fa9665SPhilippe Mathieu-Daudé 74*42fa9665SPhilippe Mathieu-Daudé #if defined(CONFIG_USER_ONLY) 75*42fa9665SPhilippe Mathieu-Daudé #include "user/guest-host.h" 76*42fa9665SPhilippe Mathieu-Daudé #endif /* CONFIG_USER_ONLY */ 77*42fa9665SPhilippe Mathieu-Daudé 78*42fa9665SPhilippe Mathieu-Daudé static inline uint32_t 79*42fa9665SPhilippe Mathieu-Daudé cpu_ldub_mmuidx_ra(CPUArchState *env, abi_ptr addr, int mmu_idx, uintptr_t ra) 80*42fa9665SPhilippe Mathieu-Daudé { 81*42fa9665SPhilippe Mathieu-Daudé MemOpIdx oi = make_memop_idx(MO_UB, mmu_idx); 82*42fa9665SPhilippe Mathieu-Daudé return cpu_ldb_mmu(env, addr, oi, ra); 83*42fa9665SPhilippe Mathieu-Daudé } 84*42fa9665SPhilippe Mathieu-Daudé 85*42fa9665SPhilippe Mathieu-Daudé static inline int 86*42fa9665SPhilippe Mathieu-Daudé cpu_ldsb_mmuidx_ra(CPUArchState *env, abi_ptr addr, int mmu_idx, uintptr_t ra) 87*42fa9665SPhilippe Mathieu-Daudé { 88*42fa9665SPhilippe Mathieu-Daudé return (int8_t)cpu_ldub_mmuidx_ra(env, addr, mmu_idx, ra); 89*42fa9665SPhilippe Mathieu-Daudé } 90*42fa9665SPhilippe Mathieu-Daudé 91*42fa9665SPhilippe Mathieu-Daudé static inline uint32_t 92*42fa9665SPhilippe Mathieu-Daudé cpu_lduw_be_mmuidx_ra(CPUArchState *env, abi_ptr addr, 93*42fa9665SPhilippe Mathieu-Daudé int mmu_idx, uintptr_t ra) 94*42fa9665SPhilippe Mathieu-Daudé { 95*42fa9665SPhilippe Mathieu-Daudé MemOpIdx oi = make_memop_idx(MO_BEUW | MO_UNALN, mmu_idx); 96*42fa9665SPhilippe Mathieu-Daudé return cpu_ldw_mmu(env, addr, oi, ra); 97*42fa9665SPhilippe Mathieu-Daudé } 98*42fa9665SPhilippe Mathieu-Daudé 99*42fa9665SPhilippe Mathieu-Daudé static inline int 100*42fa9665SPhilippe Mathieu-Daudé cpu_ldsw_be_mmuidx_ra(CPUArchState *env, abi_ptr addr, 101*42fa9665SPhilippe Mathieu-Daudé int mmu_idx, uintptr_t ra) 102*42fa9665SPhilippe Mathieu-Daudé { 103*42fa9665SPhilippe Mathieu-Daudé return (int16_t)cpu_lduw_be_mmuidx_ra(env, addr, mmu_idx, ra); 104*42fa9665SPhilippe Mathieu-Daudé } 105*42fa9665SPhilippe Mathieu-Daudé 106*42fa9665SPhilippe Mathieu-Daudé static inline uint32_t 107*42fa9665SPhilippe Mathieu-Daudé cpu_ldl_be_mmuidx_ra(CPUArchState *env, abi_ptr addr, 108*42fa9665SPhilippe Mathieu-Daudé int mmu_idx, uintptr_t ra) 109*42fa9665SPhilippe Mathieu-Daudé { 110*42fa9665SPhilippe Mathieu-Daudé MemOpIdx oi = make_memop_idx(MO_BEUL | MO_UNALN, mmu_idx); 111*42fa9665SPhilippe Mathieu-Daudé return cpu_ldl_mmu(env, addr, oi, ra); 112*42fa9665SPhilippe Mathieu-Daudé } 113*42fa9665SPhilippe Mathieu-Daudé 114*42fa9665SPhilippe Mathieu-Daudé static inline uint64_t 115*42fa9665SPhilippe Mathieu-Daudé cpu_ldq_be_mmuidx_ra(CPUArchState *env, abi_ptr addr, 116*42fa9665SPhilippe Mathieu-Daudé int mmu_idx, uintptr_t ra) 117*42fa9665SPhilippe Mathieu-Daudé { 118*42fa9665SPhilippe Mathieu-Daudé MemOpIdx oi = make_memop_idx(MO_BEUQ | MO_UNALN, mmu_idx); 119*42fa9665SPhilippe Mathieu-Daudé return cpu_ldq_mmu(env, addr, oi, ra); 120*42fa9665SPhilippe Mathieu-Daudé } 121*42fa9665SPhilippe Mathieu-Daudé 122*42fa9665SPhilippe Mathieu-Daudé static inline uint32_t 123*42fa9665SPhilippe Mathieu-Daudé cpu_lduw_le_mmuidx_ra(CPUArchState *env, abi_ptr addr, 124*42fa9665SPhilippe Mathieu-Daudé int mmu_idx, uintptr_t ra) 125*42fa9665SPhilippe Mathieu-Daudé { 126*42fa9665SPhilippe Mathieu-Daudé MemOpIdx oi = make_memop_idx(MO_LEUW | MO_UNALN, mmu_idx); 127*42fa9665SPhilippe Mathieu-Daudé return cpu_ldw_mmu(env, addr, oi, ra); 128*42fa9665SPhilippe Mathieu-Daudé } 129*42fa9665SPhilippe Mathieu-Daudé 130*42fa9665SPhilippe Mathieu-Daudé static inline int 131*42fa9665SPhilippe Mathieu-Daudé cpu_ldsw_le_mmuidx_ra(CPUArchState *env, abi_ptr addr, 132*42fa9665SPhilippe Mathieu-Daudé int mmu_idx, uintptr_t ra) 133*42fa9665SPhilippe Mathieu-Daudé { 134*42fa9665SPhilippe Mathieu-Daudé return (int16_t)cpu_lduw_le_mmuidx_ra(env, addr, mmu_idx, ra); 135*42fa9665SPhilippe Mathieu-Daudé } 136*42fa9665SPhilippe Mathieu-Daudé 137*42fa9665SPhilippe Mathieu-Daudé static inline uint32_t 138*42fa9665SPhilippe Mathieu-Daudé cpu_ldl_le_mmuidx_ra(CPUArchState *env, abi_ptr addr, 139*42fa9665SPhilippe Mathieu-Daudé int mmu_idx, uintptr_t ra) 140*42fa9665SPhilippe Mathieu-Daudé { 141*42fa9665SPhilippe Mathieu-Daudé MemOpIdx oi = make_memop_idx(MO_LEUL | MO_UNALN, mmu_idx); 142*42fa9665SPhilippe Mathieu-Daudé return cpu_ldl_mmu(env, addr, oi, ra); 143*42fa9665SPhilippe Mathieu-Daudé } 144*42fa9665SPhilippe Mathieu-Daudé 145*42fa9665SPhilippe Mathieu-Daudé static inline uint64_t 146*42fa9665SPhilippe Mathieu-Daudé cpu_ldq_le_mmuidx_ra(CPUArchState *env, abi_ptr addr, 147*42fa9665SPhilippe Mathieu-Daudé int mmu_idx, uintptr_t ra) 148*42fa9665SPhilippe Mathieu-Daudé { 149*42fa9665SPhilippe Mathieu-Daudé MemOpIdx oi = make_memop_idx(MO_LEUQ | MO_UNALN, mmu_idx); 150*42fa9665SPhilippe Mathieu-Daudé return cpu_ldq_mmu(env, addr, oi, ra); 151*42fa9665SPhilippe Mathieu-Daudé } 152*42fa9665SPhilippe Mathieu-Daudé 153*42fa9665SPhilippe Mathieu-Daudé static inline void 154*42fa9665SPhilippe Mathieu-Daudé cpu_stb_mmuidx_ra(CPUArchState *env, abi_ptr addr, uint32_t val, 155*42fa9665SPhilippe Mathieu-Daudé int mmu_idx, uintptr_t ra) 156*42fa9665SPhilippe Mathieu-Daudé { 157*42fa9665SPhilippe Mathieu-Daudé MemOpIdx oi = make_memop_idx(MO_UB, mmu_idx); 158*42fa9665SPhilippe Mathieu-Daudé cpu_stb_mmu(env, addr, val, oi, ra); 159*42fa9665SPhilippe Mathieu-Daudé } 160*42fa9665SPhilippe Mathieu-Daudé 161*42fa9665SPhilippe Mathieu-Daudé static inline void 162*42fa9665SPhilippe Mathieu-Daudé cpu_stw_be_mmuidx_ra(CPUArchState *env, abi_ptr addr, uint32_t val, 163*42fa9665SPhilippe Mathieu-Daudé int mmu_idx, uintptr_t ra) 164*42fa9665SPhilippe Mathieu-Daudé { 165*42fa9665SPhilippe Mathieu-Daudé MemOpIdx oi = make_memop_idx(MO_BEUW | MO_UNALN, mmu_idx); 166*42fa9665SPhilippe Mathieu-Daudé cpu_stw_mmu(env, addr, val, oi, ra); 167*42fa9665SPhilippe Mathieu-Daudé } 168*42fa9665SPhilippe Mathieu-Daudé 169*42fa9665SPhilippe Mathieu-Daudé static inline void 170*42fa9665SPhilippe Mathieu-Daudé cpu_stl_be_mmuidx_ra(CPUArchState *env, abi_ptr addr, uint32_t val, 171*42fa9665SPhilippe Mathieu-Daudé int mmu_idx, uintptr_t ra) 172*42fa9665SPhilippe Mathieu-Daudé { 173*42fa9665SPhilippe Mathieu-Daudé MemOpIdx oi = make_memop_idx(MO_BEUL | MO_UNALN, mmu_idx); 174*42fa9665SPhilippe Mathieu-Daudé cpu_stl_mmu(env, addr, val, oi, ra); 175*42fa9665SPhilippe Mathieu-Daudé } 176*42fa9665SPhilippe Mathieu-Daudé 177*42fa9665SPhilippe Mathieu-Daudé static inline void 178*42fa9665SPhilippe Mathieu-Daudé cpu_stq_be_mmuidx_ra(CPUArchState *env, abi_ptr addr, uint64_t val, 179*42fa9665SPhilippe Mathieu-Daudé int mmu_idx, uintptr_t ra) 180*42fa9665SPhilippe Mathieu-Daudé { 181*42fa9665SPhilippe Mathieu-Daudé MemOpIdx oi = make_memop_idx(MO_BEUQ | MO_UNALN, mmu_idx); 182*42fa9665SPhilippe Mathieu-Daudé cpu_stq_mmu(env, addr, val, oi, ra); 183*42fa9665SPhilippe Mathieu-Daudé } 184*42fa9665SPhilippe Mathieu-Daudé 185*42fa9665SPhilippe Mathieu-Daudé static inline void 186*42fa9665SPhilippe Mathieu-Daudé cpu_stw_le_mmuidx_ra(CPUArchState *env, abi_ptr addr, uint32_t val, 187*42fa9665SPhilippe Mathieu-Daudé int mmu_idx, uintptr_t ra) 188*42fa9665SPhilippe Mathieu-Daudé { 189*42fa9665SPhilippe Mathieu-Daudé MemOpIdx oi = make_memop_idx(MO_LEUW | MO_UNALN, mmu_idx); 190*42fa9665SPhilippe Mathieu-Daudé cpu_stw_mmu(env, addr, val, oi, ra); 191*42fa9665SPhilippe Mathieu-Daudé } 192*42fa9665SPhilippe Mathieu-Daudé 193*42fa9665SPhilippe Mathieu-Daudé static inline void 194*42fa9665SPhilippe Mathieu-Daudé cpu_stl_le_mmuidx_ra(CPUArchState *env, abi_ptr addr, uint32_t val, 195*42fa9665SPhilippe Mathieu-Daudé int mmu_idx, uintptr_t ra) 196*42fa9665SPhilippe Mathieu-Daudé { 197*42fa9665SPhilippe Mathieu-Daudé MemOpIdx oi = make_memop_idx(MO_LEUL | MO_UNALN, mmu_idx); 198*42fa9665SPhilippe Mathieu-Daudé cpu_stl_mmu(env, addr, val, oi, ra); 199*42fa9665SPhilippe Mathieu-Daudé } 200*42fa9665SPhilippe Mathieu-Daudé 201*42fa9665SPhilippe Mathieu-Daudé static inline void 202*42fa9665SPhilippe Mathieu-Daudé cpu_stq_le_mmuidx_ra(CPUArchState *env, abi_ptr addr, uint64_t val, 203*42fa9665SPhilippe Mathieu-Daudé int mmu_idx, uintptr_t ra) 204*42fa9665SPhilippe Mathieu-Daudé { 205*42fa9665SPhilippe Mathieu-Daudé MemOpIdx oi = make_memop_idx(MO_LEUQ | MO_UNALN, mmu_idx); 206*42fa9665SPhilippe Mathieu-Daudé cpu_stq_mmu(env, addr, val, oi, ra); 207*42fa9665SPhilippe Mathieu-Daudé } 208*42fa9665SPhilippe Mathieu-Daudé 209*42fa9665SPhilippe Mathieu-Daudé /*--------------------------*/ 210*42fa9665SPhilippe Mathieu-Daudé 211*42fa9665SPhilippe Mathieu-Daudé static inline uint32_t 212*42fa9665SPhilippe Mathieu-Daudé cpu_ldub_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra) 213*42fa9665SPhilippe Mathieu-Daudé { 214*42fa9665SPhilippe Mathieu-Daudé int mmu_index = cpu_mmu_index(env_cpu(env), false); 215*42fa9665SPhilippe Mathieu-Daudé return cpu_ldub_mmuidx_ra(env, addr, mmu_index, ra); 216*42fa9665SPhilippe Mathieu-Daudé } 217*42fa9665SPhilippe Mathieu-Daudé 218*42fa9665SPhilippe Mathieu-Daudé static inline int 219*42fa9665SPhilippe Mathieu-Daudé cpu_ldsb_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra) 220*42fa9665SPhilippe Mathieu-Daudé { 221*42fa9665SPhilippe Mathieu-Daudé return (int8_t)cpu_ldub_data_ra(env, addr, ra); 222*42fa9665SPhilippe Mathieu-Daudé } 223*42fa9665SPhilippe Mathieu-Daudé 224*42fa9665SPhilippe Mathieu-Daudé static inline uint32_t 225*42fa9665SPhilippe Mathieu-Daudé cpu_lduw_be_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra) 226*42fa9665SPhilippe Mathieu-Daudé { 227*42fa9665SPhilippe Mathieu-Daudé int mmu_index = cpu_mmu_index(env_cpu(env), false); 228*42fa9665SPhilippe Mathieu-Daudé return cpu_lduw_be_mmuidx_ra(env, addr, mmu_index, ra); 229*42fa9665SPhilippe Mathieu-Daudé } 230*42fa9665SPhilippe Mathieu-Daudé 231*42fa9665SPhilippe Mathieu-Daudé static inline int 232*42fa9665SPhilippe Mathieu-Daudé cpu_ldsw_be_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra) 233*42fa9665SPhilippe Mathieu-Daudé { 234*42fa9665SPhilippe Mathieu-Daudé return (int16_t)cpu_lduw_be_data_ra(env, addr, ra); 235*42fa9665SPhilippe Mathieu-Daudé } 236*42fa9665SPhilippe Mathieu-Daudé 237*42fa9665SPhilippe Mathieu-Daudé static inline uint32_t 238*42fa9665SPhilippe Mathieu-Daudé cpu_ldl_be_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra) 239*42fa9665SPhilippe Mathieu-Daudé { 240*42fa9665SPhilippe Mathieu-Daudé int mmu_index = cpu_mmu_index(env_cpu(env), false); 241*42fa9665SPhilippe Mathieu-Daudé return cpu_ldl_be_mmuidx_ra(env, addr, mmu_index, ra); 242*42fa9665SPhilippe Mathieu-Daudé } 243*42fa9665SPhilippe Mathieu-Daudé 244*42fa9665SPhilippe Mathieu-Daudé static inline uint64_t 245*42fa9665SPhilippe Mathieu-Daudé cpu_ldq_be_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra) 246*42fa9665SPhilippe Mathieu-Daudé { 247*42fa9665SPhilippe Mathieu-Daudé int mmu_index = cpu_mmu_index(env_cpu(env), false); 248*42fa9665SPhilippe Mathieu-Daudé return cpu_ldq_be_mmuidx_ra(env, addr, mmu_index, ra); 249*42fa9665SPhilippe Mathieu-Daudé } 250*42fa9665SPhilippe Mathieu-Daudé 251*42fa9665SPhilippe Mathieu-Daudé static inline uint32_t 252*42fa9665SPhilippe Mathieu-Daudé cpu_lduw_le_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra) 253*42fa9665SPhilippe Mathieu-Daudé { 254*42fa9665SPhilippe Mathieu-Daudé int mmu_index = cpu_mmu_index(env_cpu(env), false); 255*42fa9665SPhilippe Mathieu-Daudé return cpu_lduw_le_mmuidx_ra(env, addr, mmu_index, ra); 256*42fa9665SPhilippe Mathieu-Daudé } 257*42fa9665SPhilippe Mathieu-Daudé 258*42fa9665SPhilippe Mathieu-Daudé static inline int 259*42fa9665SPhilippe Mathieu-Daudé cpu_ldsw_le_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra) 260*42fa9665SPhilippe Mathieu-Daudé { 261*42fa9665SPhilippe Mathieu-Daudé return (int16_t)cpu_lduw_le_data_ra(env, addr, ra); 262*42fa9665SPhilippe Mathieu-Daudé } 263*42fa9665SPhilippe Mathieu-Daudé 264*42fa9665SPhilippe Mathieu-Daudé static inline uint32_t 265*42fa9665SPhilippe Mathieu-Daudé cpu_ldl_le_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra) 266*42fa9665SPhilippe Mathieu-Daudé { 267*42fa9665SPhilippe Mathieu-Daudé int mmu_index = cpu_mmu_index(env_cpu(env), false); 268*42fa9665SPhilippe Mathieu-Daudé return cpu_ldl_le_mmuidx_ra(env, addr, mmu_index, ra); 269*42fa9665SPhilippe Mathieu-Daudé } 270*42fa9665SPhilippe Mathieu-Daudé 271*42fa9665SPhilippe Mathieu-Daudé static inline uint64_t 272*42fa9665SPhilippe Mathieu-Daudé cpu_ldq_le_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra) 273*42fa9665SPhilippe Mathieu-Daudé { 274*42fa9665SPhilippe Mathieu-Daudé int mmu_index = cpu_mmu_index(env_cpu(env), false); 275*42fa9665SPhilippe Mathieu-Daudé return cpu_ldq_le_mmuidx_ra(env, addr, mmu_index, ra); 276*42fa9665SPhilippe Mathieu-Daudé } 277*42fa9665SPhilippe Mathieu-Daudé 278*42fa9665SPhilippe Mathieu-Daudé static inline void 279*42fa9665SPhilippe Mathieu-Daudé cpu_stb_data_ra(CPUArchState *env, abi_ptr addr, uint32_t val, uintptr_t ra) 280*42fa9665SPhilippe Mathieu-Daudé { 281*42fa9665SPhilippe Mathieu-Daudé int mmu_index = cpu_mmu_index(env_cpu(env), false); 282*42fa9665SPhilippe Mathieu-Daudé cpu_stb_mmuidx_ra(env, addr, val, mmu_index, ra); 283*42fa9665SPhilippe Mathieu-Daudé } 284*42fa9665SPhilippe Mathieu-Daudé 285*42fa9665SPhilippe Mathieu-Daudé static inline void 286*42fa9665SPhilippe Mathieu-Daudé cpu_stw_be_data_ra(CPUArchState *env, abi_ptr addr, uint32_t val, uintptr_t ra) 287*42fa9665SPhilippe Mathieu-Daudé { 288*42fa9665SPhilippe Mathieu-Daudé int mmu_index = cpu_mmu_index(env_cpu(env), false); 289*42fa9665SPhilippe Mathieu-Daudé cpu_stw_be_mmuidx_ra(env, addr, val, mmu_index, ra); 290*42fa9665SPhilippe Mathieu-Daudé } 291*42fa9665SPhilippe Mathieu-Daudé 292*42fa9665SPhilippe Mathieu-Daudé static inline void 293*42fa9665SPhilippe Mathieu-Daudé cpu_stl_be_data_ra(CPUArchState *env, abi_ptr addr, uint32_t val, uintptr_t ra) 294*42fa9665SPhilippe Mathieu-Daudé { 295*42fa9665SPhilippe Mathieu-Daudé int mmu_index = cpu_mmu_index(env_cpu(env), false); 296*42fa9665SPhilippe Mathieu-Daudé cpu_stl_be_mmuidx_ra(env, addr, val, mmu_index, ra); 297*42fa9665SPhilippe Mathieu-Daudé } 298*42fa9665SPhilippe Mathieu-Daudé 299*42fa9665SPhilippe Mathieu-Daudé static inline void 300*42fa9665SPhilippe Mathieu-Daudé cpu_stq_be_data_ra(CPUArchState *env, abi_ptr addr, uint64_t val, uintptr_t ra) 301*42fa9665SPhilippe Mathieu-Daudé { 302*42fa9665SPhilippe Mathieu-Daudé int mmu_index = cpu_mmu_index(env_cpu(env), false); 303*42fa9665SPhilippe Mathieu-Daudé cpu_stq_be_mmuidx_ra(env, addr, val, mmu_index, ra); 304*42fa9665SPhilippe Mathieu-Daudé } 305*42fa9665SPhilippe Mathieu-Daudé 306*42fa9665SPhilippe Mathieu-Daudé static inline void 307*42fa9665SPhilippe Mathieu-Daudé cpu_stw_le_data_ra(CPUArchState *env, abi_ptr addr, uint32_t val, uintptr_t ra) 308*42fa9665SPhilippe Mathieu-Daudé { 309*42fa9665SPhilippe Mathieu-Daudé int mmu_index = cpu_mmu_index(env_cpu(env), false); 310*42fa9665SPhilippe Mathieu-Daudé cpu_stw_le_mmuidx_ra(env, addr, val, mmu_index, ra); 311*42fa9665SPhilippe Mathieu-Daudé } 312*42fa9665SPhilippe Mathieu-Daudé 313*42fa9665SPhilippe Mathieu-Daudé static inline void 314*42fa9665SPhilippe Mathieu-Daudé cpu_stl_le_data_ra(CPUArchState *env, abi_ptr addr, uint32_t val, uintptr_t ra) 315*42fa9665SPhilippe Mathieu-Daudé { 316*42fa9665SPhilippe Mathieu-Daudé int mmu_index = cpu_mmu_index(env_cpu(env), false); 317*42fa9665SPhilippe Mathieu-Daudé cpu_stl_le_mmuidx_ra(env, addr, val, mmu_index, ra); 318*42fa9665SPhilippe Mathieu-Daudé } 319*42fa9665SPhilippe Mathieu-Daudé 320*42fa9665SPhilippe Mathieu-Daudé static inline void 321*42fa9665SPhilippe Mathieu-Daudé cpu_stq_le_data_ra(CPUArchState *env, abi_ptr addr, uint64_t val, uintptr_t ra) 322*42fa9665SPhilippe Mathieu-Daudé { 323*42fa9665SPhilippe Mathieu-Daudé int mmu_index = cpu_mmu_index(env_cpu(env), false); 324*42fa9665SPhilippe Mathieu-Daudé cpu_stq_le_mmuidx_ra(env, addr, val, mmu_index, ra); 325*42fa9665SPhilippe Mathieu-Daudé } 326*42fa9665SPhilippe Mathieu-Daudé 327*42fa9665SPhilippe Mathieu-Daudé /*--------------------------*/ 328*42fa9665SPhilippe Mathieu-Daudé 329*42fa9665SPhilippe Mathieu-Daudé static inline uint32_t 330*42fa9665SPhilippe Mathieu-Daudé cpu_ldub_data(CPUArchState *env, abi_ptr addr) 331*42fa9665SPhilippe Mathieu-Daudé { 332*42fa9665SPhilippe Mathieu-Daudé return cpu_ldub_data_ra(env, addr, 0); 333*42fa9665SPhilippe Mathieu-Daudé } 334*42fa9665SPhilippe Mathieu-Daudé 335*42fa9665SPhilippe Mathieu-Daudé static inline int 336*42fa9665SPhilippe Mathieu-Daudé cpu_ldsb_data(CPUArchState *env, abi_ptr addr) 337*42fa9665SPhilippe Mathieu-Daudé { 338*42fa9665SPhilippe Mathieu-Daudé return (int8_t)cpu_ldub_data(env, addr); 339*42fa9665SPhilippe Mathieu-Daudé } 340*42fa9665SPhilippe Mathieu-Daudé 341*42fa9665SPhilippe Mathieu-Daudé static inline uint32_t 342*42fa9665SPhilippe Mathieu-Daudé cpu_lduw_be_data(CPUArchState *env, abi_ptr addr) 343*42fa9665SPhilippe Mathieu-Daudé { 344*42fa9665SPhilippe Mathieu-Daudé return cpu_lduw_be_data_ra(env, addr, 0); 345*42fa9665SPhilippe Mathieu-Daudé } 346*42fa9665SPhilippe Mathieu-Daudé 347*42fa9665SPhilippe Mathieu-Daudé static inline int 348*42fa9665SPhilippe Mathieu-Daudé cpu_ldsw_be_data(CPUArchState *env, abi_ptr addr) 349*42fa9665SPhilippe Mathieu-Daudé { 350*42fa9665SPhilippe Mathieu-Daudé return (int16_t)cpu_lduw_be_data(env, addr); 351*42fa9665SPhilippe Mathieu-Daudé } 352*42fa9665SPhilippe Mathieu-Daudé 353*42fa9665SPhilippe Mathieu-Daudé static inline uint32_t 354*42fa9665SPhilippe Mathieu-Daudé cpu_ldl_be_data(CPUArchState *env, abi_ptr addr) 355*42fa9665SPhilippe Mathieu-Daudé { 356*42fa9665SPhilippe Mathieu-Daudé return cpu_ldl_be_data_ra(env, addr, 0); 357*42fa9665SPhilippe Mathieu-Daudé } 358*42fa9665SPhilippe Mathieu-Daudé 359*42fa9665SPhilippe Mathieu-Daudé static inline uint64_t 360*42fa9665SPhilippe Mathieu-Daudé cpu_ldq_be_data(CPUArchState *env, abi_ptr addr) 361*42fa9665SPhilippe Mathieu-Daudé { 362*42fa9665SPhilippe Mathieu-Daudé return cpu_ldq_be_data_ra(env, addr, 0); 363*42fa9665SPhilippe Mathieu-Daudé } 364*42fa9665SPhilippe Mathieu-Daudé 365*42fa9665SPhilippe Mathieu-Daudé static inline uint32_t 366*42fa9665SPhilippe Mathieu-Daudé cpu_lduw_le_data(CPUArchState *env, abi_ptr addr) 367*42fa9665SPhilippe Mathieu-Daudé { 368*42fa9665SPhilippe Mathieu-Daudé return cpu_lduw_le_data_ra(env, addr, 0); 369*42fa9665SPhilippe Mathieu-Daudé } 370*42fa9665SPhilippe Mathieu-Daudé 371*42fa9665SPhilippe Mathieu-Daudé static inline int 372*42fa9665SPhilippe Mathieu-Daudé cpu_ldsw_le_data(CPUArchState *env, abi_ptr addr) 373*42fa9665SPhilippe Mathieu-Daudé { 374*42fa9665SPhilippe Mathieu-Daudé return (int16_t)cpu_lduw_le_data(env, addr); 375*42fa9665SPhilippe Mathieu-Daudé } 376*42fa9665SPhilippe Mathieu-Daudé 377*42fa9665SPhilippe Mathieu-Daudé static inline uint32_t 378*42fa9665SPhilippe Mathieu-Daudé cpu_ldl_le_data(CPUArchState *env, abi_ptr addr) 379*42fa9665SPhilippe Mathieu-Daudé { 380*42fa9665SPhilippe Mathieu-Daudé return cpu_ldl_le_data_ra(env, addr, 0); 381*42fa9665SPhilippe Mathieu-Daudé } 382*42fa9665SPhilippe Mathieu-Daudé 383*42fa9665SPhilippe Mathieu-Daudé static inline uint64_t 384*42fa9665SPhilippe Mathieu-Daudé cpu_ldq_le_data(CPUArchState *env, abi_ptr addr) 385*42fa9665SPhilippe Mathieu-Daudé { 386*42fa9665SPhilippe Mathieu-Daudé return cpu_ldq_le_data_ra(env, addr, 0); 387*42fa9665SPhilippe Mathieu-Daudé } 388*42fa9665SPhilippe Mathieu-Daudé 389*42fa9665SPhilippe Mathieu-Daudé static inline void 390*42fa9665SPhilippe Mathieu-Daudé cpu_stb_data(CPUArchState *env, abi_ptr addr, uint32_t val) 391*42fa9665SPhilippe Mathieu-Daudé { 392*42fa9665SPhilippe Mathieu-Daudé cpu_stb_data_ra(env, addr, val, 0); 393*42fa9665SPhilippe Mathieu-Daudé } 394*42fa9665SPhilippe Mathieu-Daudé 395*42fa9665SPhilippe Mathieu-Daudé static inline void 396*42fa9665SPhilippe Mathieu-Daudé cpu_stw_be_data(CPUArchState *env, abi_ptr addr, uint32_t val) 397*42fa9665SPhilippe Mathieu-Daudé { 398*42fa9665SPhilippe Mathieu-Daudé cpu_stw_be_data_ra(env, addr, val, 0); 399*42fa9665SPhilippe Mathieu-Daudé } 400*42fa9665SPhilippe Mathieu-Daudé 401*42fa9665SPhilippe Mathieu-Daudé static inline void 402*42fa9665SPhilippe Mathieu-Daudé cpu_stl_be_data(CPUArchState *env, abi_ptr addr, uint32_t val) 403*42fa9665SPhilippe Mathieu-Daudé { 404*42fa9665SPhilippe Mathieu-Daudé cpu_stl_be_data_ra(env, addr, val, 0); 405*42fa9665SPhilippe Mathieu-Daudé } 406*42fa9665SPhilippe Mathieu-Daudé 407*42fa9665SPhilippe Mathieu-Daudé static inline void 408*42fa9665SPhilippe Mathieu-Daudé cpu_stq_be_data(CPUArchState *env, abi_ptr addr, uint64_t val) 409*42fa9665SPhilippe Mathieu-Daudé { 410*42fa9665SPhilippe Mathieu-Daudé cpu_stq_be_data_ra(env, addr, val, 0); 411*42fa9665SPhilippe Mathieu-Daudé } 412*42fa9665SPhilippe Mathieu-Daudé 413*42fa9665SPhilippe Mathieu-Daudé static inline void 414*42fa9665SPhilippe Mathieu-Daudé cpu_stw_le_data(CPUArchState *env, abi_ptr addr, uint32_t val) 415*42fa9665SPhilippe Mathieu-Daudé { 416*42fa9665SPhilippe Mathieu-Daudé cpu_stw_le_data_ra(env, addr, val, 0); 417*42fa9665SPhilippe Mathieu-Daudé } 418*42fa9665SPhilippe Mathieu-Daudé 419*42fa9665SPhilippe Mathieu-Daudé static inline void 420*42fa9665SPhilippe Mathieu-Daudé cpu_stl_le_data(CPUArchState *env, abi_ptr addr, uint32_t val) 421*42fa9665SPhilippe Mathieu-Daudé { 422*42fa9665SPhilippe Mathieu-Daudé cpu_stl_le_data_ra(env, addr, val, 0); 423*42fa9665SPhilippe Mathieu-Daudé } 424*42fa9665SPhilippe Mathieu-Daudé 425*42fa9665SPhilippe Mathieu-Daudé static inline void 426*42fa9665SPhilippe Mathieu-Daudé cpu_stq_le_data(CPUArchState *env, abi_ptr addr, uint64_t val) 427*42fa9665SPhilippe Mathieu-Daudé { 428*42fa9665SPhilippe Mathieu-Daudé cpu_stq_le_data_ra(env, addr, val, 0); 429*42fa9665SPhilippe Mathieu-Daudé } 430*42fa9665SPhilippe Mathieu-Daudé 431*42fa9665SPhilippe Mathieu-Daudé #if TARGET_BIG_ENDIAN 432*42fa9665SPhilippe Mathieu-Daudé # define cpu_lduw_data cpu_lduw_be_data 433*42fa9665SPhilippe Mathieu-Daudé # define cpu_ldsw_data cpu_ldsw_be_data 434*42fa9665SPhilippe Mathieu-Daudé # define cpu_ldl_data cpu_ldl_be_data 435*42fa9665SPhilippe Mathieu-Daudé # define cpu_ldq_data cpu_ldq_be_data 436*42fa9665SPhilippe Mathieu-Daudé # define cpu_lduw_data_ra cpu_lduw_be_data_ra 437*42fa9665SPhilippe Mathieu-Daudé # define cpu_ldsw_data_ra cpu_ldsw_be_data_ra 438*42fa9665SPhilippe Mathieu-Daudé # define cpu_ldl_data_ra cpu_ldl_be_data_ra 439*42fa9665SPhilippe Mathieu-Daudé # define cpu_ldq_data_ra cpu_ldq_be_data_ra 440*42fa9665SPhilippe Mathieu-Daudé # define cpu_lduw_mmuidx_ra cpu_lduw_be_mmuidx_ra 441*42fa9665SPhilippe Mathieu-Daudé # define cpu_ldsw_mmuidx_ra cpu_ldsw_be_mmuidx_ra 442*42fa9665SPhilippe Mathieu-Daudé # define cpu_ldl_mmuidx_ra cpu_ldl_be_mmuidx_ra 443*42fa9665SPhilippe Mathieu-Daudé # define cpu_ldq_mmuidx_ra cpu_ldq_be_mmuidx_ra 444*42fa9665SPhilippe Mathieu-Daudé # define cpu_stw_data cpu_stw_be_data 445*42fa9665SPhilippe Mathieu-Daudé # define cpu_stl_data cpu_stl_be_data 446*42fa9665SPhilippe Mathieu-Daudé # define cpu_stq_data cpu_stq_be_data 447*42fa9665SPhilippe Mathieu-Daudé # define cpu_stw_data_ra cpu_stw_be_data_ra 448*42fa9665SPhilippe Mathieu-Daudé # define cpu_stl_data_ra cpu_stl_be_data_ra 449*42fa9665SPhilippe Mathieu-Daudé # define cpu_stq_data_ra cpu_stq_be_data_ra 450*42fa9665SPhilippe Mathieu-Daudé # define cpu_stw_mmuidx_ra cpu_stw_be_mmuidx_ra 451*42fa9665SPhilippe Mathieu-Daudé # define cpu_stl_mmuidx_ra cpu_stl_be_mmuidx_ra 452*42fa9665SPhilippe Mathieu-Daudé # define cpu_stq_mmuidx_ra cpu_stq_be_mmuidx_ra 453*42fa9665SPhilippe Mathieu-Daudé #else 454*42fa9665SPhilippe Mathieu-Daudé # define cpu_lduw_data cpu_lduw_le_data 455*42fa9665SPhilippe Mathieu-Daudé # define cpu_ldsw_data cpu_ldsw_le_data 456*42fa9665SPhilippe Mathieu-Daudé # define cpu_ldl_data cpu_ldl_le_data 457*42fa9665SPhilippe Mathieu-Daudé # define cpu_ldq_data cpu_ldq_le_data 458*42fa9665SPhilippe Mathieu-Daudé # define cpu_lduw_data_ra cpu_lduw_le_data_ra 459*42fa9665SPhilippe Mathieu-Daudé # define cpu_ldsw_data_ra cpu_ldsw_le_data_ra 460*42fa9665SPhilippe Mathieu-Daudé # define cpu_ldl_data_ra cpu_ldl_le_data_ra 461*42fa9665SPhilippe Mathieu-Daudé # define cpu_ldq_data_ra cpu_ldq_le_data_ra 462*42fa9665SPhilippe Mathieu-Daudé # define cpu_lduw_mmuidx_ra cpu_lduw_le_mmuidx_ra 463*42fa9665SPhilippe Mathieu-Daudé # define cpu_ldsw_mmuidx_ra cpu_ldsw_le_mmuidx_ra 464*42fa9665SPhilippe Mathieu-Daudé # define cpu_ldl_mmuidx_ra cpu_ldl_le_mmuidx_ra 465*42fa9665SPhilippe Mathieu-Daudé # define cpu_ldq_mmuidx_ra cpu_ldq_le_mmuidx_ra 466*42fa9665SPhilippe Mathieu-Daudé # define cpu_stw_data cpu_stw_le_data 467*42fa9665SPhilippe Mathieu-Daudé # define cpu_stl_data cpu_stl_le_data 468*42fa9665SPhilippe Mathieu-Daudé # define cpu_stq_data cpu_stq_le_data 469*42fa9665SPhilippe Mathieu-Daudé # define cpu_stw_data_ra cpu_stw_le_data_ra 470*42fa9665SPhilippe Mathieu-Daudé # define cpu_stl_data_ra cpu_stl_le_data_ra 471*42fa9665SPhilippe Mathieu-Daudé # define cpu_stq_data_ra cpu_stq_le_data_ra 472*42fa9665SPhilippe Mathieu-Daudé # define cpu_stw_mmuidx_ra cpu_stw_le_mmuidx_ra 473*42fa9665SPhilippe Mathieu-Daudé # define cpu_stl_mmuidx_ra cpu_stl_le_mmuidx_ra 474*42fa9665SPhilippe Mathieu-Daudé # define cpu_stq_mmuidx_ra cpu_stq_le_mmuidx_ra 475*42fa9665SPhilippe Mathieu-Daudé #endif 476*42fa9665SPhilippe Mathieu-Daudé 477*42fa9665SPhilippe Mathieu-Daudé static inline uint32_t cpu_ldub_code(CPUArchState *env, abi_ptr addr) 478*42fa9665SPhilippe Mathieu-Daudé { 479*42fa9665SPhilippe Mathieu-Daudé CPUState *cs = env_cpu(env); 480*42fa9665SPhilippe Mathieu-Daudé MemOpIdx oi = make_memop_idx(MO_UB, cpu_mmu_index(cs, true)); 481*42fa9665SPhilippe Mathieu-Daudé return cpu_ldb_code_mmu(env, addr, oi, 0); 482*42fa9665SPhilippe Mathieu-Daudé } 483*42fa9665SPhilippe Mathieu-Daudé 484*42fa9665SPhilippe Mathieu-Daudé static inline uint32_t cpu_lduw_code(CPUArchState *env, abi_ptr addr) 485*42fa9665SPhilippe Mathieu-Daudé { 486*42fa9665SPhilippe Mathieu-Daudé CPUState *cs = env_cpu(env); 487*42fa9665SPhilippe Mathieu-Daudé MemOpIdx oi = make_memop_idx(MO_TEUW, cpu_mmu_index(cs, true)); 488*42fa9665SPhilippe Mathieu-Daudé return cpu_ldw_code_mmu(env, addr, oi, 0); 489*42fa9665SPhilippe Mathieu-Daudé } 490*42fa9665SPhilippe Mathieu-Daudé 491*42fa9665SPhilippe Mathieu-Daudé static inline uint32_t cpu_ldl_code(CPUArchState *env, abi_ptr addr) 492*42fa9665SPhilippe Mathieu-Daudé { 493*42fa9665SPhilippe Mathieu-Daudé CPUState *cs = env_cpu(env); 494*42fa9665SPhilippe Mathieu-Daudé MemOpIdx oi = make_memop_idx(MO_TEUL, cpu_mmu_index(cs, true)); 495*42fa9665SPhilippe Mathieu-Daudé return cpu_ldl_code_mmu(env, addr, oi, 0); 496*42fa9665SPhilippe Mathieu-Daudé } 497*42fa9665SPhilippe Mathieu-Daudé 498*42fa9665SPhilippe Mathieu-Daudé static inline uint64_t cpu_ldq_code(CPUArchState *env, abi_ptr addr) 499*42fa9665SPhilippe Mathieu-Daudé { 500*42fa9665SPhilippe Mathieu-Daudé CPUState *cs = env_cpu(env); 501*42fa9665SPhilippe Mathieu-Daudé MemOpIdx oi = make_memop_idx(MO_TEUQ, cpu_mmu_index(cs, true)); 502*42fa9665SPhilippe Mathieu-Daudé return cpu_ldq_code_mmu(env, addr, oi, 0); 503*42fa9665SPhilippe Mathieu-Daudé } 504*42fa9665SPhilippe Mathieu-Daudé 505*42fa9665SPhilippe Mathieu-Daudé /** 506*42fa9665SPhilippe Mathieu-Daudé * tlb_vaddr_to_host: 507*42fa9665SPhilippe Mathieu-Daudé * @env: CPUArchState 508*42fa9665SPhilippe Mathieu-Daudé * @addr: guest virtual address to look up 509*42fa9665SPhilippe Mathieu-Daudé * @access_type: 0 for read, 1 for write, 2 for execute 510*42fa9665SPhilippe Mathieu-Daudé * @mmu_idx: MMU index to use for lookup 511*42fa9665SPhilippe Mathieu-Daudé * 512*42fa9665SPhilippe Mathieu-Daudé * Look up the specified guest virtual index in the TCG softmmu TLB. 513*42fa9665SPhilippe Mathieu-Daudé * If we can translate a host virtual address suitable for direct RAM 514*42fa9665SPhilippe Mathieu-Daudé * access, without causing a guest exception, then return it. 515*42fa9665SPhilippe Mathieu-Daudé * Otherwise (TLB entry is for an I/O access, guest software 516*42fa9665SPhilippe Mathieu-Daudé * TLB fill required, etc) return NULL. 517*42fa9665SPhilippe Mathieu-Daudé */ 518*42fa9665SPhilippe Mathieu-Daudé #ifdef CONFIG_USER_ONLY 519*42fa9665SPhilippe Mathieu-Daudé static inline void *tlb_vaddr_to_host(CPUArchState *env, abi_ptr addr, 520*42fa9665SPhilippe Mathieu-Daudé MMUAccessType access_type, int mmu_idx) 521*42fa9665SPhilippe Mathieu-Daudé { 522*42fa9665SPhilippe Mathieu-Daudé return g2h(env_cpu(env), addr); 523*42fa9665SPhilippe Mathieu-Daudé } 524*42fa9665SPhilippe Mathieu-Daudé #else 525*42fa9665SPhilippe Mathieu-Daudé void *tlb_vaddr_to_host(CPUArchState *env, vaddr addr, 526*42fa9665SPhilippe Mathieu-Daudé MMUAccessType access_type, int mmu_idx); 527*42fa9665SPhilippe Mathieu-Daudé #endif 528*42fa9665SPhilippe Mathieu-Daudé 529*42fa9665SPhilippe Mathieu-Daudé /* 530*42fa9665SPhilippe Mathieu-Daudé * For user-only, helpers that use guest to host address translation 531*42fa9665SPhilippe Mathieu-Daudé * must protect the actual host memory access by recording 'retaddr' 532*42fa9665SPhilippe Mathieu-Daudé * for the signal handler. This is required for a race condition in 533*42fa9665SPhilippe Mathieu-Daudé * which another thread unmaps the page between a probe and the 534*42fa9665SPhilippe Mathieu-Daudé * actual access. 535*42fa9665SPhilippe Mathieu-Daudé */ 536*42fa9665SPhilippe Mathieu-Daudé #ifdef CONFIG_USER_ONLY 537*42fa9665SPhilippe Mathieu-Daudé extern __thread uintptr_t helper_retaddr; 538*42fa9665SPhilippe Mathieu-Daudé 539*42fa9665SPhilippe Mathieu-Daudé static inline void set_helper_retaddr(uintptr_t ra) 540*42fa9665SPhilippe Mathieu-Daudé { 541*42fa9665SPhilippe Mathieu-Daudé helper_retaddr = ra; 542*42fa9665SPhilippe Mathieu-Daudé /* 543*42fa9665SPhilippe Mathieu-Daudé * Ensure that this write is visible to the SIGSEGV handler that 544*42fa9665SPhilippe Mathieu-Daudé * may be invoked due to a subsequent invalid memory operation. 545*42fa9665SPhilippe Mathieu-Daudé */ 546*42fa9665SPhilippe Mathieu-Daudé signal_barrier(); 547*42fa9665SPhilippe Mathieu-Daudé } 548*42fa9665SPhilippe Mathieu-Daudé 549*42fa9665SPhilippe Mathieu-Daudé static inline void clear_helper_retaddr(void) 550*42fa9665SPhilippe Mathieu-Daudé { 551*42fa9665SPhilippe Mathieu-Daudé /* 552*42fa9665SPhilippe Mathieu-Daudé * Ensure that previous memory operations have succeeded before 553*42fa9665SPhilippe Mathieu-Daudé * removing the data visible to the signal handler. 554*42fa9665SPhilippe Mathieu-Daudé */ 555*42fa9665SPhilippe Mathieu-Daudé signal_barrier(); 556*42fa9665SPhilippe Mathieu-Daudé helper_retaddr = 0; 557*42fa9665SPhilippe Mathieu-Daudé } 558*42fa9665SPhilippe Mathieu-Daudé #else 559*42fa9665SPhilippe Mathieu-Daudé #define set_helper_retaddr(ra) do { } while (0) 560*42fa9665SPhilippe Mathieu-Daudé #define clear_helper_retaddr() do { } while (0) 561*42fa9665SPhilippe Mathieu-Daudé #endif 562*42fa9665SPhilippe Mathieu-Daudé 563*42fa9665SPhilippe Mathieu-Daudé #endif /* ACCEL_TCG_CPU_LDST_H */ 564