Skip to content

Commit e5b2333

Browse files
committed
Merge remote-tracking branch 'remotes/rth/tags/pull-tcg-20211013' into staging
Use MO_128 for 16-byte atomic memory operations. Add cpu_ld/st_mmu memory primitives. Move helper_ld/st memory helpers out of tcg.h. Canonicalize alignment flags in MemOp. # gpg: Signature made Wed 13 Oct 2021 10:48:45 AM PDT # gpg: using RSA key 7A481E78868B4DB6A85A05C064DF38E8AF7E215F # gpg: issuer "[email protected]" # gpg: Good signature from "Richard Henderson <[email protected]>" [ultimate] * remotes/rth/tags/pull-tcg-20211013: tcg: Canonicalize alignment flags in MemOp tcg: Move helper_*_mmu decls to tcg/tcg-ldst.h target/arm: Use cpu_*_mmu instead of helper_*_mmu target/sparc: Use cpu_*_mmu instead of helper_*_mmu target/s390x: Use cpu_*_mmu instead of helper_*_mmu target/mips: Use 8-byte memory ops for msa load/store target/mips: Use cpu_*_data_ra for msa load/store accel/tcg: Move cpu_atomic decls to exec/cpu_ldst.h accel/tcg: Add cpu_{ld,st}*_mmu interfaces target/hexagon: Implement cpu_mmu_index target/s390x: Use MO_128 for 16 byte atomics target/ppc: Use MO_128 for 16 byte atomics target/i386: Use MO_128 for 16 byte atomics target/arm: Use MO_128 for 16 byte atomics memory: Log access direction for invalid accesses Signed-off-by: Richard Henderson <[email protected]>
2 parents 984b2b5 + 76e366e commit e5b2333

File tree

21 files changed

+1013
-1187
lines changed

21 files changed

+1013
-1187
lines changed

accel/tcg/cputlb.c

Lines changed: 127 additions & 266 deletions
Large diffs are not rendered by default.

accel/tcg/ldst_common.c.inc

