This eliminates the last use of probe_pages.
Signed-off-by: Richard Henderson <[email protected]>
---
target/riscv/tcg/vector_helper.c | 119 +------------------------------
1 file changed, 3 insertions(+), 116 deletions(-)
diff --git a/target/riscv/tcg/vector_helper.c b/target/riscv/tcg/vector_helper.c
index 76f3babed6..76990894e5 100644
--- a/target/riscv/tcg/vector_helper.c
+++ b/target/riscv/tcg/vector_helper.c
@@ -149,50 +149,6 @@ static inline uint32_t vext_max_elems(uint32_t desc,
uint32_t log2_esz)
return scale < 0 ? vlenb >> -scale : vlenb << scale;
}
-/*
- * This function checks watchpoint before real load operation.
- *
- * In system mode, the TLB API probe_access is enough for watchpoint check.
- * In user mode, there is no watchpoint support now.
- *
- * It will trigger an exception if there is no mapping in TLB
- * and page table walk can't fill the TLB entry. Then the guest
- * software can return here after process the exception or never return.
- *
- * This function can also be used when direct access to probe_access_flags is
- * needed in order to access the flags. If a pointer to a flags operand is
- * provided the function will call probe_access_flags instead, use nonfault
- * and update host and flags.
- */
-static void probe_pages(CPURISCVState *env, target_ulong addr, target_ulong
len,
- uintptr_t ra, MMUAccessType access_type, int mmu_index,
- void **host, int *flags, bool nonfault)
-{
- target_ulong pagelen = -(addr | TARGET_PAGE_MASK);
- target_ulong curlen = MIN(pagelen, len);
-
- if (flags != NULL) {
- *flags = probe_access_flags(env, adjust_addr(env, addr), curlen,
- access_type, mmu_index, nonfault, host,
ra);
- } else {
- probe_access(env, adjust_addr(env, addr), curlen, access_type,
- mmu_index, ra);
- }
-
- if (len > curlen) {
- addr += curlen;
- curlen = len - curlen;
- if (flags != NULL) {
- *flags |= probe_access_flags(env, adjust_addr(env, addr), curlen,
- access_type, mmu_index, nonfault,
- host, ra);
- } else {
- probe_access(env, adjust_addr(env, addr), curlen, access_type,
- mmu_index, ra);
- }
- }
-}
-
static inline void vext_set_elem_mask(void *v0, int index,
uint8_t value)
{
@@ -430,33 +386,6 @@ vext_page_ldst_us_tlb(CPURISCVState *env, void *vd,
target_ulong addr,
} while (i < evl);
}
-static inline QEMU_ALWAYS_INLINE void
-vext_page_ldst_us(CPURISCVState *env, void *vd, target_ulong addr,
- uint32_t elems, uint32_t nf, uint32_t max_elems,
- uint32_t log2_esz, bool is_load, int mmu_index,
- vext_ldst_elem_fn_tlb *ldst_tlb,
- vext_ldst_elem_fn_host *ldst_host, uintptr_t ra)
-{
- void *host;
- int flags;
- uint32_t size = (elems * nf) << log2_esz;
- uint32_t i = env->vstart;
- MMUAccessType access_type = is_load ? MMU_DATA_LOAD : MMU_DATA_STORE;
-
- /* Check page permission/pmp/watchpoint/etc. */
- probe_pages(env, addr, size, ra, access_type, mmu_index, &host, &flags,
- true);
-
- if (flags == 0) {
- vext_page_ldst_us_host(vd, host, i, i + elems, nf, log2_esz,
- max_elems, ldst_host, is_load);
- env->vstart += elems;
- } else {
- vext_page_ldst_us_tlb(env, vd, addr, i, i + elems, nf, log2_esz,
- max_elems, ldst_tlb, mmu_index, ra);
- }
-}
-
static void vext_test_alignment(CPURISCVState *env, vaddr addr, uint32_t esz,
MMUAccessType access_type, int mmu_index,
uintptr_t ra)
@@ -1015,52 +944,10 @@ vext_ldst_whole(void *vd, target_ulong base,
CPURISCVState *env, uint32_t desc,
vext_ldst_elem_fn_host *ldst_host, uint32_t log2_esz,
uintptr_t ra, bool is_load)
{
- target_ulong page_split, elems, addr;
- uint32_t nf = vext_nf(desc);
- uint32_t vlenb = riscv_cpu_cfg(env)->vlenb;
- uint32_t max_elems = vlenb >> log2_esz;
- uint32_t evl = nf * max_elems;
- uint32_t esz = 1 << log2_esz;
- int mmu_index = riscv_env_mmu_index(env, false);
- MMUAccessType access_type = is_load ? MMU_DATA_LOAD : MMU_DATA_STORE;
-
- /* Calculate the page range of first page */
- addr = base + (env->vstart << log2_esz);
-
- /* Recognize alignment fault before memory protection fault. */
- vext_test_alignment(env, addr, esz, access_type, mmu_index, ra);
-
- page_split = -(addr | TARGET_PAGE_MASK);
- /* Get number of elements */
- elems = page_split / esz;
- if (unlikely(env->vstart + elems >= evl)) {
- elems = evl - env->vstart;
- }
-
- /* Load/store elements in the first page */
- if (likely(elems)) {
- vext_page_ldst_us(env, vd, addr, elems, 1, max_elems, log2_esz,
- is_load, mmu_index, ldst_tlb, ldst_host, ra);
- }
-
- /* Load/store elements in the second page */
- if (unlikely(env->vstart < evl)) {
- /* Cross page element */
- if (unlikely(page_split % esz)) {
- addr = base + (env->vstart << log2_esz);
- ldst_tlb(env, adjust_addr(env, addr), env->vstart, vd, ra);
- env->vstart++;
- }
-
- addr = base + (env->vstart << log2_esz);
- /* Get number of elements of second page */
- elems = evl - env->vstart;
-
- /* Load/store elements in the second page */
- vext_page_ldst_us(env, vd, addr, elems, 1, max_elems, log2_esz,
- is_load, mmu_index, ldst_tlb, ldst_host, ra);
- }
+ uint32_t evl = (riscv_cpu_cfg(env)->vlenb * vext_nf(desc)) >> log2_esz;
+ vext_ldst_us_notail(vd, base, env, log2_esz, 1, evl, evl, false,
+ ldst_tlb, ldst_host, ra, is_load);
env->vstart = 0;
}
--
2.43.0