Signed-off-by: Richard Henderson <richard.hender...@linaro.org>
---
target/i386/tcg/helper-tcg.h | 6 +++---
target/i386/tcg/sysemu/excp_helper.c | 28 ++++++++++++++++------------
target/i386/tcg/tcg-cpu.c | 2 +-
3 files changed, 20 insertions(+), 16 deletions(-)
diff --git a/target/i386/tcg/helper-tcg.h b/target/i386/tcg/helper-tcg.h
index 696d6ef016..b2164f41e6 100644
--- a/target/i386/tcg/helper-tcg.h
+++ b/target/i386/tcg/helper-tcg.h
@@ -79,9 +79,9 @@ void x86_cpu_record_sigsegv(CPUState *cs, vaddr addr,
void x86_cpu_record_sigbus(CPUState *cs, vaddr addr,
MMUAccessType access_type, uintptr_t ra);
#else
-bool x86_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
- MMUAccessType access_type, int mmu_idx,
- bool probe, uintptr_t retaddr);
+bool x86_cpu_tlb_fill_align(CPUState *cs, CPUTLBEntryFull *out, vaddr addr,
+ MMUAccessType access_type, int mmu_idx,
+ MemOp memop, int size, bool probe, uintptr_t ra);
G_NORETURN void x86_cpu_do_unaligned_access(CPUState *cs, vaddr vaddr,
MMUAccessType access_type,
int mmu_idx, uintptr_t retaddr);
diff --git a/target/i386/tcg/sysemu/excp_helper.c
b/target/i386/tcg/sysemu/excp_helper.c
index 168ff8e5f3..d23d28fef5 100644
--- a/target/i386/tcg/sysemu/excp_helper.c
+++ b/target/i386/tcg/sysemu/excp_helper.c
@@ -601,25 +601,29 @@ static bool get_physical_address(CPUX86State *env, vaddr
addr,
return true;
}
-bool x86_cpu_tlb_fill(CPUState *cs, vaddr addr, int size,
- MMUAccessType access_type, int mmu_idx,
- bool probe, uintptr_t retaddr)
+bool x86_cpu_tlb_fill_align(CPUState *cs, CPUTLBEntryFull *full, vaddr addr,
+ MMUAccessType access_type, int mmu_idx,
+ MemOp memop, int size, bool probe,
+ uintptr_t retaddr)
{
CPUX86State *env = cpu_env(cs);
TranslateResult out;
TranslateFault err;
+ if (addr & ((1 << memop_alignment_bits(memop)) - 1)) {
+ if (probe) {
+ return false;
+ }
+ x86_cpu_do_unaligned_access(cs, addr, access_type, mmu_idx, retaddr);
+ }
+
if (get_physical_address(env, addr, access_type, mmu_idx, &out, &err,
retaddr)) {
- /*
- * Even if 4MB pages, we map only one 4KB page in the cache to
- * avoid filling it too fast.
- */
- assert(out.prot & (1 << access_type));
- tlb_set_page_with_attrs(cs, addr & TARGET_PAGE_MASK,
- out.paddr & TARGET_PAGE_MASK,
- cpu_get_mem_attrs(env),
- out.prot, mmu_idx, out.page_size);
+ memset(full, 0, sizeof(*full));
+ full->phys_addr = out.paddr;
+ full->prot = out.prot;
+ full->lg_page_size = ctz32(out.page_size);
+ full->attrs = cpu_get_mem_attrs(env);
return true;
}
diff --git a/target/i386/tcg/tcg-cpu.c b/target/i386/tcg/tcg-cpu.c
index cca19cd40e..6fce6227c7 100644
--- a/target/i386/tcg/tcg-cpu.c
+++ b/target/i386/tcg/tcg-cpu.c
@@ -117,7 +117,7 @@ static const TCGCPUOps x86_tcg_ops = {
.record_sigsegv = x86_cpu_record_sigsegv,
.record_sigbus = x86_cpu_record_sigbus,
#else
- .tlb_fill = x86_cpu_tlb_fill,
+ .tlb_fill_align = x86_cpu_tlb_fill_align,
.do_interrupt = x86_cpu_do_interrupt,
.cpu_exec_halt = x86_cpu_exec_halt,
.cpu_exec_interrupt = x86_cpu_exec_interrupt,