|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] xen/arm: Validate generic timer frequency
On Thu, 27 Sep 2023, Michal Orzel wrote:
> Generic timer dt node property "clock-frequency" (refer Linux dt binding
> Documentation/devicetree/bindings/timer/arm,arch_timer.yaml) is used to
> override the incorrect value set by firmware in CNTFRQ_EL0. If the value
> of this property is 0 (i.e. by mistake), Xen would continue to work and
> use the value from the sysreg instead. The logic is thus incorrect and
> results in inconsistency when creating timer node for domUs:
> - libxl domUs: clock_frequency member of struct xen_arch_domainconfig
> is set to 0 and libxl ignores setting the "clock-frequency" property,
> - dom0less domUs: "clock-frequency" property is taken from dt_host and
> thus set to 0.
>
> Property "clock-frequency" is used to override the value from sysreg,
> so if it is also invalid, there is nothing we can do and we shall panic
> to let user know about incorrect setting. Going even further, we operate
> under assumption that the frequency must be at least 1KHz (i.e. cpu_khz
> not 0) in order for Xen to boot. Therefore, introduce a new helper
> validate_timer_frequency() to verify this assumption and use it to check
> the frequency obtained either from dt property or from sysreg.
>
> Signed-off-by: Michal Orzel <michal.orzel@xxxxxxx>
Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> ---
> xen/arch/arm/time.c | 15 +++++++++++++++
> 1 file changed, 15 insertions(+)
>
> diff --git a/xen/arch/arm/time.c b/xen/arch/arm/time.c
> index 3535bd8ac7c7..04b07096b165 100644
> --- a/xen/arch/arm/time.c
> +++ b/xen/arch/arm/time.c
> @@ -101,6 +101,17 @@ static void __init preinit_acpi_xen_time(void)
> static void __init preinit_acpi_xen_time(void) { }
> #endif
>
> +static void __init validate_timer_frequency(void)
> +{
> + /*
> + * ARM ARM does not impose any strict limit on the range of allowable
> + * system counter frequencies. However, we operate under the assumption
> + * that cpu_khz must not be 0.
> + */
> + if ( !cpu_khz )
> + panic("Timer frequency is less than 1 KHz\n");
> +}
> +
> /* Set up the timer on the boot CPU (early init function) */
> static void __init preinit_dt_xen_time(void)
> {
> @@ -122,6 +133,7 @@ static void __init preinit_dt_xen_time(void)
> if ( res )
> {
> cpu_khz = rate / 1000;
> + validate_timer_frequency();
> timer_dt_clock_frequency = rate;
> }
> }
> @@ -137,7 +149,10 @@ void __init preinit_xen_time(void)
> preinit_acpi_xen_time();
>
> if ( !cpu_khz )
> + {
> cpu_khz = (READ_SYSREG(CNTFRQ_EL0) & CNTFRQ_MASK) / 1000;
> + validate_timer_frequency();
> + }
>
> res = platform_init_time();
> if ( res )
> --
> 2.25.1
>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |