mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2025-03-23 02:55:06 +00:00
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:
parent
3183349f1c
commit
f3fa39829d
|
@ -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 */
|
||||
|
|
Loading…
Reference in a new issue