(no commit message)
authorlkcl <lkcl@web>
Sat, 20 Aug 2022 12:44:42 +0000 (13:44 +0100)
committerIkiWiki <ikiwiki.info>
Sat, 20 Aug 2022 12:44:42 +0000 (13:44 +0100)
openpower/sv/ldst.mdwn

index ad03600fd654d353643dac0a8969dd5ebba72cc9..80c6e7eac60609f93354fd9d41dcb994c1d2eed8 100644 (file)
@@ -321,14 +321,17 @@ and manual reordering of the Vector of RB offsets.
 
 # LD/ST ffirst
 
-LD/ST ffirst treats the first LD/ST in a vector (element 0) as an
-ordinary one.  Exceptions, if any are needed occur "as normal" exactly as
-they would on any Scalar v3.0 Power ISA LD/ST. However for elements 1
+LD/ST ffirst treats the first LD/ST in a vector (element 0 if REMAP
+is not active) as an
+ordinary one, with all behaviour with respect to Interrupts Exceptions
+Page Faults Memory Management being identical in every regard to Scalar
+v3.0 Power ISA LD/ST. However for elements 1
 and above, if an exception would occur, then VL is **truncated** to the
 previous element: the exception is **not** then raised because the
-LD/ST that would otherwise have caused an exception is *required* to be cancelled.
+LD/ST that would otherwise have caused an exception is *required* to be cancelled. Additionally an implementor may choose to truncate VL for
+any arbitrary reason *except for the very first*.
 
-ffirst LD/ST to multiple pages via a Vectorised Index base is considered a security risk due to the abuse of probing multiple pages in rapid succession and getting feedback on which pages would fail.  Therefore Vector Indexed LD/ST is prohibited entirely, and the Mode bit instead used for element-strided LD/ST.  See <https://bugs.libre-soc.org/show_bug.cgi?id=561>
+ffirst LD/ST to multiple pages via a Vectorised Index base is considered a security risk due to the abuse of probing multiple pages in rapid succession and getting speculative feedback on which pages would fail.  Therefore Vector Indexed LD/ST is prohibited entirely, and the Mode bit instead used for element-strided LD/ST.  See <https://bugs.libre-soc.org/show_bug.cgi?id=561>
 
     for(i = 0; i < VL; i++)
         reg[rt + i] = mem[reg[ra] + i * reg[rb]];