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 | 494 | case 13: /* Process ID. */ |
| 495 | 495 | switch (op2) { |
| 496 | 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 | 503 | break; |
| 499 | 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 | 509 | break; |
| 502 | 510 | default: |
| 503 | 511 | goto bad_reg; | ... | ... |