diff options
author | Paul Brook <paul@codesourcery.com> | 2010-03-17 02:14:28 +0000 |
---|---|---|
committer | Paul Brook <paul@codesourcery.com> | 2010-03-17 02:44:41 +0000 |
commit | d4c430a80f000d722bb70287af4d4c184a8d7006 (patch) | |
tree | 9b9d059b2158f25fc0629fddcef192e3d791b187 /target-m68k | |
parent | 409dbce54b57b85bd229174da86d77ca08508508 (diff) |
Large page TLB flush
QEMU uses a fixed page size for the CPU TLB. If the guest uses large
pages then we effectively split these into multiple smaller pages, and
populate the corresponding TLB entries on demand.
When the guest invalidates the TLB by virtual address we must invalidate
all entries covered by the large page. However the address used to
invalidate the entry may not be present in the QEMU TLB, so we do not
know which regions to clear.
Implementing a full vaiable size TLB is hard and slow, so just keep a
simple address/mask pair to record which addresses may have been mapped by
large pages. If the guest invalidates this region then flush the
whole TLB.
Signed-off-by: Paul Brook <paul@codesourcery.com>
Diffstat (limited to 'target-m68k')
-rw-r--r-- | target-m68k/helper.c | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/target-m68k/helper.c b/target-m68k/helper.c index 5d52bd34e..2dfd48f7b 100644 --- a/target-m68k/helper.c +++ b/target-m68k/helper.c @@ -368,8 +368,9 @@ int cpu_m68k_handle_mmu_fault (CPUState *env, target_ulong address, int rw, int prot; address &= TARGET_PAGE_MASK; - prot = PAGE_READ | PAGE_WRITE; - return tlb_set_page(env, address, address, prot, mmu_idx, is_softmmu); + prot = PAGE_READ | PAGE_WRITE | PAGE_EXEC; + tlb_set_page(env, address, address, prot, mmu_idx, TARGET_PAGE_SIZE); + return 0; } /* Notify CPU of a pending interrupt. Prioritization and vectoring should |