On 8/26/26 11:40, Max Chou wrote:
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?
Ok, thanks for the clear example. flags == 0 does not help with this case.
What we want is to probe the first active element, with
probe_access_full. For this particular case, where a PMP rule matches
something smaller than the page, we will have set lg_page_size <
TARGET_PAGE_BITS. So we get the fault (or not) for the first element
exactly, and can then tell via flags and lg_page_size whether the rest
of the page can use the fast or slow paths.
I'm trying to create masked fauly-only-first + PMP test for this.
Thanks, that would be helpful. Similarly for masked not-first-fault,
please?
r~