On Thu, 2026-08-20 at 21:03 -0700, Richard Henderson wrote: > This eliminates the last use of probe_pages. > > Signed-off-by: Richard Henderson <[email protected]>
Reviewed-by: Alistair Francis <[email protected]> Alistair > --- > 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; > } >
