target/arm: Support page protections for GCS mmu indexes

Take read and write from the s1perms.gcs bit computed
by the Arm pseudocode.

Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-id: 20251008215613.300150-30-richard.henderson@linaro.org
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Richard Henderson 2025-10-08 14:55:29 -07:00 committed by Peter Maydell
parent 0fe292fadb
commit 4c14265b80

View file

@ -1619,12 +1619,16 @@ static int get_S1prot_indirect(CPUARMState *env, S1Translate *ptw,
}
}
if (perm & PAGE_WXN) {
if (regime_is_gcs(mmu_idx)) {
/*
* Note that the one s1perms.gcs bit controls both read and write
* access via AccessType_GCS. See AArch64.S1CheckPermissions.
*/
perm = (perm & PAGE_GCS ? PAGE_READ | PAGE_WRITE : 0);
} else if (perm & PAGE_WXN) {
perm &= ~PAGE_EXEC;
}
/* TODO: FEAT_GCS */
return perm & PAGE_RWX;
}
@ -2277,6 +2281,13 @@ static bool get_phys_addr_lpae(CPUARMState *env, S1Translate *ptw,
*/
prot = get_S1prot_indirect(env, ptw, mmu_idx, pi, po,
result->f.attrs.space, out_space);
} else if (regime_is_gcs(mmu_idx)) {
/*
* While one must use indirect permissions to successfully
* use GCS instructions, AArch64.S1DirectBasePermissions
* faithfully supplies s1perms.gcs = 0, Just In Case.
*/
prot = 0;
} else {
int xn = extract64(attrs, 54, 1);
int pxn = extract64(attrs, 53, 1);