Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1f75ff0a authored by Will Deacon's avatar Will Deacon Committed by Catalin Marinas
Browse files

arm64: generic timer: use virtual counter instead of physical at EL0



We want to use the virtual counter at EL0, as the physical counter
may not track the current clocksource for guests running under a
hypervisor.

This patch updates the vdso and generic timer driver to use the virtual
counter. The kernel EL2 entry code is also updated to ensure that the
virtual offset is initialised to zero.

Signed-off-by: default avatarMarc Zyngier <marc.zyngier@arm.com>
Signed-off-by: default avatarWill Deacon <will.deacon@arm.com>
Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
parent 45a7905f
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -70,12 +70,12 @@ static inline void __cpuinit arch_counter_enable_user_access(void)
{
	u32 cntkctl;

	/* Disable user access to the timers and the virtual counter. */
	/* Disable user access to the timers and the physical counter. */
	asm volatile("mrs	%0, cntkctl_el1" : "=r" (cntkctl));
	cntkctl &= ~((3 << 8) | (1 << 1));
	cntkctl &= ~((3 << 8) | (1 << 0));

	/* Enable user access to the physical counter and frequency. */
	cntkctl |= 1;
	/* Enable user access to the virtual counter and frequency. */
	cntkctl |= (1 << 1);
	asm volatile("msr	cntkctl_el1, %0" : : "r" (cntkctl));
}

+1 −0
Original line number Diff line number Diff line
@@ -158,6 +158,7 @@ ENTRY(el2_setup)
	mrs	x0, cnthctl_el2
	orr	x0, x0, #3			// Enable EL1 physical timers
	msr	cnthctl_el2, x0
	msr	cntvoff_el2, xzr		// Clear virtual offset

	/* Populate ID registers. */
	mrs	x0, midr_el1
+2 −2
Original line number Diff line number Diff line
@@ -220,9 +220,9 @@ ENTRY(__do_get_tspec)
	ldp	w11, w12, [vdso_data, #VDSO_CS_MULT]
	seqcnt_read w9

	/* Read the physical counter. */
	/* Read the virtual counter. */
	isb
	mrs	x15, cntpct_el0
	mrs	x15, cntvct_el0

	/* Calculate cycle delta and convert to ns. */
	sub	x10, x15, x10
+1 −1
Original line number Diff line number Diff line
@@ -109,7 +109,7 @@ static void __cpuinit arch_timer_setup(struct clock_event_device *clk)

	enable_percpu_irq(clk->irq, 0);

	/* Ensure the physical counter is visible to userspace for the vDSO. */
	/* Ensure the virtual counter is visible to userspace for the vDSO. */
	arch_counter_enable_user_access();
}