On 2026-08-25 13:15, Richard Henderson wrote:
> On 8/25/26 10:58, Max Chou wrote:
>
> > On 2026-08-15 12:45, Richard Henderson wrote:
> > > Do not call probe_pages for every active element.
> > > We can make do with no more than 2 such calls for
> > > the two pages the insn might reference.
> > >
> > > Signed-off-by: Richard Henderson <[email protected]>
> > > + /*
> > > + * Test whether the first page is accessible.
> > > + * If the first element is active, it must succeed.
> > > + */
> > > + flags = probe_access_flags(env, adjust_addr(env, addr),
> > > + MIN(last, last_in_page) - addr + 1,
> > > + MMU_DATA_LOAD, mmu_index, !first_active,
> > > + &host, ra);
> > Hi Richard,
> >
> > This probe traverses every byte from the initial active element to the
> > end of the page, not just the bytes of active elements. In the masked
> > case, the range may encompass a masked-off element, and masked-off body
> > elements do not perform memory accesses.
> > I think it may causes unexpected vl.
> >
> > > + /* Get number of complete elements in the first page. */
> > > + elems = MIN(page_split / msize, vl - i);
> > > +
> > > + /* Load complete elements from the first page. */
> > > + if (likely(elems)) {
> > > + uint32_t page_evl = i + elems;
> > > +
> > > + if (flags == 0) {
> > ...
> > > + } else {
> > > + /*
> > > + * If the first element is active, it must succeed.
> > > + * This will load from MMIO or fault from INVALID.
> > > + */
> > > + if (first_active) {
> > > + vext_ldst_nf_tlb(env, vd, addr, 0, nf, esz,
> > > + max_elems, ldst_tlb, ra);
> > > + i = 1;
> > > + addr += msize;
> > > + }
> > > +
> > > + /* Stop if invalid (unmapped) or mmio (transaction may
> > > fail). */
> > > + if (flags & (TLB_INVALID_MASK | TLB_MMIO)) {
> > > + env->vl = i;
> > > + goto tail;
> > > + }
> > > +
> > For an example, assume
> > - vl = 3
> > - vstart = 0
> > - the mask be [1, 0, 1]
> > - assume element 0 and element 2 be readable, but deny the byte at element 1
> > - all three elements are in the same target page.
> >
> > In theory, the element 1 is masked off and doesn’t perform any memory
> > access, so the value of vl remains 3.
> >
> > But the previous probe covers element 1 to 2 and the flags will be non
> > zero due to the denied masked-off element 2. Then the vl will set to 1
> > here.
> >
> > Maybe we could switch to per element prob when vm is 0 and flags is not 0?
>
> How are you going to deny the byte at element 1 to be unreadable? Are you
> expecting this to be some PMP thing, with a 1 byte range?
>
> How I expect things to work is that:
>
> (1) We scan forward for the first active element, set vstart.
>
> (2) Probe the page for that element. If that faults, vstart is visible to
> the trap handler.
>
> (3) Discounting MMIO, all following elements in the same page cannot fault,
> and we can process them immediately. Obviously inactive elements get vma
> handling not loads.
>
Hi Richard,
Sorry, my previous example was unclear. It does not need a 1-byte PMP
region: RISC-V PMP definition allows the minimum 4-byte PMP region,
which exactly matches one e32 element.
For example, with vl=3, vstart=0, e32, and v0.mask = [1, 0, 1],
configure locked PMP entries as follows:
PMP0: NA4 [base + 4, base + 7], L, --- # element 1, no read
PMP1: NAPOT target page, L, R # lower-priority page allow
bytes: base base + 4 base + 8
+-----+ +-----+ +-----+
element: 0 1 2
mask: 1 0 1
access: active inactive active
PMP: PMP1 R PMP0 --- PMP1 R
The RISC-V spec defines that masked vector loads access memory and raise
exceptions only for active elements.
Therefore this situation has reads only for elements 0 and 2; PMP0 must
not create an access-fault condition for this instruction.
My concern is that the page probe may be unsafe in some situations
because PMP permissions can change at 4-byte granularity inside a
target page, while the probe includes bytes which are not part of
active vector memory operations.
Maybe we could use the page probe only when it returns flags == 0,
and otherwise fall back to checking only active elements or active
runs?
I'm trying to create masked fauly-only-first + PMP test for this.
Thanks,
rnax
> I'm not sure I'm understanding your question properly...
>
>
> r~
>