arm/ptw: Make get_S1prot accept decoded AP
AP in armv7 short descriptor mode has 3 bits and also domain, which makes it incompatible with other arm schemas. To make it possible to share get_S1prot between armv8, armv7 long format, armv7 short format and armv6 it's easier to make caller decode AP. Signed-off-by: Pavel Skripkin <paskripkin@gmail.com> Message-id: 20241118152526.45185-1-paskripkin@gmail.com [PMM: fixed checkpatch nit] Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
b0a1009192
commit
0231bdc895
@ -1357,25 +1357,24 @@ static int get_S2prot(CPUARMState *env, int s2ap, int xn, bool s1_is_el0)
|
|||||||
* @env: CPUARMState
|
* @env: CPUARMState
|
||||||
* @mmu_idx: MMU index indicating required translation regime
|
* @mmu_idx: MMU index indicating required translation regime
|
||||||
* @is_aa64: TRUE if AArch64
|
* @is_aa64: TRUE if AArch64
|
||||||
* @ap: The 2-bit simple AP (AP[2:1])
|
* @user_rw: Translated AP for user access
|
||||||
|
* @prot_rw: Translated AP for privileged access
|
||||||
* @xn: XN (execute-never) bit
|
* @xn: XN (execute-never) bit
|
||||||
* @pxn: PXN (privileged execute-never) bit
|
* @pxn: PXN (privileged execute-never) bit
|
||||||
* @in_pa: The original input pa space
|
* @in_pa: The original input pa space
|
||||||
* @out_pa: The output pa space, modified by NSTable, NS, and NSE
|
* @out_pa: The output pa space, modified by NSTable, NS, and NSE
|
||||||
*/
|
*/
|
||||||
static int get_S1prot(CPUARMState *env, ARMMMUIdx mmu_idx, bool is_aa64,
|
static int get_S1prot(CPUARMState *env, ARMMMUIdx mmu_idx, bool is_aa64,
|
||||||
int ap, int xn, int pxn,
|
int user_rw, int prot_rw, int xn, int pxn,
|
||||||
ARMSecuritySpace in_pa, ARMSecuritySpace out_pa)
|
ARMSecuritySpace in_pa, ARMSecuritySpace out_pa)
|
||||||
{
|
{
|
||||||
ARMCPU *cpu = env_archcpu(env);
|
ARMCPU *cpu = env_archcpu(env);
|
||||||
bool is_user = regime_is_user(env, mmu_idx);
|
bool is_user = regime_is_user(env, mmu_idx);
|
||||||
int prot_rw, user_rw;
|
|
||||||
bool have_wxn;
|
bool have_wxn;
|
||||||
int wxn = 0;
|
int wxn = 0;
|
||||||
|
|
||||||
assert(!regime_is_stage2(mmu_idx));
|
assert(!regime_is_stage2(mmu_idx));
|
||||||
|
|
||||||
user_rw = simple_ap_to_rw_prot_is_user(ap, true);
|
|
||||||
if (is_user) {
|
if (is_user) {
|
||||||
prot_rw = user_rw;
|
prot_rw = user_rw;
|
||||||
} else {
|
} else {
|
||||||
@ -1393,8 +1392,6 @@ static int get_S1prot(CPUARMState *env, ARMMMUIdx mmu_idx, bool is_aa64,
|
|||||||
regime_is_pan(env, mmu_idx) &&
|
regime_is_pan(env, mmu_idx) &&
|
||||||
(regime_sctlr(env, mmu_idx) & SCTLR_EPAN) && !xn) {
|
(regime_sctlr(env, mmu_idx) & SCTLR_EPAN) && !xn) {
|
||||||
prot_rw = 0;
|
prot_rw = 0;
|
||||||
} else {
|
|
||||||
prot_rw = simple_ap_to_rw_prot_is_user(ap, false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2044,6 +2041,7 @@ static bool get_phys_addr_lpae(CPUARMState *env, S1Translate *ptw,
|
|||||||
int nse, ns = extract32(attrs, 5, 1);
|
int nse, ns = extract32(attrs, 5, 1);
|
||||||
uint8_t attrindx;
|
uint8_t attrindx;
|
||||||
uint64_t mair;
|
uint64_t mair;
|
||||||
|
int user_rw, prot_rw;
|
||||||
|
|
||||||
switch (out_space) {
|
switch (out_space) {
|
||||||
case ARMSS_Root:
|
case ARMSS_Root:
|
||||||
@ -2110,12 +2108,15 @@ static bool get_phys_addr_lpae(CPUARMState *env, S1Translate *ptw,
|
|||||||
xn = 0;
|
xn = 0;
|
||||||
ap &= ~1;
|
ap &= ~1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
user_rw = simple_ap_to_rw_prot_is_user(ap, true);
|
||||||
|
prot_rw = simple_ap_to_rw_prot_is_user(ap, false);
|
||||||
/*
|
/*
|
||||||
* Note that we modified ptw->in_space earlier for NSTable, but
|
* Note that we modified ptw->in_space earlier for NSTable, but
|
||||||
* result->f.attrs retains a copy of the original security space.
|
* result->f.attrs retains a copy of the original security space.
|
||||||
*/
|
*/
|
||||||
result->f.prot = get_S1prot(env, mmu_idx, aarch64, ap, xn, pxn,
|
result->f.prot = get_S1prot(env, mmu_idx, aarch64, user_rw, prot_rw,
|
||||||
result->f.attrs.space, out_space);
|
xn, pxn, result->f.attrs.space, out_space);
|
||||||
|
|
||||||
/* Index into MAIR registers for cache attributes */
|
/* Index into MAIR registers for cache attributes */
|
||||||
attrindx = extract32(attrs, 2, 3);
|
attrindx = extract32(attrs, 2, 3);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user