Skip to content

aarch64 tlb range invalidate is not accurate

Host environment

  • Operating system: Ubuntu 20.04
  • OS/kernel version: Linux 5.11.0-40-generic
  • Architecture: x86_64
  • QEMU flavor: qemu-system-aarch64
  • QEMU version: 6.1.9.0 (v6.2.0-rc0)
  • QEMU command line:

Emulated/Virtualized environment

  • 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.

In tlbi_aa64_range_get_length function, num, scale, 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.

And page_shift also should be calculated as (page_size_granule-1) <<1) + 12 rather than page_size_granule * 2 + 12.

Steps to reproduce

Additional information

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.

Edited by Cha HyunSoo
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information