Lines changed: 307 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,307 @@
1+
/*
2+
* Routines common to user and system emulation of load/store.
3+
*
4+
* Copyright (c) 2003 Fabrice Bellard
5+
*
6+
* SPDX-License-Identifier: GPL-2.0-or-later
7+
*
8+
* This work is licensed under the terms of the GNU GPL, version 2 or later.
9+
* See the COPYING file in the top-level directory.
10+
*/
11+
12+
uint32_t cpu_ldub_mmuidx_ra(CPUArchState *env, abi_ptr addr,
13+
int mmu_idx, uintptr_t ra)
14+
{
15+
MemOpIdx oi = make_memop_idx(MO_UB, mmu_idx);
16+
return cpu_ldb_mmu(env, addr, oi, ra);
17+
}
18+
19+
int cpu_ldsb_mmuidx_ra(CPUArchState *env, abi_ptr addr,
20+
int mmu_idx, uintptr_t ra)
21+
{
22+
return (int8_t)cpu_ldub_mmuidx_ra(env, addr, mmu_idx, ra);
23+
}
24+
25+
uint32_t cpu_lduw_be_mmuidx_ra(CPUArchState *env, abi_ptr addr,
26+
int mmu_idx, uintptr_t ra)
27+
{
28+
MemOpIdx oi = make_memop_idx(MO_BEUW | MO_UNALN, mmu_idx);
29+
return cpu_ldw_be_mmu(env, addr, oi, ra);
30+
}
31+
32+
int cpu_ldsw_be_mmuidx_ra(CPUArchState *env, abi_ptr addr,
33+
int mmu_idx, uintptr_t ra)
34+
{
35+
return (int16_t)cpu_lduw_be_mmuidx_ra(env, addr, mmu_idx, ra);
36+
}
37+
38+
uint32_t cpu_ldl_be_mmuidx_ra(CPUArchState *env, abi_ptr addr,
39+
int mmu_idx, uintptr_t ra)
40+
{
41+
MemOpIdx oi = make_memop_idx(MO_BEUL | MO_UNALN, mmu_idx);
42+
return cpu_ldl_be_mmu(env, addr, oi, ra);
43+
}
44+
45+
uint64_t cpu_ldq_be_mmuidx_ra(CPUArchState *env, abi_ptr addr,
46+
int mmu_idx, uintptr_t ra)
47+
{
48+
MemOpIdx oi = make_memop_idx(MO_BEQ | MO_UNALN, mmu_idx);
49+
return cpu_ldq_be_mmu(env, addr, oi, ra);
50+
}
51+
52+
uint32_t cpu_lduw_le_mmuidx_ra(CPUArchState *env, abi_ptr addr,
53+
int mmu_idx, uintptr_t ra)
54+
{
55+
MemOpIdx oi = make_memop_idx(MO_LEUW | MO_UNALN, mmu_idx);
56+
return cpu_ldw_le_mmu(env, addr, oi, ra);
57+
}
58+
59+
int cpu_ldsw_le_mmuidx_ra(CPUArchState *env, abi_ptr addr,
60+
int mmu_idx, uintptr_t ra)
61+
{
62+
return (int16_t)cpu_lduw_le_mmuidx_ra(env, addr, mmu_idx, ra);
63+
}
64+
65+
uint32_t cpu_ldl_le_mmuidx_ra(CPUArchState *env, abi_ptr addr,
66+
int mmu_idx, uintptr_t ra)
67+
{
68+
MemOpIdx oi = make_memop_idx(MO_LEUL | MO_UNALN, mmu_idx);
69+
return cpu_ldl_le_mmu(env, addr, oi, ra);
70+
}
71+
72+
uint64_t cpu_ldq_le_mmuidx_ra(CPUArchState *env, abi_ptr addr,
73+
int mmu_idx, uintptr_t ra)
74+
{
75+
MemOpIdx oi = make_memop_idx(MO_LEQ | MO_UNALN, mmu_idx);
76+
return cpu_ldq_le_mmu(env, addr, oi, ra);
77+
}
78+
79+
void cpu_stb_mmuidx_ra(CPUArchState *env, abi_ptr addr, uint32_t val,
80+
int mmu_idx, uintptr_t ra)
81+
{
82+
MemOpIdx oi = make_memop_idx(MO_UB, mmu_idx);
83+
cpu_stb_mmu(env, addr, val, oi, ra);
84+
}
85+
86+
void cpu_stw_be_mmuidx_ra(CPUArchState *env, abi_ptr addr, uint32_t val,
87+
int mmu_idx, uintptr_t ra)
88+
{
89+
MemOpIdx oi = make_memop_idx(MO_BEUW | MO_UNALN, mmu_idx);
90+
cpu_stw_be_mmu(env, addr, val, oi, ra);
91+
}
92+
93+
void cpu_stl_be_mmuidx_ra(CPUArchState *env, abi_ptr addr, uint32_t val,
94+
int mmu_idx, uintptr_t ra)
95+
{
96+
MemOpIdx oi = make_memop_idx(MO_BEUL | MO_UNALN, mmu_idx);
97+
cpu_stl_be_mmu(env, addr, val, oi, ra);
98+
}
99+
100+
void cpu_stq_be_mmuidx_ra(CPUArchState *env, abi_ptr addr, uint64_t val,
101+
int mmu_idx, uintptr_t ra)
102+
{
103+
MemOpIdx oi = make_memop_idx(MO_BEQ | MO_UNALN, mmu_idx);
104+
cpu_stq_be_mmu(env, addr, val, oi, ra);
105+
}
106+
107+
void cpu_stw_le_mmuidx_ra(CPUArchState *env, abi_ptr addr, uint32_t val,
108+
int mmu_idx, uintptr_t ra)
109+
{
110+
MemOpIdx oi = make_memop_idx(MO_LEUW | MO_UNALN, mmu_idx);
111+
cpu_stw_le_mmu(env, addr, val, oi, ra);
112+
}
113+
114+
void cpu_stl_le_mmuidx_ra(CPUArchState *env, abi_ptr addr, uint32_t val,
115+
int mmu_idx, uintptr_t ra)
116+
{
117+
MemOpIdx oi = make_memop_idx(MO_LEUL | MO_UNALN, mmu_idx);
118+
cpu_stl_le_mmu(env, addr, val, oi, ra);
119+
}
120+
121+
void cpu_stq_le_mmuidx_ra(CPUArchState *env, abi_ptr addr, uint64_t val,
122+
int mmu_idx, uintptr_t ra)
123+
{
124+
MemOpIdx oi = make_memop_idx(MO_LEQ | MO_UNALN, mmu_idx);
125+
cpu_stq_le_mmu(env, addr, val, oi, ra);
126+
}
127+
128+
/*--------------------------*/
129+
130+
uint32_t cpu_ldub_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra)
131+
{
132+
return cpu_ldub_mmuidx_ra(env, addr, cpu_mmu_index(env, false), ra);
133+
}
134+
135+
int cpu_ldsb_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra)
136+
{
137+
return (int8_t)cpu_ldub_data_ra(env, addr, ra);
138+
}
139+
140+
uint32_t cpu_lduw_be_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra)
141+
{
142+
return cpu_lduw_be_mmuidx_ra(env, addr, cpu_mmu_index(env, false), ra);
143+
}
144+
145+
int cpu_ldsw_be_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra)
146+
{
147+
return (int16_t)cpu_lduw_be_data_ra(env, addr, ra);
148+
}
149+
150+
uint32_t cpu_ldl_be_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra)
151+
{
152+
return cpu_ldl_be_mmuidx_ra(env, addr, cpu_mmu_index(env, false), ra);
153+
}
154+
155+
uint64_t cpu_ldq_be_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra)
156+
{
157+
return cpu_ldq_be_mmuidx_ra(env, addr, cpu_mmu_index(env, false), ra);
158+
}
159+
160+
uint32_t cpu_lduw_le_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra)
161+
{
162+
return cpu_lduw_le_mmuidx_ra(env, addr, cpu_mmu_index(env, false), ra);
163+
}
164+
165+
int cpu_ldsw_le_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra)
166+
{
167+
return (int16_t)cpu_lduw_le_data_ra(env, addr, ra);
168+
}
169+
170+
uint32_t cpu_ldl_le_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra)
171+
{
172+
return cpu_ldl_le_mmuidx_ra(env, addr, cpu_mmu_index(env, false), ra);
173+
}
174+
175+
uint64_t cpu_ldq_le_data_ra(CPUArchState *env, abi_ptr addr, uintptr_t ra)
176+
{
177+
return cpu_ldq_le_mmuidx_ra(env, addr, cpu_mmu_index(env, false), ra);
178+
}
179+
180+
void cpu_stb_data_ra(CPUArchState *env, abi_ptr addr,
181+
uint32_t val, uintptr_t ra)
182+
{
183+
cpu_stb_mmuidx_ra(env, addr, val, cpu_mmu_index(env, false), ra);
184+
}
185+
186+
void cpu_stw_be_data_ra(CPUArchState *env, abi_ptr addr,
187+
uint32_t val, uintptr_t ra)
188+
{
189+
cpu_stw_be_mmuidx_ra(env, addr, val, cpu_mmu_index(env, false), ra);
190+
}
191+
192+
void cpu_stl_be_data_ra(CPUArchState *env, abi_ptr addr,
193+
uint32_t val, uintptr_t ra)
194+
{
195+
cpu_stl_be_mmuidx_ra(env, addr, val, cpu_mmu_index(env, false), ra);
196+
}
197+
198+
void cpu_stq_be_data_ra(CPUArchState *env, abi_ptr addr,
199+
uint64_t val, uintptr_t ra)
200+
{
201+
cpu_stq_be_mmuidx_ra(env, addr, val, cpu_mmu_index(env, false), ra);
202+
}
203+
204+
void cpu_stw_le_data_ra(CPUArchState *env, abi_ptr addr,
205+
uint32_t val, uintptr_t ra)
206+
{
207+
cpu_stw_le_mmuidx_ra(env, addr, val, cpu_mmu_index(env, false), ra);
208+
}
209+
210+
void cpu_stl_le_data_ra(CPUArchState *env, abi_ptr addr,
211+
uint32_t val, uintptr_t ra)
212+
{
213+
cpu_stl_le_mmuidx_ra(env, addr, val, cpu_mmu_index(env, false), ra);
214+
}
215+
216+
void cpu_stq_le_data_ra(CPUArchState *env, abi_ptr addr,
217+
uint64_t val, uintptr_t ra)
218+
{
219+
cpu_stq_le_mmuidx_ra(env, addr, val, cpu_mmu_index(env, false), ra);
220+
}
221+
222+
/*--------------------------*/
223+
224+
uint32_t cpu_ldub_data(CPUArchState *env, abi_ptr addr)
225+
{
226+
return cpu_ldub_data_ra(env, addr, 0);
227+
}
228+
229+
int cpu_ldsb_data(CPUArchState *env, abi_ptr addr)
230+
{
231+
return (int8_t)cpu_ldub_data(env, addr);
232+
}
233+
234+
uint32_t cpu_lduw_be_data(CPUArchState *env, abi_ptr addr)
235+
{
236+
return cpu_lduw_be_data_ra(env, addr, 0);
237+
}
238+
239+
int cpu_ldsw_be_data(CPUArchState *env, abi_ptr addr)
240+
{
241+
return (int16_t)cpu_lduw_be_data(env, addr);
242+
}
243+
244+
uint32_t cpu_ldl_be_data(CPUArchState *env, abi_ptr addr)
245+
{
246+
return cpu_ldl_be_data_ra(env, addr, 0);
247+
}
248+
249+
uint64_t cpu_ldq_be_data(CPUArchState *env, abi_ptr addr)
250+
{
251+
return cpu_ldq_be_data_ra(env, addr, 0);
252+
}
253+
254+
uint32_t cpu_lduw_le_data(CPUArchState *env, abi_ptr addr)
255+
{
256+
return cpu_lduw_le_data_ra(env, addr, 0);
257+
}
258+
259+
int cpu_ldsw_le_data(CPUArchState *env, abi_ptr addr)
260+
{
261+
return (int16_t)cpu_lduw_le_data(env, addr);
262+
}
263+
264+
uint32_t cpu_ldl_le_data(CPUArchState *env, abi_ptr addr)
265+
{
266+
return cpu_ldl_le_data_ra(env, addr, 0);
267+
}
268+
269+
uint64_t cpu_ldq_le_data(CPUArchState *env, abi_ptr addr)
270+
{
271+
return cpu_ldq_le_data_ra(env, addr, 0);
272+
}
273+
274+
void cpu_stb_data(CPUArchState *env, abi_ptr addr, uint32_t val)
275+
{
276+
cpu_stb_data_ra(env, addr, val, 0);
277+
}
278+
279+
void cpu_stw_be_data(CPUArchState *env, abi_ptr addr, uint32_t val)
280+
{
281+
cpu_stw_be_data_ra(env, addr, val, 0);
282+
}
283+
284+
void cpu_stl_be_data(CPUArchState *env, abi_ptr addr, uint32_t val)
285+
{
286+
cpu_stl_be_data_ra(env, addr, val, 0);
287+
}
288+
289+
void cpu_stq_be_data(CPUArchState *env, abi_ptr addr, uint64_t val)
290+
{
291+
cpu_stq_be_data_ra(env, addr, val, 0);
292+
}
293+
294+
void cpu_stw_le_data(CPUArchState *env, abi_ptr addr, uint32_t val)
295+
{
296+
cpu_stw_le_data_ra(env, addr, val, 0);
297+
}
298+
299+
void cpu_stl_le_data(CPUArchState *env, abi_ptr addr, uint32_t val)
300+
{
301+
cpu_stl_le_data_ra(env, addr, val, 0);
302+
}
303+
304+
void cpu_stq_le_data(CPUArchState *env, abi_ptr addr, uint64_t val)
305+
{
306+
cpu_stq_le_data_ra(env, addr, val, 0);
307+
}

0 commit comments

Comments
 (0)