target-arm: Don't mask out bits [47:40] in LPAE descriptors for v8
In an LPAE format descriptor in ARMv8 the address field extends up to bit 47, not just bit 39. Correct the masking so we don't give incorrect results if the output address size is greater than 40 bits, as it can be for AArch64. (Note that we don't yet support the new-in-v8 Address Size fault which should be generated if any translation table entry or TTBR contains an address with non-zero bits above the most significant bit of the maximum output address size.) Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Laurent Desnogues <laurent.desnogues@gmail.com> Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com> Message-id: 1448029971-9875-1-git-send-email-peter.maydell@linaro.org
This commit is contained in:
parent
f72c0a79f7
commit
6109769a8b
@ -6642,6 +6642,7 @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
|
||||
int ap, ns, xn, pxn;
|
||||
uint32_t el = regime_el(env, mmu_idx);
|
||||
bool ttbr1_valid = true;
|
||||
uint64_t descaddrmask;
|
||||
|
||||
/* TODO:
|
||||
* This code does not handle the different format TCR for VTCR_EL2.
|
||||
@ -6831,6 +6832,15 @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
|
||||
descaddr = extract64(ttbr, 0, 48);
|
||||
descaddr &= ~((1ULL << (inputsize - (stride * (4 - level)))) - 1);
|
||||
|
||||
/* The address field in the descriptor goes up to bit 39 for ARMv7
|
||||
* but up to bit 47 for ARMv8.
|
||||
*/
|
||||
if (arm_feature(env, ARM_FEATURE_V8)) {
|
||||
descaddrmask = 0xfffffffff000ULL;
|
||||
} else {
|
||||
descaddrmask = 0xfffffff000ULL;
|
||||
}
|
||||
|
||||
/* Secure accesses start with the page table in secure memory and
|
||||
* can be downgraded to non-secure at any step. Non-secure accesses
|
||||
* remain non-secure. We implement this by just ORing in the NSTable/NS
|
||||
@ -6854,7 +6864,7 @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
|
||||
/* Invalid, or the Reserved level 3 encoding */
|
||||
goto do_fault;
|
||||
}
|
||||
descaddr = descriptor & 0xfffffff000ULL;
|
||||
descaddr = descriptor & descaddrmask;
|
||||
|
||||
if ((descriptor & 2) && (level < 3)) {
|
||||
/* Table entry. The top five bits are attributes which may
|
||||
|
Loading…
Reference in New Issue
Block a user