|
@@ -1981,7 +1981,7 @@ static void *atomic_mmu_lookup(CPUArchState *env, vaddr addr, MemOpIdx oi,
|
|
|
*/
|
|
|
goto stop_the_world;
|
|
|
}
|
|
|
- /* Collect TLB_WATCHPOINT for read. */
|
|
|
+ /* Collect tlb flags for read. */
|
|
|
tlb_addr |= tlbe->addr_read;
|
|
|
|
|
|
/* Notice an IO access or a needs-MMU-lookup access */
|
|
@@ -1998,9 +1998,19 @@ static void *atomic_mmu_lookup(CPUArchState *env, vaddr addr, MemOpIdx oi,
|
|
|
notdirty_write(env_cpu(env), addr, size, full, retaddr);
|
|
|
}
|
|
|
|
|
|
- if (unlikely(tlb_addr & TLB_WATCHPOINT)) {
|
|
|
- cpu_check_watchpoint(env_cpu(env), addr, size, full->attrs,
|
|
|
- BP_MEM_READ | BP_MEM_WRITE, retaddr);
|
|
|
+ if (unlikely(tlb_addr & TLB_FORCE_SLOW)) {
|
|
|
+ int wp_flags = 0;
|
|
|
+
|
|
|
+ if (full->slow_flags[MMU_DATA_STORE] & TLB_WATCHPOINT) {
|
|
|
+ wp_flags |= BP_MEM_WRITE;
|
|
|
+ }
|
|
|
+ if (full->slow_flags[MMU_DATA_LOAD] & TLB_WATCHPOINT) {
|
|
|
+ wp_flags |= BP_MEM_READ;
|
|
|
+ }
|
|
|
+ if (wp_flags) {
|
|
|
+ cpu_check_watchpoint(env_cpu(env), addr, size,
|
|
|
+ full->attrs, wp_flags, retaddr);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
return hostaddr;
|