[RFC PATCH 12/18] accel/tcg: Replace size with first/last in TCGCPUOps.tlb_fill*

Richard Henderson <[email protected]>
Newsgroups org.nongnu.qemu-riscv,org.nongnu.qemu-arm,org.nongnu.qemu-devel
Message-ID <[email protected]>
Expand the interfaces to allow an address within a range to be tested.
Additionally, where was an edge case of size == 0 which was ambiguous,
and is now eliminated.

Only change the functional interface.  Where required by the callee,
rebuild "size = last - addr + 1" locally.

Signed-off-by: Richard Henderson <[email protected]>
---
 include/accel/tcg/cpu-ops.h          | 16 ++++++++++++----
 target/alpha/cpu.h                   |  2 +-
 target/arm/internals.h               |  5 +++--
 target/avr/cpu.h                     |  2 +-
 target/hppa/cpu.h                    |  5 +++--
 target/i386/tcg/helper-tcg.h         |  2 +-
 target/loongarch/tcg/tcg_loongarch.h |  2 +-
 target/m68k/cpu.h                    |  2 +-
 target/microblaze/cpu.h              |  2 +-
 target/mips/tcg/tcg-internal.h       |  2 +-
 target/or1k/cpu.h                    |  2 +-
 target/ppc/internal.h                |  2 +-
 target/riscv/cpu.h                   |  2 +-
 target/s390x/s390x-internal.h        |  2 +-
 target/sh4/cpu.h                     |  2 +-
 target/sparc/cpu.h                   |  2 +-
 target/tricore/cpu.h                 |  2 +-
 target/xtensa/cpu.h                  |  2 +-
 accel/tcg/cputlb.c                   |  7 +++----
 target/alpha/helper.c                |  2 +-
 target/arm/tcg/tlb_helper.c          |  5 +++--
 target/avr/helper.c                  |  2 +-
 target/hexagon/cpu.c                 |  8 +++++---
 target/hppa/mem_helper.c             |  6 ++++--
 target/i386/tcg/system/excp_helper.c |  2 +-
 target/loongarch/tcg/tlb_helper.c    |  3 ++-
 target/m68k/helper.c                 |  3 ++-
 target/microblaze/helper.c           |  2 +-
 target/mips/tcg/system/tlb_helper.c  |  2 +-
 target/or1k/mmu.c                    |  2 +-
 target/ppc/mmu_helper.c              |  2 +-
 target/riscv/tcg/cpu_helper.c        |  3 ++-
 target/rx/cpu.c                      |  2 +-
 target/s390x/tcg/excp_helper.c       |  2 +-
 target/sh4/helper.c                  |  2 +-
 target/sparc/mmu_helper.c            |  4 ++--
 target/tricore/helper.c              |  2 +-
 target/xtensa/helper.c               |  2 +-
 38 files changed, 68 insertions(+), 51 deletions(-)

