Description
The Zcherilevels section states the capability level should be modified by ACPERM. However, ACPERM currently always tag clears if values are sealed. This is somewhat contradictory with how the implicit ACPERM happens on loads and stores, where the spec says:
"The Capability Level (CL) field can be reduced even if the capability is sealed, see Table 31."
I think we should bring these two in line and have ACPERM just be aware that some bits are not protected by sealing.
Currently the description of the last step of ACPERM is:
Set cd.tag=0 if cs1 is sealed or if any reserved fields of cs1 are set.
I propose we change this to:
Set cd.tag=0 if cs1 is sealed _and any protected permissions have changed_ or if any reserved fields of cs1 are set.
Without Zcherilevels all permissions are "protected". Level is unprotected (and we can extend the definition as more fields appear).
If we do have Zcherilevels, it is now possible to make a sealed capability local without having to store/load it back. For instance "acperm out, in, ~GLOBAL".
More importantly, I think this should be in the base spec as well so that binaries can be portable between platforms that do and do not have levels ("acperm out, in, ~GLOBAL" would become a move on such platforms, rather than an untag).