target/arm: Add new 's1_is_el0' argument to get_phys_addr_lpae()
For ARMv8.2-TTS2UXN, the stage 2 page table walk wants to know whether the stage 1 access is for EL0 or not, because whether exec permission is given can depend on whether this is an EL0 or EL1 access. Add a new argument to get_phys_addr_lpae() so the call sites can pass this information in. Since get_phys_addr_lpae() doesn't already have a doc comment, add one so we have a place to put the documentation of the semantics of the new s1_is_el0 argument. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20200330210400.11724-4-peter.maydell@linaro.org
This commit is contained in:
parent
59dff859cd
commit
ff7de2fc2c
@ -41,6 +41,7 @@
|
|||||||
|
|
||||||
static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
|
static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
|
||||||
MMUAccessType access_type, ARMMMUIdx mmu_idx,
|
MMUAccessType access_type, ARMMMUIdx mmu_idx,
|
||||||
|
bool s1_is_el0,
|
||||||
hwaddr *phys_ptr, MemTxAttrs *txattrs, int *prot,
|
hwaddr *phys_ptr, MemTxAttrs *txattrs, int *prot,
|
||||||
target_ulong *page_size_ptr,
|
target_ulong *page_size_ptr,
|
||||||
ARMMMUFaultInfo *fi, ARMCacheAttrs *cacheattrs);
|
ARMMMUFaultInfo *fi, ARMCacheAttrs *cacheattrs);
|
||||||
@ -10053,6 +10054,7 @@ static hwaddr S1_ptw_translate(CPUARMState *env, ARMMMUIdx mmu_idx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
ret = get_phys_addr_lpae(env, addr, MMU_DATA_LOAD, ARMMMUIdx_Stage2,
|
ret = get_phys_addr_lpae(env, addr, MMU_DATA_LOAD, ARMMMUIdx_Stage2,
|
||||||
|
false,
|
||||||
&s2pa, &txattrs, &s2prot, &s2size, fi,
|
&s2pa, &txattrs, &s2prot, &s2size, fi,
|
||||||
pcacheattrs);
|
pcacheattrs);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
@ -10655,8 +10657,32 @@ static ARMVAParameters aa32_va_parameters(CPUARMState *env, uint32_t va,
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get_phys_addr_lpae: perform one stage of page table walk, LPAE format
|
||||||
|
*
|
||||||
|
* Returns false if the translation was successful. Otherwise, phys_ptr, attrs,
|
||||||
|
* prot and page_size may not be filled in, and the populated fsr value provides
|
||||||
|
* information on why the translation aborted, in the format of a long-format
|
||||||
|
* DFSR/IFSR fault register, with the following caveats:
|
||||||
|
* * the WnR bit is never set (the caller must do this).
|
||||||
|
*
|
||||||
|
* @env: CPUARMState
|
||||||
|
* @address: virtual address to get physical address for
|
||||||
|
* @access_type: MMU_DATA_LOAD, MMU_DATA_STORE or MMU_INST_FETCH
|
||||||
|
* @mmu_idx: MMU index indicating required translation regime
|
||||||
|
* @s1_is_el0: if @mmu_idx is ARMMMUIdx_Stage2 (so this is a stage 2 page table
|
||||||
|
* walk), must be true if this is stage 2 of a stage 1+2 walk for an
|
||||||
|
* EL0 access). If @mmu_idx is anything else, @s1_is_el0 is ignored.
|
||||||
|
* @phys_ptr: set to the physical address corresponding to the virtual address
|
||||||
|
* @attrs: set to the memory transaction attributes to use
|
||||||
|
* @prot: set to the permissions for the page containing phys_ptr
|
||||||
|
* @page_size_ptr: set to the size of the page containing phys_ptr
|
||||||
|
* @fi: set to fault info if the translation fails
|
||||||
|
* @cacheattrs: (if non-NULL) set to the cacheability/shareability attributes
|
||||||
|
*/
|
||||||
static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
|
static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
|
||||||
MMUAccessType access_type, ARMMMUIdx mmu_idx,
|
MMUAccessType access_type, ARMMMUIdx mmu_idx,
|
||||||
|
bool s1_is_el0,
|
||||||
hwaddr *phys_ptr, MemTxAttrs *txattrs, int *prot,
|
hwaddr *phys_ptr, MemTxAttrs *txattrs, int *prot,
|
||||||
target_ulong *page_size_ptr,
|
target_ulong *page_size_ptr,
|
||||||
ARMMMUFaultInfo *fi, ARMCacheAttrs *cacheattrs)
|
ARMMMUFaultInfo *fi, ARMCacheAttrs *cacheattrs)
|
||||||
@ -11748,6 +11774,7 @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
|
|||||||
|
|
||||||
/* S1 is done. Now do S2 translation. */
|
/* S1 is done. Now do S2 translation. */
|
||||||
ret = get_phys_addr_lpae(env, ipa, access_type, ARMMMUIdx_Stage2,
|
ret = get_phys_addr_lpae(env, ipa, access_type, ARMMMUIdx_Stage2,
|
||||||
|
mmu_idx == ARMMMUIdx_E10_0,
|
||||||
phys_ptr, attrs, &s2_prot,
|
phys_ptr, attrs, &s2_prot,
|
||||||
page_size, fi,
|
page_size, fi,
|
||||||
cacheattrs != NULL ? &cacheattrs2 : NULL);
|
cacheattrs != NULL ? &cacheattrs2 : NULL);
|
||||||
@ -11872,7 +11899,7 @@ bool get_phys_addr(CPUARMState *env, target_ulong address,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (regime_using_lpae_format(env, mmu_idx)) {
|
if (regime_using_lpae_format(env, mmu_idx)) {
|
||||||
return get_phys_addr_lpae(env, address, access_type, mmu_idx,
|
return get_phys_addr_lpae(env, address, access_type, mmu_idx, false,
|
||||||
phys_ptr, attrs, prot, page_size,
|
phys_ptr, attrs, prot, page_size,
|
||||||
fi, cacheattrs);
|
fi, cacheattrs);
|
||||||
} else if (regime_sctlr(env, mmu_idx) & SCTLR_XP) {
|
} else if (regime_sctlr(env, mmu_idx) & SCTLR_XP) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user