Revision e25c3887
b/include/exec/softmmu_defs.h | ||
---|---|---|
9 | 9 |
#ifndef SOFTMMU_DEFS_H |
10 | 10 |
#define SOFTMMU_DEFS_H |
11 | 11 |
|
12 |
uint8_t helper_ret_ldb_mmu(CPUArchState *env, target_ulong addr, |
|
13 |
int mmu_idx, uintptr_t retaddr); |
|
14 |
uint16_t helper_ret_ldw_mmu(CPUArchState *env, target_ulong addr, |
|
15 |
int mmu_idx, uintptr_t retaddr); |
|
16 |
uint32_t helper_ret_ldl_mmu(CPUArchState *env, target_ulong addr, |
|
17 |
int mmu_idx, uintptr_t retaddr); |
|
18 |
uint64_t helper_ret_ldq_mmu(CPUArchState *env, target_ulong addr, |
|
19 |
int mmu_idx, uintptr_t retaddr); |
|
20 |
|
|
21 |
void helper_ret_stb_mmu(CPUArchState *env, target_ulong addr, uint8_t val, |
|
22 |
int mmu_idx, uintptr_t retaddr); |
|
23 |
void helper_ret_stw_mmu(CPUArchState *env, target_ulong addr, uint16_t val, |
|
24 |
int mmu_idx, uintptr_t retaddr); |
|
25 |
void helper_ret_stl_mmu(CPUArchState *env, target_ulong addr, uint32_t val, |
|
26 |
int mmu_idx, uintptr_t retaddr); |
|
27 |
void helper_ret_stq_mmu(CPUArchState *env, target_ulong addr, uint64_t val, |
|
28 |
int mmu_idx, uintptr_t retaddr); |
|
29 |
|
|
12 | 30 |
uint8_t helper_ldb_mmu(CPUArchState *env, target_ulong addr, int mmu_idx); |
13 |
void helper_stb_mmu(CPUArchState *env, target_ulong addr, uint8_t val, |
|
14 |
int mmu_idx); |
|
15 | 31 |
uint16_t helper_ldw_mmu(CPUArchState *env, target_ulong addr, int mmu_idx); |
16 |
void helper_stw_mmu(CPUArchState *env, target_ulong addr, uint16_t val, |
|
17 |
int mmu_idx); |
|
18 | 32 |
uint32_t helper_ldl_mmu(CPUArchState *env, target_ulong addr, int mmu_idx); |
19 |
void helper_stl_mmu(CPUArchState *env, target_ulong addr, uint32_t val, |
|
20 |
int mmu_idx); |
|
21 | 33 |
uint64_t helper_ldq_mmu(CPUArchState *env, target_ulong addr, int mmu_idx); |
22 |
void helper_stq_mmu(CPUArchState *env, target_ulong addr, uint64_t val, |
|
23 |
int mmu_idx); |
|
34 |
|
|
35 |
void helper_stb_mmu(CPUArchState *env, target_ulong addr, |
|
36 |
uint8_t val, int mmu_idx); |
|
37 |
void helper_stw_mmu(CPUArchState *env, target_ulong addr, |
|
38 |
uint16_t val, int mmu_idx); |
|
39 |
void helper_stl_mmu(CPUArchState *env, target_ulong addr, |
|
40 |
uint32_t val, int mmu_idx); |
|
41 |
void helper_stq_mmu(CPUArchState *env, target_ulong addr, |
|
42 |
uint64_t val, int mmu_idx); |
|
24 | 43 |
|
25 | 44 |
uint8_t helper_ldb_cmmu(CPUArchState *env, target_ulong addr, int mmu_idx); |
26 |
void helper_stb_cmmu(CPUArchState *env, target_ulong addr, uint8_t val, |
|
27 |
int mmu_idx); |
|
28 | 45 |
uint16_t helper_ldw_cmmu(CPUArchState *env, target_ulong addr, int mmu_idx); |
29 |
void helper_stw_cmmu(CPUArchState *env, target_ulong addr, uint16_t val, |
|
30 |
int mmu_idx); |
|
31 | 46 |
uint32_t helper_ldl_cmmu(CPUArchState *env, target_ulong addr, int mmu_idx); |
32 |
void helper_stl_cmmu(CPUArchState *env, target_ulong addr, uint32_t val, |
|
33 |
int mmu_idx); |
|
34 | 47 |
uint64_t helper_ldq_cmmu(CPUArchState *env, target_ulong addr, int mmu_idx); |
35 |
void helper_stq_cmmu(CPUArchState *env, target_ulong addr, uint64_t val, |
|
36 |
int mmu_idx); |
|
37 |
#endif |
|
48 |
|
|
49 |
#endif /* SOFTMMU_DEFS_H */ |
b/include/exec/softmmu_template.h | ||
---|---|---|
78 | 78 |
} |
79 | 79 |
|
80 | 80 |
/* handle all cases except unaligned access which span two pages */ |
81 |
#ifdef SOFTMMU_CODE_ACCESS |
|
82 |
static |
|
83 |
#endif |
|
81 | 84 |
DATA_TYPE |
82 |
glue(glue(helper_ld, SUFFIX), MMUSUFFIX)(CPUArchState *env, target_ulong addr, |
|
83 |
int mmu_idx) |
|
85 |
glue(glue(helper_ret_ld, SUFFIX), MMUSUFFIX)(CPUArchState *env, |
|
86 |
target_ulong addr, int mmu_idx, |
|
87 |
uintptr_t retaddr) |
|
84 | 88 |
{ |
85 | 89 |
DATA_TYPE res; |
86 | 90 |
int index; |
87 | 91 |
target_ulong tlb_addr; |
88 | 92 |
hwaddr ioaddr; |
89 |
uintptr_t retaddr; |
|
90 | 93 |
|
91 | 94 |
/* test if there is match for unaligned or IO access */ |
92 | 95 |
/* XXX: could done more in memory macro in a non portable way */ |
... | ... | |
98 | 101 |
/* IO access */ |
99 | 102 |
if ((addr & (DATA_SIZE - 1)) != 0) |
100 | 103 |
goto do_unaligned_access; |
101 |
retaddr = GETPC_EXT(); |
|
102 | 104 |
ioaddr = env->iotlb[mmu_idx][index]; |
103 | 105 |
res = glue(io_read, SUFFIX)(env, ioaddr, addr, retaddr); |
104 | 106 |
} else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) { |
105 | 107 |
/* slow unaligned access (it spans two pages or IO) */ |
106 | 108 |
do_unaligned_access: |
107 |
retaddr = GETPC_EXT(); |
|
108 | 109 |
#ifdef ALIGNED_ONLY |
109 | 110 |
do_unaligned_access(env, addr, READ_ACCESS_TYPE, mmu_idx, retaddr); |
110 | 111 |
#endif |
... | ... | |
115 | 116 |
uintptr_t addend; |
116 | 117 |
#ifdef ALIGNED_ONLY |
117 | 118 |
if ((addr & (DATA_SIZE - 1)) != 0) { |
118 |
retaddr = GETPC_EXT(); |
|
119 | 119 |
do_unaligned_access(env, addr, READ_ACCESS_TYPE, mmu_idx, retaddr); |
120 | 120 |
} |
121 | 121 |
#endif |
... | ... | |
124 | 124 |
(addr + addend)); |
125 | 125 |
} |
126 | 126 |
} else { |
127 |
/* the page is not in the TLB : fill it */ |
|
128 |
retaddr = GETPC_EXT(); |
|
129 | 127 |
#ifdef ALIGNED_ONLY |
130 | 128 |
if ((addr & (DATA_SIZE - 1)) != 0) |
131 | 129 |
do_unaligned_access(env, addr, READ_ACCESS_TYPE, mmu_idx, retaddr); |
... | ... | |
136 | 134 |
return res; |
137 | 135 |
} |
138 | 136 |
|
137 |
DATA_TYPE |
|
138 |
glue(glue(helper_ld, SUFFIX), MMUSUFFIX)(CPUArchState *env, target_ulong addr, |
|
139 |
int mmu_idx) |
|
140 |
{ |
|
141 |
return glue(glue(helper_ret_ld, SUFFIX), MMUSUFFIX)(env, addr, mmu_idx, |
|
142 |
GETPC_EXT()); |
|
143 |
} |
|
144 |
|
|
139 | 145 |
/* handle all unaligned cases */ |
140 | 146 |
static DATA_TYPE |
141 | 147 |
glue(glue(slow_ld, SUFFIX), MMUSUFFIX)(CPUArchState *env, |
... | ... | |
214 | 220 |
io_mem_write(mr, physaddr, val, 1 << SHIFT); |
215 | 221 |
} |
216 | 222 |
|
217 |
void glue(glue(helper_st, SUFFIX), MMUSUFFIX)(CPUArchState *env, |
|
218 |
target_ulong addr, DATA_TYPE val, |
|
219 |
int mmu_idx) |
|
223 |
void |
|
224 |
glue(glue(helper_ret_st, SUFFIX), MMUSUFFIX)(CPUArchState *env, |
|
225 |
target_ulong addr, DATA_TYPE val, |
|
226 |
int mmu_idx, uintptr_t retaddr) |
|
220 | 227 |
{ |
221 | 228 |
hwaddr ioaddr; |
222 | 229 |
target_ulong tlb_addr; |
223 |
uintptr_t retaddr; |
|
224 | 230 |
int index; |
225 | 231 |
|
226 | 232 |
index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1); |
... | ... | |
231 | 237 |
/* IO access */ |
232 | 238 |
if ((addr & (DATA_SIZE - 1)) != 0) |
233 | 239 |
goto do_unaligned_access; |
234 |
retaddr = GETPC_EXT(); |
|
235 | 240 |
ioaddr = env->iotlb[mmu_idx][index]; |
236 | 241 |
glue(io_write, SUFFIX)(env, ioaddr, val, addr, retaddr); |
237 | 242 |
} else if (((addr & ~TARGET_PAGE_MASK) + DATA_SIZE - 1) >= TARGET_PAGE_SIZE) { |
238 | 243 |
do_unaligned_access: |
239 |
retaddr = GETPC_EXT(); |
|
240 | 244 |
#ifdef ALIGNED_ONLY |
241 | 245 |
do_unaligned_access(env, addr, 1, mmu_idx, retaddr); |
242 | 246 |
#endif |
... | ... | |
247 | 251 |
uintptr_t addend; |
248 | 252 |
#ifdef ALIGNED_ONLY |
249 | 253 |
if ((addr & (DATA_SIZE - 1)) != 0) { |
250 |
retaddr = GETPC_EXT(); |
|
251 | 254 |
do_unaligned_access(env, addr, 1, mmu_idx, retaddr); |
252 | 255 |
} |
253 | 256 |
#endif |
... | ... | |
257 | 260 |
} |
258 | 261 |
} else { |
259 | 262 |
/* the page is not in the TLB : fill it */ |
260 |
retaddr = GETPC_EXT(); |
|
261 | 263 |
#ifdef ALIGNED_ONLY |
262 | 264 |
if ((addr & (DATA_SIZE - 1)) != 0) |
263 | 265 |
do_unaligned_access(env, addr, 1, mmu_idx, retaddr); |
... | ... | |
267 | 269 |
} |
268 | 270 |
} |
269 | 271 |
|
272 |
void |
|
273 |
glue(glue(helper_st, SUFFIX), MMUSUFFIX)(CPUArchState *env, target_ulong addr, |
|
274 |
DATA_TYPE val, int mmu_idx) |
|
275 |
{ |
|
276 |
glue(glue(helper_ret_st, SUFFIX), MMUSUFFIX)(env, addr, val, mmu_idx, |
|
277 |
GETPC_EXT()); |
|
278 |
} |
|
279 |
|
|
270 | 280 |
/* handles all unaligned cases */ |
271 | 281 |
static void glue(glue(slow_st, SUFFIX), MMUSUFFIX)(CPUArchState *env, |
272 | 282 |
target_ulong addr, |
Also available in: Unified diff