On Thu, 05 Dec 2024 00:37:34 +0000, Oliver Upton <oliver.upton@xxxxxxxxx> wrote: > > typo: accelerate Huh, thanks! > > On Mon, Dec 02, 2024 at 05:21:29PM +0000, Marc Zyngier wrote: [...] > > + case SYS_CNTVCT_EL0: > > + case SYS_CNTVCTSS_EL0: > > + /* If !ELIsInHost(EL2), the guest's CNTVOFF_EL2 applies */ > > !ELIsInHost(EL0) No, and that's the whole point. CNTVOFF_EL2 applies at all times when HCR_EL2==0 and that we're at EL2. From the pseudocode for CNTVCT_EL0: <quote> [...] elsif PSTATE.EL == EL2 then if !ELIsInHost(EL2) then X[t, 64] = PhysicalCountInt() - CNTVOFF_EL2; else X[t, 64] = PhysicalCountInt(); [...] </quote> Which is why we only check E2H, and not E2H+TGE. It is CNTPOFF_EL2 that applies when !ELIsInHost(EL0), and this is why it cannot be reliably emulated as we don't (and cannot) track changes to HCR_EL2.TGE. Yes, this is nonsense. M. -- Without deviation from the norm, progress is not possible.