Revision c36bbb28 target-mips/op_helper.c
b/target-mips/op_helper.c | ||
---|---|---|
276 | 276 |
#endif |
277 | 277 |
|
278 | 278 |
#ifndef CONFIG_USER_ONLY |
279 |
|
|
280 |
static inline target_phys_addr_t do_translate_address(target_ulong address, int rw) |
|
281 |
{ |
|
282 |
target_phys_addr_t lladdr; |
|
283 |
|
|
284 |
lladdr = cpu_mips_translate_address(env, address, rw); |
|
285 |
|
|
286 |
if (lladdr == -1LL) { |
|
287 |
cpu_loop_exit(); |
|
288 |
} else { |
|
289 |
return lladdr; |
|
290 |
} |
|
291 |
} |
|
292 |
|
|
279 | 293 |
#define HELPER_LD_ATOMIC(name, insn) \ |
280 | 294 |
target_ulong helper_##name(target_ulong arg, int mem_idx) \ |
281 | 295 |
{ \ |
282 |
env->lladdr = do_translate_address(env, arg, 0); \
|
|
296 |
env->lladdr = do_translate_address(arg, 0); \
|
|
283 | 297 |
env->llval = do_##insn(arg, mem_idx); \ |
284 | 298 |
return env->llval; \ |
285 | 299 |
} |
... | ... | |
298 | 312 |
env->CP0_BadVAddr = arg2; \ |
299 | 313 |
helper_raise_exception(EXCP_AdES); \ |
300 | 314 |
} \ |
301 |
if (do_translate_address(env, arg2, 1) == env->lladdr) { \
|
|
315 |
if (do_translate_address(arg2, 1) == env->lladdr) { \
|
|
302 | 316 |
tmp = do_##ld_insn(arg2, mem_idx); \ |
303 | 317 |
if (tmp == env->llval) { \ |
304 | 318 |
do_##st_insn(arg2, arg1, mem_idx); \ |
Also available in: Unified diff