aarch64 tlb range invalidate is not accurate
- Operating system: Ubuntu 20.04
- OS/kernel version: Linux 5.11.0-40-generic
- Architecture: x86_64
- QEMU flavor: qemu-system-aarch64
- QEMU version: 22.214.171.124 (v6.2.0-rc0)
- QEMU command line:
- Operating system: N/A
- OS/kernel version: N/A
- Architecture: aarch64
Description of problem
In this (84940ed8) commit, tlb range invalidate support is added, and I think qemu's range calculation is wrong.
page_size_granule is caculated as below.
num = extract64(value, 39, 4); scale = extract64(value, 44, 2); page_size_granule = extract64(value, 46, 2); page_shift = page_size_granule * 2 + 12;
As Arm documentation, NUM bits's length is 5, but the code above only extract 4bits.
page_shift also should be calculated as
(page_size_granule-1) <<1) + 12 rather than
page_size_granule * 2 + 12.
Steps to reproduce
I found this issue while debugging a phenomenon that kernel panic occurs randomly in my qemu fork.
I'm pretty sure this is one of the causes, but even if I roughly correct it, my problem has not been solved.
I think my problem is TLB invalidate related issue, so if I find any more problems, I'll comment here.