Commit d07edbfa0022c86567f3460378008a654e532820
1 parent
059809e4
Fix Arm cp15 c13 (Process ID) register writes.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2067 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
10 additions
and
2 deletions
target-arm/helper.c
@@ -494,10 +494,18 @@ void helper_set_cp15(CPUState *env, uint32_t insn, uint32_t val) | @@ -494,10 +494,18 @@ void helper_set_cp15(CPUState *env, uint32_t insn, uint32_t val) | ||
494 | case 13: /* Process ID. */ | 494 | case 13: /* Process ID. */ |
495 | switch (op2) { | 495 | switch (op2) { |
496 | case 0: | 496 | case 0: |
497 | - env->cp15.c9_data = val; | 497 | + /* Unlike real hardware the qemu TLB uses virtual addresses, |
498 | + not modified virtual addresses, so this causes a TLB flush. | ||
499 | + */ | ||
500 | + if (env->cp15.c13_fcse != val) | ||
501 | + tlb_flush(env, 1); | ||
502 | + env->cp15.c13_fcse = val; | ||
498 | break; | 503 | break; |
499 | case 1: | 504 | case 1: |
500 | - env->cp15.c9_insn = val; | 505 | + /* This changes the ASID, so do a TLB flush. */ |
506 | + if (env->cp15.c13_context != val) | ||
507 | + tlb_flush(env, 0); | ||
508 | + env->cp15.c13_context = val; | ||
501 | break; | 509 | break; |
502 | default: | 510 | default: |
503 | goto bad_reg; | 511 | goto bad_reg; |