On 2021-11-17 5:36 p.m., Krste Asanovic
wrote:
The primary reason was lack of encoding space for
non-unit-stride fault-on-first instructions.
However, we did discuss its merit; if it would trump the encoding
dificulties, see below -
The security concern was being able to probe addresses to find
accessible regions without free of being killed on touching a
prohibited region. It was noted that this is still present even
for unit-stride in supervisor mode when using translation to
arbitrarily probe supervisor physical space. However, I believe
these security concerns are manageable through control mechanisms
at higher privilege levels.
Krste
On Nov 17, 2021, at 2:21 PM, Bruce Hoult
<
bruce@...> wrote:
On Thu, Nov 18, 2021 at 10:33 AM Bill
Huffman <huffman@...>
wrote:
From: Bruce Hoult <bruce@...>
Sent: Wednesday, November
17, 2021 4:24 PM
To: Krste Asanovic <krste@...>
Cc: Bill Huffman <huffman@...>;
Grigorios Magklis <grigorios.magklis@...>;
tech-vector-ext@...
Subject: Re: [RISC-V]
[tech-vector-ext] RISC-V Vector Extension
post-public review updates
Don't
forget some code may want to use a
mask in inverted sense for individual
instructions, without explicitly
creating a new mask. This was not
listed in the "wish list for 64 bits"
below, but it was in early RVV drafts.
Yes, that needs to be
considered as well.
I'm
not sure how common that really is,
and non-store uses can usually just
use a vmerge.vmm at the end anyway, at
the expense of possibly using extra
registers.
While
on the subject of future features, and
somewhat related ... the one big thing
I've noticed RVV lacking that SVE has
is a non-faulting version of indexed
loads ("gather") which creates a mask
showing which elements were
accessible. In SVE this goes into a
CSR which can then be moved into a
mask register, but of course with
sufficient encoding bits you could
directly put it into a normal
register.
Traditional
vector code doesn't really need this,
but SVE has an aim to be able to
vectorise all loops.
How does this
contribute to vectorizing all loops?
Because
otherwise you can't safely vectorise loops that do
indirect array accesses (e.g. a[b[i]]) with
data-dependent control flow.
there are two aspects here -
a) checking array indexes are within bounds, which absent proof
that the indexes are always in bound should be checked.
We have a viable mechanism for that. The index values are
loaded into a vector register in any event.
Set a mask on the compare of the index values with a scalar
bound.
b) handle a fault exceptions expeditiously by returning a mask of
would be faults.
This should be the exception case and therefore does not need
expediting.
As Krste says the OS level can provide a cooperative
mechanism to set a corresponding mask when exceptions occur, if it
is deemed the application [or system code] needs it.
But this feature does not mitigate the out of bound array
fetch. Many out of bounds locations can be in accessible memory.
Thus no need for instructions to have this feature whether
supporting all loop constructs or not.
I think this was not
included for security reasons rather
than ignored.
I don't think
there is any additional security implication.
I could be
wrong, as I'm not an expert on SVE, but I
believe that even if the gather operation is
done (somewhat) in parallel or in random order,
the instruction doesn't actually return a mask
indicating all the failed accesses. All mask
bits after the first element that was
inaccessible are also set to false. The
following code will process all the initial
elements and then invert the mask and loop back
and try to process the tail starting from the
first inaccessible element, which will then
actually fault if the loop didn't exit or skip
that element based on program logic.