mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2025-07-16 01:07:44 +00:00
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. Backports commit ff7de2fc2c994030bfb83af9ddc9a3cd70ce3e88 from qemu
This commit is contained in:
parent
bec9ee21b6
commit
1e75276a89
|
@ -29,6 +29,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);
|
||||||
|
@ -9802,6 +9803,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) {
|
||||||
|
@ -10408,8 +10410,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)
|
||||||
|
@ -11509,6 +11535,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);
|
||||||
|
@ -11602,7 +11629,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…
Reference in a new issue