target/arm: Fix select for aa64_va_parameters_both

Select should always be 0 for a regime with one range.

Backports commit 71d181640a1a9470f074fa28600ca85587e2ca6b from qemu
This commit is contained in:
Richard Henderson 2020-03-21 18:00:13 -04:00 committed by Lioncash
parent 3183349f1c
commit f3fa39829d

View file

@ -10096,13 +10096,8 @@ ARMVAParameters aa64_va_parameters_both(CPUARMState *env, uint64_t va,
bool tbi, tbid, epd, hpd, using16k, using64k;
int select, tsz;
/*
* Bit 55 is always between the two regions, and is canonical for
* determining if address tagging is enabled.
*/
select = extract64(va, 55, 1);
if (!regime_has_2_ranges(mmu_idx)) {
select = 0;
tsz = extract32(tcr, 0, 6);
using64k = extract32(tcr, 14, 1);
using16k = extract32(tcr, 15, 1);
@ -10115,23 +10110,30 @@ ARMVAParameters aa64_va_parameters_both(CPUARMState *env, uint64_t va,
tbid = extract32(tcr, 29, 1);
}
epd = false;
} else if (!select) {
tsz = extract32(tcr, 0, 6);
epd = extract32(tcr, 7, 1);
using64k = extract32(tcr, 14, 1);
using16k = extract32(tcr, 15, 1);
tbi = extract64(tcr, 37, 1);
hpd = extract64(tcr, 41, 1);
tbid = extract64(tcr, 51, 1);
} else {
int tg = extract32(tcr, 30, 2);
using16k = tg == 1;
using64k = tg == 3;
tsz = extract32(tcr, 16, 6);
epd = extract32(tcr, 23, 1);
tbi = extract64(tcr, 38, 1);
hpd = extract64(tcr, 42, 1);
tbid = extract64(tcr, 52, 1);
/*
* Bit 55 is always between the two regions, and is canonical for
* determining if address tagging is enabled.
*/
select = extract64(va, 55, 1);
if (!select) {
tsz = extract32(tcr, 0, 6);
epd = extract32(tcr, 7, 1);
using64k = extract32(tcr, 14, 1);
using16k = extract32(tcr, 15, 1);
tbi = extract64(tcr, 37, 1);
hpd = extract64(tcr, 41, 1);
tbid = extract64(tcr, 51, 1);
} else {
int tg = extract32(tcr, 30, 2);
using16k = tg == 1;
using64k = tg == 3;
tsz = extract32(tcr, 16, 6);
epd = extract32(tcr, 23, 1);
tbi = extract64(tcr, 38, 1);
hpd = extract64(tcr, 42, 1);
tbid = extract64(tcr, 52, 1);
}
}
tsz = MIN(tsz, 39); /* TODO: ARMv8.4-TTST */
tsz = MAX(tsz, 16); /* TODO: ARMv8.2-LVA */