diff --git a/include/accel/tcg/cpu-ops.h b/include/accel/tcg/cpu-ops.h
index 3ff6e6810e..4f162ae5b0 100644
--- a/include/accel/tcg/cpu-ops.h
+++ b/include/accel/tcg/cpu-ops.h
@@ -196,13 +196,20 @@ struct TCGCPUOps {
      * @cpu: cpu context
      * @out: output page properties
      * @addr: virtual address
+     * @first: beginning of virtual address range
+     * @last: end of virtual address range
      * @access_type: read, write or execute
      * @mmu_idx: mmu context
      * @memop: memory operation for the access
-     * @size: memory access size, or 0 for whole page
      * @probe: test only, no fault
      * @ra: host return address for exception unwind
      *
+     * The access in progress is [@first, @last], where @addr is somewhere
+     * in that range.  Normally @addr == @first, but some targets have
+     * accesses which are forcibly aligned after an initial fault for an
+     * inaccessible page (e.g. Arm DC_ZVA, where [@first, @last] will be
+     * the bounds of the cacheline containing @addr).
+     *
      * If the access is valid, fill in @out and return true.
      * Otherwise if probe is true, return false.
      * Otherwise raise an exception and do not return.
@@ -213,9 +220,10 @@ struct TCGCPUOps {
      * Zero may be passed for @memop to skip any alignment check
      * for non-memory-access operations such as probing.
      */
-    bool (*tlb_fill_align)(CPUState *cpu, CPUTLBEntryFull *out, vaddr addr,
+    bool (*tlb_fill_align)(CPUState *cpu, CPUTLBEntryFull *out,
+                           vaddr addr, vaddr first, vaddr last,
                            MMUAccessType access_type, int mmu_idx,
-                           MemOp memop, int size, bool probe, uintptr_t ra);
+                           MemOp memop, bool probe, uintptr_t ra);
     /**
      * @tlb_fill: Handle a softmmu tlb miss
      *
@@ -223,7 +231,7 @@ struct TCGCPUOps {
      * if the access is invalid and probe is true, return false;
      * otherwise raise an exception and do not return.
      */
-    bool (*tlb_fill)(CPUState *cpu, vaddr address, int size,
+    bool (*tlb_fill)(CPUState *cpu, vaddr addr, vaddr first, vaddr last,
                      MMUAccessType access_type, int mmu_idx,
                      bool probe, uintptr_t retaddr);
     /**
diff --git a/target/alpha/cpu.h b/target/alpha/cpu.h
index 378bd96d94..1ee3a6855e 100644
--- a/target/alpha/cpu.h
+++ b/target/alpha/cpu.h
@@ -450,7 +450,7 @@ void alpha_cpu_record_sigsegv(CPUState *cs, vaddr address,
 void alpha_cpu_record_sigbus(CPUState *cs, vaddr address,
                              MMUAccessType access_type, uintptr_t retaddr);
 #else
-bool alpha_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
+bool alpha_cpu_tlb_fill(CPUState *cs, vaddr addr, vaddr first, vaddr last,
                         MMUAccessType access_type, int mmu_idx,
                         bool probe, uintptr_t retaddr);
 G_NORETURN void alpha_cpu_do_unaligned_access(CPUState *cpu, vaddr addr,
diff --git a/target/arm/internals.h b/target/arm/internals.h
index 4026f67579..6457fa06ee 100644
--- a/target/arm/internals.h
+++ b/target/arm/internals.h
@@ -1011,9 +1011,10 @@ void arm_cpu_record_sigsegv(CPUState *cpu, vaddr addr,
 void arm_cpu_record_sigbus(CPUState *cpu, vaddr addr,
                            MMUAccessType access_type, uintptr_t ra);
 #else
-bool arm_cpu_tlb_fill_align(CPUState *cs, CPUTLBEntryFull *out, vaddr addr,
+bool arm_cpu_tlb_fill_align(CPUState *cs, CPUTLBEntryFull *out,
+                            vaddr addr, vaddr first, vaddr last,
                             MMUAccessType access_type, int mmu_idx,
-                            MemOp memop, int size, bool probe, uintptr_t ra);
+                            MemOp memop, bool probe, uintptr_t ra);
 #endif
 
 static inline int arm_to_core_mmu_idx(ARMMMUIdx mmu_idx)
diff --git a/target/avr/cpu.h b/target/avr/cpu.h
index a818db753b..e40367b832 100644
--- a/target/avr/cpu.h
+++ b/target/avr/cpu.h
@@ -233,7 +233,7 @@ static inline void cpu_set_sreg(CPUAVRState *env, uint8_t sreg)
     env->sregI = (sreg >> 7) & 0x01;
 }
 
-bool avr_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
+bool avr_cpu_tlb_fill(CPUState *cs, vaddr addr, vaddr first, vaddr last,
                       MMUAccessType access_type, int mmu_idx,
                       bool probe, uintptr_t retaddr);
 
diff --git a/target/hppa/cpu.h b/target/hppa/cpu.h
index f453444d7f..bbf44ea220 100644
--- a/target/hppa/cpu.h
+++ b/target/hppa/cpu.h
@@ -391,9 +391,10 @@ void hppa_cpu_dump_state(CPUState *cs, FILE *f, int);
 void hppa_ptlbe(CPUHPPAState *env);
 hwaddr hppa_cpu_get_phys_addr_debug(CPUState *cs, vaddr addr);
 void hppa_set_ior_and_isr(CPUHPPAState *env, vaddr addr, bool mmu_disabled);
-bool hppa_cpu_tlb_fill_align(CPUState *cs, CPUTLBEntryFull *out, vaddr addr,
+bool hppa_cpu_tlb_fill_align(CPUState *cs, CPUTLBEntryFull *out,
+                             vaddr addr, vaddr first, vaddr last,
                              MMUAccessType access_type, int mmu_idx,
-                             MemOp memop, int size, bool probe, uintptr_t ra);
+                             MemOp memop, bool probe, uintptr_t ra);
 void hppa_cpu_do_interrupt(CPUState *cpu);
 bool hppa_cpu_exec_interrupt(CPUState *cpu, int int_req);
 int hppa_get_physical_address(CPUHPPAState *env, vaddr addr, int mmu_idx,
diff --git a/target/i386/tcg/helper-tcg.h b/target/i386/tcg/helper-tcg.h
index f4b2ff740d..ba0a4da322 100644
--- a/target/i386/tcg/helper-tcg.h
+++ b/target/i386/tcg/helper-tcg.h
@@ -78,7 +78,7 @@ 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,
+bool x86_cpu_tlb_fill(CPUState *cs, vaddr addr, vaddr first, vaddr last,
                       MMUAccessType access_type, int mmu_idx,
                       bool probe, uintptr_t retaddr);
 G_NORETURN void x86_cpu_do_unaligned_access(CPUState *cs, vaddr vaddr,
diff --git a/target/loongarch/tcg/tcg_loongarch.h b/target/loongarch/tcg/tcg_loongarch.h
index 7fb627f2d6..1d43dbc751 100644
--- a/target/loongarch/tcg/tcg_loongarch.h
+++ b/target/loongarch/tcg/tcg_loongarch.h
@@ -12,7 +12,7 @@
 extern const TCGCPUOps loongarch_tcg_ops;
 void loongarch_csr_translate_init(void);
 
-bool loongarch_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
+bool loongarch_cpu_tlb_fill(CPUState *cs, vaddr addr, vaddr first, vaddr last,
                             MMUAccessType access_type, int mmu_idx,
                             bool probe, uintptr_t retaddr);
 
diff --git a/target/m68k/cpu.h b/target/m68k/cpu.h
index 7cf3791108..08bdf27c7e 100644
--- a/target/m68k/cpu.h
+++ b/target/m68k/cpu.h
@@ -585,7 +585,7 @@ enum {
 #define MMU_KERNEL_IDX 0
 #define MMU_USER_IDX 1
 
-bool m68k_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
+bool m68k_cpu_tlb_fill(CPUState *cs, vaddr addr, vaddr first, vaddr last,
                        MMUAccessType access_type, int mmu_idx,
                        bool probe, uintptr_t retaddr);
 #ifndef CONFIG_USER_ONLY
diff --git a/target/microblaze/cpu.h b/target/microblaze/cpu.h
index b9602f72b9..08d2a8f843 100644
--- a/target/microblaze/cpu.h
+++ b/target/microblaze/cpu.h
@@ -413,7 +413,7 @@ void mb_translate_code(CPUState *cs, TranslationBlock *tb,
 QEMU_BUILD_BUG_ON(MSR_TB_MASK & IFLAGS_TB_MASK);
 
 #if !defined(CONFIG_USER_ONLY)
-bool mb_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
+bool mb_cpu_tlb_fill(CPUState *cs, vaddr addr, vaddr first, vaddr last,
                      MMUAccessType access_type, int mmu_idx,
                      bool probe, uintptr_t retaddr);
 
diff --git a/target/mips/tcg/tcg-internal.h b/target/mips/tcg/tcg-internal.h
index 950e6afc3f..de179d0d5f 100644
--- a/target/mips/tcg/tcg-internal.h
+++ b/target/mips/tcg/tcg-internal.h
@@ -63,7 +63,7 @@ void mips_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr,
                                     MemTxResult response, uintptr_t retaddr);
 void cpu_mips_tlb_flush(CPUMIPSState *env);
 
-bool mips_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
+bool mips_cpu_tlb_fill(CPUState *cs, vaddr addr, vaddr first, vaddr last,
                        MMUAccessType access_type, int mmu_idx,
                        bool probe, uintptr_t retaddr);
 
diff --git a/target/or1k/cpu.h b/target/or1k/cpu.h
index fc4387ce7a..8a6293c030 100644
--- a/target/or1k/cpu.h
+++ b/target/or1k/cpu.h
@@ -298,7 +298,7 @@ int print_insn_or1k(bfd_vma addr, disassemble_info *info);
 #ifndef CONFIG_USER_ONLY
 hwaddr openrisc_cpu_get_phys_addr_debug(CPUState *cpu, vaddr addr);
 
-bool openrisc_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
+bool openrisc_cpu_tlb_fill(CPUState *cs, vaddr addr, vaddr first, vaddr last,
                            MMUAccessType access_type, int mmu_idx,
                            bool probe, uintptr_t retaddr);
 
diff --git a/target/ppc/internal.h b/target/ppc/internal.h
index a3bb12afd9..3a80719a16 100644
--- a/target/ppc/internal.h
+++ b/target/ppc/internal.h
@@ -292,7 +292,7 @@ void ppc_cpu_record_sigsegv(CPUState *cs, vaddr addr,
                             MMUAccessType access_type,
                             bool maperr, uintptr_t ra);
 #else
-bool ppc_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
+bool ppc_cpu_tlb_fill(CPUState *cs, vaddr addr, vaddr first, vaddr last,
                       MMUAccessType access_type, int mmu_idx,
                       bool probe, uintptr_t retaddr);
 G_NORETURN void ppc_cpu_do_unaligned_access(CPUState *cs, vaddr addr,
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
index e980b5964d..ed712761d5 100644
--- a/target/riscv/cpu.h
+++ b/target/riscv/cpu.h
@@ -659,7 +659,7 @@ bool riscv_env_smode_dbltrp_enabled(CPURISCVState *env, bool virt);
 G_NORETURN void  riscv_cpu_do_unaligned_access(CPUState *cs, vaddr addr,
                                                MMUAccessType access_type,
                                                int mmu_idx, uintptr_t retaddr);
-bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
+bool riscv_cpu_tlb_fill(CPUState *cs, vaddr addr, vaddr first, vaddr last,
                         MMUAccessType access_type, int mmu_idx,
                         bool probe, uintptr_t retaddr);
 char *riscv_isa_string(RISCVCPU *cpu);
diff --git a/target/s390x/s390x-internal.h b/target/s390x/s390x-internal.h
index 35d1e34ef4..559a8d9201 100644
--- a/target/s390x/s390x-internal.h
+++ b/target/s390x/s390x-internal.h
@@ -271,7 +271,7 @@ void s390_cpu_record_sigsegv(CPUState *cs, vaddr address,
 void s390_cpu_record_sigbus(CPUState *cs, vaddr address,
                             MMUAccessType access_type, uintptr_t retaddr);
 #else
-bool s390_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
+bool s390_cpu_tlb_fill(CPUState *cs, vaddr addr, vaddr first, vaddr last,
                        MMUAccessType access_type, int mmu_idx,
                        bool probe, uintptr_t retaddr);
 G_NORETURN void s390x_cpu_do_unaligned_access(CPUState *cs, vaddr addr,
diff --git a/target/sh4/cpu.h b/target/sh4/cpu.h
index 3302702376..be377d4178 100644
--- a/target/sh4/cpu.h
+++ b/target/sh4/cpu.h
@@ -252,7 +252,7 @@ void sh4_translate_code(CPUState *cs, TranslationBlock *tb,
 
 #if !defined(CONFIG_USER_ONLY)
 hwaddr superh_cpu_get_phys_addr_debug(CPUState *cpu, vaddr addr);
-bool superh_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
+bool superh_cpu_tlb_fill(CPUState *cs, vaddr addr, vaddr first, vaddr last,
                          MMUAccessType access_type, int mmu_idx,
                          bool probe, uintptr_t retaddr);
 void superh_cpu_do_interrupt(CPUState *cpu);
diff --git a/target/sparc/cpu.h b/target/sparc/cpu.h
index 5f583ed9de..13ec3f4a3a 100644
--- a/target/sparc/cpu.h
+++ b/target/sparc/cpu.h
@@ -596,7 +596,7 @@ G_NORETURN void cpu_raise_exception_ra(CPUSPARCState *, int, uintptr_t);
 /* cpu_init.c */
 void cpu_sparc_set_id(CPUSPARCState *env, unsigned int cpu);
 /* mmu_helper.c */
-bool sparc_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
+bool sparc_cpu_tlb_fill(CPUState *cs, vaddr addr, vaddr first, vaddr last,
                         MMUAccessType access_type, int mmu_idx,
                         bool probe, uintptr_t retaddr);
 target_ulong mmu_probe(CPUSPARCState *env, target_ulong address, int mmulev);
diff --git a/target/tricore/cpu.h b/target/tricore/cpu.h
index 12e497d2a7..880c5e0067 100644
--- a/target/tricore/cpu.h
+++ b/target/tricore/cpu.h
@@ -260,7 +260,7 @@ void tricore_translate_code(CPUState *cs, TranslationBlock *tb,
 #define CPU_RESOLVING_TYPE TYPE_TRICORE_CPU
 
 /* helpers.c */
-bool tricore_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
+bool tricore_cpu_tlb_fill(CPUState *cs, vaddr addr, vaddr first, vaddr last,
                           MMUAccessType access_type, int mmu_idx,
                           bool probe, uintptr_t retaddr);
 
diff --git a/target/xtensa/cpu.h b/target/xtensa/cpu.h
index 442e98bd1b..46660a7dad 100644
--- a/target/xtensa/cpu.h
+++ b/target/xtensa/cpu.h
@@ -581,7 +581,7 @@ struct XtensaCPUClass {
 };
 
 #ifndef CONFIG_USER_ONLY
-bool xtensa_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
+bool xtensa_cpu_tlb_fill(CPUState *cs, vaddr addr, vaddr first, vaddr last,
                          MMUAccessType access_type, int mmu_idx,
                          bool probe, uintptr_t retaddr);
 void xtensa_cpu_do_interrupt(CPUState *cpu);
diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c
index 95db2c22e2..d559ce1ef6 100644
--- a/accel/tcg/cputlb.c
+++ b/accel/tcg/cputlb.c
@@ -1241,12 +1241,11 @@ static bool tlb_fill_align(CPUState *cpu, vaddr addr, vaddr first, vaddr last,
                            bool probe, uintptr_t ra)
 {
     const TCGCPUOps *ops = cpu->cc->tcg_ops;
-    int size = last - addr + 1;
     CPUTLBEntryFull full;
 
     if (ops->tlb_fill_align) {
-        if (ops->tlb_fill_align(cpu, &full, addr, type, mmu_idx,
-                                memop, size, probe, ra)) {
+        if (ops->tlb_fill_align(cpu, &full, addr, first, last, type, mmu_idx,
+                                memop, probe, ra)) {
             tlb_set_page_full(cpu, mmu_idx, addr, &full);
             return true;
         }
@@ -1255,7 +1254,7 @@ static bool tlb_fill_align(CPUState *cpu, vaddr addr, vaddr first, vaddr last,
         if (addr & ((1u << memop_alignment_bits(memop)) - 1)) {
             ops->do_unaligned_access(cpu, addr, type, mmu_idx, ra);
         }
-        if (ops->tlb_fill(cpu, addr, size, type, mmu_idx, probe, ra)) {
+        if (ops->tlb_fill(cpu, addr, first, last, type, mmu_idx, probe, ra)) {
             return true;
         }
     }
diff --git a/target/alpha/helper.c b/target/alpha/helper.c
index c3614ecafd..d24b206388 100644
--- a/target/alpha/helper.c
+++ b/target/alpha/helper.c
@@ -307,7 +307,7 @@ hwaddr alpha_cpu_get_phys_addr_debug(CPUState *cs, vaddr addr)
     return (fail >= 0 ? -1 : phys);
 }
 
-bool alpha_cpu_tlb_fill(CPUState *cs, vaddr addr, int size,
+bool alpha_cpu_tlb_fill(CPUState *cs, vaddr addr, vaddr first, vaddr last,
                         MMUAccessType access_type, int mmu_idx,
                         bool probe, uintptr_t retaddr)
 {
diff --git a/target/arm/tcg/tlb_helper.c b/target/arm/tcg/tlb_helper.c
index 4c3f16dc2a..826daf6772 100644
--- a/target/arm/tcg/tlb_helper.c
+++ b/target/arm/tcg/tlb_helper.c
@@ -353,9 +353,10 @@ void arm_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr,
     arm_deliver_fault(cpu, addr, access_type, mmu_idx, &fi);
 }
 
-bool arm_cpu_tlb_fill_align(CPUState *cs, CPUTLBEntryFull *out, vaddr address,
+bool arm_cpu_tlb_fill_align(CPUState *cs, CPUTLBEntryFull *out,
+                            vaddr address, vaddr first, vaddr last,
                             MMUAccessType access_type, int mmu_idx,
-                            MemOp memop, int size, bool probe, uintptr_t ra)
+                            MemOp memop, bool probe, uintptr_t ra)
 {
     ARMCPU *cpu = ARM_CPU(cs);
     GetPhysAddrResult res = {};
diff --git a/target/avr/helper.c b/target/avr/helper.c
index f452c9d904..b5cbdc7b2c 100644
--- a/target/avr/helper.c
+++ b/target/avr/helper.c
@@ -113,7 +113,7 @@ hwaddr avr_cpu_get_phys_addr_debug(CPUState *cs, vaddr addr)
     return addr; /* I assume 1:1 address correspondence */
 }
 
-bool avr_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
+bool avr_cpu_tlb_fill(CPUState *cs, vaddr address, vaddr first, vaddr last,
                       MMUAccessType access_type, int mmu_idx,
                       bool probe, uintptr_t retaddr)
 {
diff --git a/target/hexagon/cpu.c b/target/hexagon/cpu.c
index 0ddd898e6e..bfcd9b6159 100644
--- a/target/hexagon/cpu.c
+++ b/target/hexagon/cpu.c
@@ -666,11 +666,13 @@ static const char *access_type_names[] = { "MMU_DATA_LOAD ", "MMU_DATA_STORE",
 static const char *mmu_idx_names[] = { "MMU_USER_IDX", "MMU_GUEST_IDX",
                                        "MMU_KERNEL_IDX" };
 
-static bool hexagon_tlb_fill(CPUState *cs, vaddr address, int size,
-                             MMUAccessType access_type, int mmu_idx, bool probe,
-                             uintptr_t retaddr)
+static bool hexagon_tlb_fill(CPUState *cs, vaddr address,
+                             vaddr first, vaddr last,
+                             MMUAccessType access_type, int mmu_idx,
+                             bool probe, uintptr_t retaddr)
 {
     CPUHexagonState *env = cpu_env(cs);
+    int size = last - address + 1;
     int slot = 0;
     hwaddr phys;
     int prot = 0;
diff --git a/target/hppa/mem_helper.c b/target/hppa/mem_helper.c
index 01e6149c81..0427fd0917 100644
--- a/target/hppa/mem_helper.c
+++ b/target/hppa/mem_helper.c
@@ -435,11 +435,13 @@ void hppa_cpu_do_transaction_failed(CPUState *cs, hwaddr physaddr,
     }
 }
 
-bool hppa_cpu_tlb_fill_align(CPUState *cs, CPUTLBEntryFull *out, vaddr addr,
+bool hppa_cpu_tlb_fill_align(CPUState *cs, CPUTLBEntryFull *out,
+                             vaddr addr, vaddr first, vaddr last,
                              MMUAccessType type, int mmu_idx,
-                             MemOp memop, int size, bool probe, uintptr_t ra)
+                             MemOp memop, bool probe, uintptr_t ra)
 {
     CPUHPPAState *env = cpu_env(cs);
+    int size = last - addr + 1;
     int prot, excp, a_prot;
     hwaddr phys;
 
diff --git a/target/i386/tcg/system/excp_helper.c b/target/i386/tcg/system/excp_helper.c
index d7ea77c855..fd21287a8b 100644
--- a/target/i386/tcg/system/excp_helper.c
+++ b/target/i386/tcg/system/excp_helper.c
@@ -610,7 +610,7 @@ static bool get_physical_address(CPUX86State *env, vaddr addr,
     return true;
 }
 
-bool x86_cpu_tlb_fill(CPUState *cs, vaddr addr, int size,
+bool x86_cpu_tlb_fill(CPUState *cs, vaddr addr, vaddr first, vaddr last,
                       MMUAccessType access_type, int mmu_idx,
                       bool probe, uintptr_t retaddr)
 {
diff --git a/target/loongarch/tcg/tlb_helper.c b/target/loongarch/tcg/tlb_helper.c
index a4b90beca6..08c992d774 100644
--- a/target/loongarch/tcg/tlb_helper.c
+++ b/target/loongarch/tcg/tlb_helper.c
@@ -630,7 +630,8 @@ static void ptw_update_tlb(CPULoongArchState *env, MMUContext *context)
     update_tlb_index(env, context, index);
 }
 
-bool loongarch_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
+bool loongarch_cpu_tlb_fill(CPUState *cs, vaddr address,
+                            vaddr first, vaddr last,
                             MMUAccessType access_type, int mmu_idx,
                             bool probe, uintptr_t retaddr)
 {
diff --git a/target/m68k/helper.c b/target/m68k/helper.c
index 5f91d206f5..c15fb1bc05 100644
--- a/target/m68k/helper.c
+++ b/target/m68k/helper.c
@@ -954,11 +954,12 @@ void m68k_set_irq_level(M68kCPU *cpu, int level, uint8_t vector)
     }
 }
 
-bool m68k_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
+bool m68k_cpu_tlb_fill(CPUState *cs, vaddr address, vaddr first, vaddr last,
                        MMUAccessType qemu_access_type, int mmu_idx,
                        bool probe, uintptr_t retaddr)
 {
     CPUM68KState *env = cpu_env(cs);
+    int size = last - address + 1;
     hwaddr physical;
     int prot;
     int access_type;
diff --git a/target/microblaze/helper.c b/target/microblaze/helper.c
index 05a90f5ecb..65c73951ca 100644
--- a/target/microblaze/helper.c
+++ b/target/microblaze/helper.c
@@ -85,7 +85,7 @@ static bool mb_cpu_access_is_secure(MicroBlazeCPU *cpu,
     }
 }
 
-bool mb_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
+bool mb_cpu_tlb_fill(CPUState *cs, vaddr address, vaddr first, vaddr last,
                      MMUAccessType access_type, int mmu_idx,
                      bool probe, uintptr_t retaddr)
 {
diff --git a/target/mips/tcg/system/tlb_helper.c b/target/mips/tcg/system/tlb_helper.c
index 4398c6f80b..a54a98dd08 100644
--- a/target/mips/tcg/system/tlb_helper.c
+++ b/target/mips/tcg/system/tlb_helper.c
@@ -906,7 +906,7 @@ refill:
 }
 #endif
 
-bool mips_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
+bool mips_cpu_tlb_fill(CPUState *cs, vaddr address, vaddr first, vaddr last,
                        MMUAccessType access_type, int mmu_idx,
                        bool probe, uintptr_t retaddr)
 {
diff --git a/target/or1k/mmu.c b/target/or1k/mmu.c
index 3fc56e1b77..a3c0fd7089 100644
--- a/target/or1k/mmu.c
+++ b/target/or1k/mmu.c
@@ -104,7 +104,7 @@ static void raise_mmu_exception(OpenRISCCPU *cpu, vaddr address,
     cpu->env.lock_addr = -1;
 }
 
-bool openrisc_cpu_tlb_fill(CPUState *cs, vaddr addr, int size,
+bool openrisc_cpu_tlb_fill(CPUState *cs, vaddr addr, vaddr first, vaddr last,
                            MMUAccessType access_type, int mmu_idx,
                            bool probe, uintptr_t retaddr)
 {
diff --git a/target/ppc/mmu_helper.c b/target/ppc/mmu_helper.c
index ac60705402..0edaeab045 100644
--- a/target/ppc/mmu_helper.c
+++ b/target/ppc/mmu_helper.c
@@ -1358,7 +1358,7 @@ void helper_check_tlb_flush_global(CPUPPCState *env)
 }
 
 
-bool ppc_cpu_tlb_fill(CPUState *cs, vaddr eaddr, int size,
+bool ppc_cpu_tlb_fill(CPUState *cs, vaddr eaddr, vaddr first, vaddr last,
                       MMUAccessType access_type, int mmu_idx,
                       bool probe, uintptr_t retaddr)
 {
diff --git a/target/riscv/tcg/cpu_helper.c b/target/riscv/tcg/cpu_helper.c
index 07d9222652..11f2654da1 100644
--- a/target/riscv/tcg/cpu_helper.c
+++ b/target/riscv/tcg/cpu_helper.c
@@ -1649,12 +1649,13 @@ static void pmu_tlb_fill_incr_ctr(RISCVCPU *cpu, MMUAccessType access_type)
     riscv_pmu_incr_ctr(cpu, pmu_event_type);
 }
 
-bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
+bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, vaddr first, vaddr last,
                         MMUAccessType access_type, int mmu_idx,
                         bool probe, uintptr_t retaddr)
 {
     RISCVCPU *cpu = RISCV_CPU(cs);
     CPURISCVState *env = &cpu->env;
+    int size = last - address + 1;
     vaddr im_address;
     hwaddr pa = 0;
     int prot, prot2, prot_pmp;
diff --git a/target/rx/cpu.c b/target/rx/cpu.c
index 20b188c24c..5d955c3763 100644
--- a/target/rx/cpu.c
+++ b/target/rx/cpu.c
@@ -185,7 +185,7 @@ static void rx_cpu_disas_set_info(const CPUState *cpu, disassemble_info *info)
     info->print_insn = print_insn_rx;
 }
 
-static bool rx_cpu_tlb_fill(CPUState *cs, vaddr addr, int size,
+static bool rx_cpu_tlb_fill(CPUState *cs, vaddr addr, vaddr first, vaddr last,
                             MMUAccessType access_type, int mmu_idx,
                             bool probe, uintptr_t retaddr)
 {
diff --git a/target/s390x/tcg/excp_helper.c b/target/s390x/tcg/excp_helper.c
index d952bb20cf..d9f68e1afc 100644
--- a/target/s390x/tcg/excp_helper.c
+++ b/target/s390x/tcg/excp_helper.c
@@ -145,7 +145,7 @@ static inline uint64_t cpu_mmu_idx_to_asc(int mmu_idx)
     }
 }
 
-bool s390_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
+bool s390_cpu_tlb_fill(CPUState *cs, vaddr address, vaddr first, vaddr last,
                        MMUAccessType access_type, int mmu_idx,
                        bool probe, uintptr_t retaddr)
 {
diff --git a/target/sh4/helper.c b/target/sh4/helper.c
index b6b057f104..1fe1fe0275 100644
--- a/target/sh4/helper.c
+++ b/target/sh4/helper.c
@@ -798,7 +798,7 @@ bool superh_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
     return false;
 }
 
-bool superh_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
+bool superh_cpu_tlb_fill(CPUState *cs, vaddr address, vaddr first, vaddr last,
                          MMUAccessType access_type, int mmu_idx,
                          bool probe, uintptr_t retaddr)
 {
diff --git a/target/sparc/mmu_helper.c b/target/sparc/mmu_helper.c
index 07ba25dfce..cab476006a 100644
--- a/target/sparc/mmu_helper.c
+++ b/target/sparc/mmu_helper.c
@@ -211,7 +211,7 @@ static int get_physical_address(CPUSPARCState *env, CPUTLBEntryFull *full,
 }
 
 /* Perform address translation */
-bool sparc_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
+bool sparc_cpu_tlb_fill(CPUState *cs, vaddr address, vaddr first, vaddr last,
                         MMUAccessType access_type, int mmu_idx,
                         bool probe, uintptr_t retaddr)
 {
@@ -776,7 +776,7 @@ static int get_physical_address(CPUSPARCState *env, CPUTLBEntryFull *full,
 }
 
 /* Perform address translation */
-bool sparc_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
+bool sparc_cpu_tlb_fill(CPUState *cs, vaddr address, vaddr first, vaddr last,
                         MMUAccessType access_type, int mmu_idx,
                         bool probe, uintptr_t retaddr)
 {
diff --git a/target/tricore/helper.c b/target/tricore/helper.c
index 273713a147..5a6fb6c6c9 100644
--- a/target/tricore/helper.c
+++ b/target/tricore/helper.c
@@ -67,7 +67,7 @@ static void raise_mmu_exception(CPUTriCoreState *env, vaddr address,
 {
 }
 
-bool tricore_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
+bool tricore_cpu_tlb_fill(CPUState *cs, vaddr address, vaddr first, vaddr last,
                           MMUAccessType rw, int mmu_idx,
                           bool probe, uintptr_t retaddr)
 {
diff --git a/target/xtensa/helper.c b/target/xtensa/helper.c
index 5a0e865514..a99956614b 100644
--- a/target/xtensa/helper.c
+++ b/target/xtensa/helper.c
@@ -264,7 +264,7 @@ void xtensa_cpu_do_unaligned_access(CPUState *cs,
                                   addr);
 }
 
-bool xtensa_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
+bool xtensa_cpu_tlb_fill(CPUState *cs, vaddr address, vaddr first, vaddr last,
                          MMUAccessType access_type, int mmu_idx,
                          bool probe, uintptr_t retaddr)
 {
-- 
2.43.0
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.