xref: /openbmc/qemu/include/accel/tcg/cpu-ldst.h (revision 42fa9665e598c268a7ccfab5b92636618d9574ec)
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