Commit 24741ef3de1de0e5dca6ebf621d405f2ac0919af
1 parent
74c33bed
avoid using physical accesses in user emulation
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1592 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
4 changed files
with
156 additions
and
142 deletions
exec.c
... | ... | @@ -2152,20 +2152,6 @@ void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf, |
2152 | 2152 | } |
2153 | 2153 | } |
2154 | 2154 | |
2155 | -/* never used */ | |
2156 | -uint32_t ldl_phys(target_phys_addr_t addr) | |
2157 | -{ | |
2158 | - return 0; | |
2159 | -} | |
2160 | - | |
2161 | -void stl_phys_notdirty(target_phys_addr_t addr, uint32_t val) | |
2162 | -{ | |
2163 | -} | |
2164 | - | |
2165 | -void stl_phys(target_phys_addr_t addr, uint32_t val) | |
2166 | -{ | |
2167 | -} | |
2168 | - | |
2169 | 2155 | #else |
2170 | 2156 | void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf, |
2171 | 2157 | int len, int is_write) | ... | ... |
target-ppc/helper.c
... | ... | @@ -36,6 +36,32 @@ |
36 | 36 | /*****************************************************************************/ |
37 | 37 | /* PowerPC MMU emulation */ |
38 | 38 | |
39 | +#if defined(CONFIG_USER_ONLY) | |
40 | +int cpu_ppc_handle_mmu_fault (CPUState *env, uint32_t address, int rw, | |
41 | + int is_user, int is_softmmu) | |
42 | +{ | |
43 | + int exception, error_code; | |
44 | + | |
45 | + if (rw == 2) { | |
46 | + exception = EXCP_ISI; | |
47 | + error_code = 0; | |
48 | + } else { | |
49 | + exception = EXCP_DSI; | |
50 | + error_code = 0; | |
51 | + if (rw) | |
52 | + error_code |= 0x02000000; | |
53 | + env->spr[SPR_DAR] = address; | |
54 | + env->spr[SPR_DSISR] = error_code; | |
55 | + } | |
56 | + env->exception_index = exception; | |
57 | + env->error_code = error_code; | |
58 | + return 1; | |
59 | +} | |
60 | +target_ulong cpu_get_phys_page_debug(CPUState *env, target_ulong addr) | |
61 | +{ | |
62 | + return addr; | |
63 | +} | |
64 | +#else | |
39 | 65 | /* Perform BAT hit & translation */ |
40 | 66 | static int get_bat (CPUState *env, uint32_t *real, int *prot, |
41 | 67 | uint32_t virtual, int rw, int type) |
... | ... | @@ -355,8 +381,8 @@ static int get_segment (CPUState *env, uint32_t *real, int *prot, |
355 | 381 | return ret; |
356 | 382 | } |
357 | 383 | |
358 | -int get_physical_address (CPUState *env, uint32_t *physical, int *prot, | |
359 | - uint32_t address, int rw, int access_type) | |
384 | +static int get_physical_address (CPUState *env, uint32_t *physical, int *prot, | |
385 | + uint32_t address, int rw, int access_type) | |
360 | 386 | { |
361 | 387 | int ret; |
362 | 388 | #if 0 |
... | ... | @@ -387,12 +413,6 @@ int get_physical_address (CPUState *env, uint32_t *physical, int *prot, |
387 | 413 | return ret; |
388 | 414 | } |
389 | 415 | |
390 | -#if defined(CONFIG_USER_ONLY) | |
391 | -target_ulong cpu_get_phys_page_debug(CPUState *env, target_ulong addr) | |
392 | -{ | |
393 | - return addr; | |
394 | -} | |
395 | -#else | |
396 | 416 | target_ulong cpu_get_phys_page_debug(CPUState *env, target_ulong addr) |
397 | 417 | { |
398 | 418 | uint32_t phys_addr; |
... | ... | @@ -402,7 +422,6 @@ target_ulong cpu_get_phys_page_debug(CPUState *env, target_ulong addr) |
402 | 422 | return -1; |
403 | 423 | return phys_addr; |
404 | 424 | } |
405 | -#endif | |
406 | 425 | |
407 | 426 | /* Perform address translation */ |
408 | 427 | int cpu_ppc_handle_mmu_fault (CPUState *env, uint32_t address, int rw, |
... | ... | @@ -523,6 +542,7 @@ int cpu_ppc_handle_mmu_fault (CPUState *env, uint32_t address, int rw, |
523 | 542 | } |
524 | 543 | return ret; |
525 | 544 | } |
545 | +#endif | |
526 | 546 | |
527 | 547 | /*****************************************************************************/ |
528 | 548 | /* BATs management */ | ... | ... |
target-sparc/helper.c
... | ... | @@ -230,7 +230,107 @@ int cpu_sparc_handle_mmu_fault (CPUState *env, target_ulong address, int rw, |
230 | 230 | return 1; |
231 | 231 | } |
232 | 232 | } |
233 | -#else | |
233 | + | |
234 | +target_ulong mmu_probe(CPUState *env, target_ulong address, int mmulev) | |
235 | +{ | |
236 | + target_phys_addr_t pde_ptr; | |
237 | + uint32_t pde; | |
238 | + | |
239 | + /* Context base + context number */ | |
240 | + pde_ptr = (env->mmuregs[1] << 4) + (env->mmuregs[2] << 2); | |
241 | + pde = ldl_phys(pde_ptr); | |
242 | + | |
243 | + switch (pde & PTE_ENTRYTYPE_MASK) { | |
244 | + default: | |
245 | + case 0: /* Invalid */ | |
246 | + case 2: /* PTE, maybe should not happen? */ | |
247 | + case 3: /* Reserved */ | |
248 | + return 0; | |
249 | + case 1: /* L1 PDE */ | |
250 | + if (mmulev == 3) | |
251 | + return pde; | |
252 | + pde_ptr = ((address >> 22) & ~3) + ((pde & ~3) << 4); | |
253 | + pde = ldl_phys(pde_ptr); | |
254 | + | |
255 | + switch (pde & PTE_ENTRYTYPE_MASK) { | |
256 | + default: | |
257 | + case 0: /* Invalid */ | |
258 | + case 3: /* Reserved */ | |
259 | + return 0; | |
260 | + case 2: /* L1 PTE */ | |
261 | + return pde; | |
262 | + case 1: /* L2 PDE */ | |
263 | + if (mmulev == 2) | |
264 | + return pde; | |
265 | + pde_ptr = ((address & 0xfc0000) >> 16) + ((pde & ~3) << 4); | |
266 | + pde = ldl_phys(pde_ptr); | |
267 | + | |
268 | + switch (pde & PTE_ENTRYTYPE_MASK) { | |
269 | + default: | |
270 | + case 0: /* Invalid */ | |
271 | + case 3: /* Reserved */ | |
272 | + return 0; | |
273 | + case 2: /* L2 PTE */ | |
274 | + return pde; | |
275 | + case 1: /* L3 PDE */ | |
276 | + if (mmulev == 1) | |
277 | + return pde; | |
278 | + pde_ptr = ((address & 0x3f000) >> 10) + ((pde & ~3) << 4); | |
279 | + pde = ldl_phys(pde_ptr); | |
280 | + | |
281 | + switch (pde & PTE_ENTRYTYPE_MASK) { | |
282 | + default: | |
283 | + case 0: /* Invalid */ | |
284 | + case 1: /* PDE, should not happen */ | |
285 | + case 3: /* Reserved */ | |
286 | + return 0; | |
287 | + case 2: /* L3 PTE */ | |
288 | + return pde; | |
289 | + } | |
290 | + } | |
291 | + } | |
292 | + } | |
293 | + return 0; | |
294 | +} | |
295 | + | |
296 | +#ifdef DEBUG_MMU | |
297 | +void dump_mmu(CPUState *env) | |
298 | +{ | |
299 | + target_ulong va, va1, va2; | |
300 | + unsigned int n, m, o; | |
301 | + target_phys_addr_t pde_ptr, pa; | |
302 | + uint32_t pde; | |
303 | + | |
304 | + printf("MMU dump:\n"); | |
305 | + pde_ptr = (env->mmuregs[1] << 4) + (env->mmuregs[2] << 2); | |
306 | + pde = ldl_phys(pde_ptr); | |
307 | + printf("Root ptr: " TARGET_FMT_lx ", ctx: %d\n", env->mmuregs[1] << 4, env->mmuregs[2]); | |
308 | + for (n = 0, va = 0; n < 256; n++, va += 16 * 1024 * 1024) { | |
309 | + pde_ptr = mmu_probe(env, va, 2); | |
310 | + if (pde_ptr) { | |
311 | + pa = cpu_get_phys_page_debug(env, va); | |
312 | + printf("VA: " TARGET_FMT_lx ", PA: " TARGET_FMT_lx " PDE: " TARGET_FMT_lx "\n", va, pa, pde_ptr); | |
313 | + for (m = 0, va1 = va; m < 64; m++, va1 += 256 * 1024) { | |
314 | + pde_ptr = mmu_probe(env, va1, 1); | |
315 | + if (pde_ptr) { | |
316 | + pa = cpu_get_phys_page_debug(env, va1); | |
317 | + printf(" VA: " TARGET_FMT_lx ", PA: " TARGET_FMT_lx " PDE: " TARGET_FMT_lx "\n", va1, pa, pde_ptr); | |
318 | + for (o = 0, va2 = va1; o < 64; o++, va2 += 4 * 1024) { | |
319 | + pde_ptr = mmu_probe(env, va2, 0); | |
320 | + if (pde_ptr) { | |
321 | + pa = cpu_get_phys_page_debug(env, va2); | |
322 | + printf(" VA: " TARGET_FMT_lx ", PA: " TARGET_FMT_lx " PTE: " TARGET_FMT_lx "\n", va2, pa, pde_ptr); | |
323 | + } | |
324 | + } | |
325 | + } | |
326 | + } | |
327 | + } | |
328 | + } | |
329 | + printf("MMU dump ends\n"); | |
330 | +} | |
331 | +#endif /* DEBUG_MMU */ | |
332 | + | |
333 | +#else /* !TARGET_SPARC64 */ | |
234 | 334 | /* |
235 | 335 | * UltraSparc IIi I/DMMUs |
236 | 336 | */ |
... | ... | @@ -382,121 +482,6 @@ int cpu_sparc_handle_mmu_fault (CPUState *env, target_ulong address, int rw, |
382 | 482 | return 1; |
383 | 483 | } |
384 | 484 | |
385 | -#endif | |
386 | -#endif | |
387 | - | |
388 | -void memcpy32(target_ulong *dst, const target_ulong *src) | |
389 | -{ | |
390 | - dst[0] = src[0]; | |
391 | - dst[1] = src[1]; | |
392 | - dst[2] = src[2]; | |
393 | - dst[3] = src[3]; | |
394 | - dst[4] = src[4]; | |
395 | - dst[5] = src[5]; | |
396 | - dst[6] = src[6]; | |
397 | - dst[7] = src[7]; | |
398 | -} | |
399 | - | |
400 | -#if !defined(TARGET_SPARC64) | |
401 | -target_ulong mmu_probe(CPUState *env, target_ulong address, int mmulev) | |
402 | -{ | |
403 | - target_phys_addr_t pde_ptr; | |
404 | - uint32_t pde; | |
405 | - | |
406 | - /* Context base + context number */ | |
407 | - pde_ptr = (env->mmuregs[1] << 4) + (env->mmuregs[2] << 2); | |
408 | - pde = ldl_phys(pde_ptr); | |
409 | - | |
410 | - switch (pde & PTE_ENTRYTYPE_MASK) { | |
411 | - default: | |
412 | - case 0: /* Invalid */ | |
413 | - case 2: /* PTE, maybe should not happen? */ | |
414 | - case 3: /* Reserved */ | |
415 | - return 0; | |
416 | - case 1: /* L1 PDE */ | |
417 | - if (mmulev == 3) | |
418 | - return pde; | |
419 | - pde_ptr = ((address >> 22) & ~3) + ((pde & ~3) << 4); | |
420 | - pde = ldl_phys(pde_ptr); | |
421 | - | |
422 | - switch (pde & PTE_ENTRYTYPE_MASK) { | |
423 | - default: | |
424 | - case 0: /* Invalid */ | |
425 | - case 3: /* Reserved */ | |
426 | - return 0; | |
427 | - case 2: /* L1 PTE */ | |
428 | - return pde; | |
429 | - case 1: /* L2 PDE */ | |
430 | - if (mmulev == 2) | |
431 | - return pde; | |
432 | - pde_ptr = ((address & 0xfc0000) >> 16) + ((pde & ~3) << 4); | |
433 | - pde = ldl_phys(pde_ptr); | |
434 | - | |
435 | - switch (pde & PTE_ENTRYTYPE_MASK) { | |
436 | - default: | |
437 | - case 0: /* Invalid */ | |
438 | - case 3: /* Reserved */ | |
439 | - return 0; | |
440 | - case 2: /* L2 PTE */ | |
441 | - return pde; | |
442 | - case 1: /* L3 PDE */ | |
443 | - if (mmulev == 1) | |
444 | - return pde; | |
445 | - pde_ptr = ((address & 0x3f000) >> 10) + ((pde & ~3) << 4); | |
446 | - pde = ldl_phys(pde_ptr); | |
447 | - | |
448 | - switch (pde & PTE_ENTRYTYPE_MASK) { | |
449 | - default: | |
450 | - case 0: /* Invalid */ | |
451 | - case 1: /* PDE, should not happen */ | |
452 | - case 3: /* Reserved */ | |
453 | - return 0; | |
454 | - case 2: /* L3 PTE */ | |
455 | - return pde; | |
456 | - } | |
457 | - } | |
458 | - } | |
459 | - } | |
460 | - return 0; | |
461 | -} | |
462 | - | |
463 | -#ifdef DEBUG_MMU | |
464 | -void dump_mmu(CPUState *env) | |
465 | -{ | |
466 | - target_ulong va, va1, va2; | |
467 | - unsigned int n, m, o; | |
468 | - target_phys_addr_t pde_ptr, pa; | |
469 | - uint32_t pde; | |
470 | - | |
471 | - printf("MMU dump:\n"); | |
472 | - pde_ptr = (env->mmuregs[1] << 4) + (env->mmuregs[2] << 2); | |
473 | - pde = ldl_phys(pde_ptr); | |
474 | - printf("Root ptr: " TARGET_FMT_lx ", ctx: %d\n", env->mmuregs[1] << 4, env->mmuregs[2]); | |
475 | - for (n = 0, va = 0; n < 256; n++, va += 16 * 1024 * 1024) { | |
476 | - pde_ptr = mmu_probe(env, va, 2); | |
477 | - if (pde_ptr) { | |
478 | - pa = cpu_get_phys_page_debug(env, va); | |
479 | - printf("VA: " TARGET_FMT_lx ", PA: " TARGET_FMT_lx " PDE: " TARGET_FMT_lx "\n", va, pa, pde_ptr); | |
480 | - for (m = 0, va1 = va; m < 64; m++, va1 += 256 * 1024) { | |
481 | - pde_ptr = mmu_probe(env, va1, 1); | |
482 | - if (pde_ptr) { | |
483 | - pa = cpu_get_phys_page_debug(env, va1); | |
484 | - printf(" VA: " TARGET_FMT_lx ", PA: " TARGET_FMT_lx " PDE: " TARGET_FMT_lx "\n", va1, pa, pde_ptr); | |
485 | - for (o = 0, va2 = va1; o < 64; o++, va2 += 4 * 1024) { | |
486 | - pde_ptr = mmu_probe(env, va2, 0); | |
487 | - if (pde_ptr) { | |
488 | - pa = cpu_get_phys_page_debug(env, va2); | |
489 | - printf(" VA: " TARGET_FMT_lx ", PA: " TARGET_FMT_lx " PTE: " TARGET_FMT_lx "\n", va2, pa, pde_ptr); | |
490 | - } | |
491 | - } | |
492 | - } | |
493 | - } | |
494 | - } | |
495 | - } | |
496 | - printf("MMU dump ends\n"); | |
497 | -} | |
498 | -#endif | |
499 | -#else | |
500 | 485 | #ifdef DEBUG_MMU |
501 | 486 | void dump_mmu(CPUState *env) |
502 | 487 | { |
... | ... | @@ -568,5 +553,19 @@ void dump_mmu(CPUState *env) |
568 | 553 | } |
569 | 554 | } |
570 | 555 | } |
571 | -#endif | |
572 | -#endif | |
556 | +#endif /* DEBUG_MMU */ | |
557 | + | |
558 | +#endif /* TARGET_SPARC64 */ | |
559 | +#endif /* !CONFIG_USER_ONLY */ | |
560 | + | |
561 | +void memcpy32(target_ulong *dst, const target_ulong *src) | |
562 | +{ | |
563 | + dst[0] = src[0]; | |
564 | + dst[1] = src[1]; | |
565 | + dst[2] = src[2]; | |
566 | + dst[3] = src[3]; | |
567 | + dst[4] = src[4]; | |
568 | + dst[5] = src[5]; | |
569 | + dst[6] = src[6]; | |
570 | + dst[7] = src[7]; | |
571 | +} | ... | ... |
target-sparc/op_helper.c
... | ... | @@ -221,6 +221,15 @@ void do_fcmpd_fcc3 (void) |
221 | 221 | #undef FS |
222 | 222 | #endif |
223 | 223 | |
224 | +#if defined(CONFIG_USER_ONLY) | |
225 | +void helper_ld_asi(int asi, int size, int sign) | |
226 | +{ | |
227 | +} | |
228 | + | |
229 | +void helper_st_asi(int asi, int size, int sign) | |
230 | +{ | |
231 | +} | |
232 | +#else | |
224 | 233 | #ifndef TARGET_SPARC64 |
225 | 234 | void helper_ld_asi(int asi, int size, int sign) |
226 | 235 | { |
... | ... | @@ -727,8 +736,8 @@ void helper_st_asi(int asi, int size, int sign) |
727 | 736 | return; |
728 | 737 | } |
729 | 738 | } |
730 | - | |
731 | 739 | #endif |
740 | +#endif /* !CONFIG_USER_ONLY */ | |
732 | 741 | |
733 | 742 | #ifndef TARGET_SPARC64 |
734 | 743 | void helper_rett() | ... | ... |