|
Here's the specification's recommended use of SFENCE.VMA, which is just a fancier version of what I wrote above: Page 66 and 67: The following common situations typically require executing an SFENCE.VMA instruction: 1. When software recycles an ASID (i.e., reassociates it with a different page table), it should
first change satp to point to the new page table using the recycled ASID, then execute
SFENCE.VMA with rs1=x0 and rs2 set to the recycled ASID. Alternatively, software can
execute the same SFENCE.VMA instruction while a different ASID is loaded into satp,
provided the next time satp is loaded with the recycled ASID, it is simultaneously loaded
with the new page table. 2. If the implementation does not provide ASIDs, or software chooses to always use ASID 0,
then after every satp write, software should execute SFENCE.VMA with rs1=x0. In the
common case that no global translations have been modified, rs2 should be set to a register
other than x0 but which contains the value zero, so that global translations are not flushed. 3. If software modifies a non-leaf PTE, it should execute SFENCE.VMA with rs1=x0. If any
PTE along the traversal path had its G bit set, rs2 must be x0; otherwise, rs2 should be set
to the ASID for which the translation is being modified. 4. If software modifies a leaf PTE, it should execute SFENCE.VMA with rs1 set to a virtual
address within the page. If any PTE along the traversal path had its G bit set, rs2 must
be x0; otherwise, rs2 should be set to the ASID for which the translation is being modified. 5. For the special cases of increasing the permissions on a leaf PTE and changing an invalid
PTE to a valid leaf, software may choose to execute the SFENCE.VMA lazily. After
modifying the PTE but before executing SFENCE.VMA, either the new or old permissions
will be used. In the latter case, a page fault exception might occur, at which point software
should execute SFENCE.VMA in accordance with the previous bullet point. |
"A consequence of this specification is that an implementation may use any translation for an address that was valid at any time since the most recent SFENCE.VMA that subsumes that address. In particular, if a leaf PTE is modified but a subsuming SFENCE.VMA is not executed, either the old translation or the new translation will be used, but the choice is unpredictable. The behavior is otherwise well-defined."
This is not the "particular" case mentioned - essentially "subsumed" for satp is the entire space (you have to think of satp as simply being a non-leaf PTE)
To be fair I think that there's issues in this area that may force a double pipe flush in some implementations