|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 1/5] xen/arm: Introduce enable callback to enable a capabilities on each online CPU
On Tue, 16 Jan 2018, Julien Grall wrote:
> Once Xen knows what features/workarounds present on the platform, it
> might be necessary to configure each online CPU.
>
> Introduce a new callback "enable" that will be called on each online CPU to
> configure the "capability".
>
> The code is based on Linux v4.14 (where cpufeature.c comes from), the
> explanation of why using stop_machine_run is kept as we have similar
> problem in the future.
>
> Lastly introduce enable_errata_workaround that will be called once CPUs
> have booted and before the hardware domain is created.
>
> This is part of XSA-254.
>
> Signed-of-by: Julien Grall <julien.grall@xxxxxxxxxx>
If you took the code from Linux, you need to add the original
Signed-off-by from the Linux commit. Aside from that:
Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> ---
> xen/arch/arm/cpuerrata.c | 6 ++++++
> xen/arch/arm/cpufeature.c | 29 +++++++++++++++++++++++++++++
> xen/arch/arm/setup.c | 1 +
> xen/include/asm-arm/cpuerrata.h | 1 +
> xen/include/asm-arm/cpufeature.h | 3 +++
> 5 files changed, 40 insertions(+)
>
> diff --git a/xen/arch/arm/cpuerrata.c b/xen/arch/arm/cpuerrata.c
> index fe9e9facbe..772587c05a 100644
> --- a/xen/arch/arm/cpuerrata.c
> +++ b/xen/arch/arm/cpuerrata.c
> @@ -64,6 +64,12 @@ void check_local_cpu_errata(void)
> {
> update_cpu_capabilities(arm_errata, "enabled workaround for");
> }
> +
> +void __init enable_errata_workarounds(void)
> +{
> + enable_cpu_capabilities(arm_errata);
> +}
> +
> /*
> * Local variables:
> * mode: C
> diff --git a/xen/arch/arm/cpufeature.c b/xen/arch/arm/cpufeature.c
> index 479c9fb011..525b45e22f 100644
> --- a/xen/arch/arm/cpufeature.c
> +++ b/xen/arch/arm/cpufeature.c
> @@ -19,6 +19,7 @@
> #include <xen/types.h>
> #include <xen/init.h>
> #include <xen/smp.h>
> +#include <xen/stop_machine.h>
> #include <asm/cpufeature.h>
>
> DECLARE_BITMAP(cpu_hwcaps, ARM_NCAPS);
> @@ -40,6 +41,34 @@ void update_cpu_capabilities(const struct
> arm_cpu_capabilities *caps,
> }
>
> /*
> + * Run through the enabled capabilities and enable() it on all active
> + * CPUs.
> + */
> +void __init enable_cpu_capabilities(const struct arm_cpu_capabilities *caps)
> +{
> + for ( ; caps->matches; caps++ )
> + {
> + if ( !cpus_have_cap(caps->capability) )
> + continue;
> +
> + if ( caps->enable )
> + {
> + int ret;
> +
> + /*
> + * Use stop_machine_run() as it schedules the work allowing
> + * us to modify PSTATE, instead of on_each_cpu() which uses
> + * an IPI, giving us a PSTATE that disappears when we
> + * return.
> + */
> + ret = stop_machine_run(caps->enable, (void *)caps, NR_CPUS);
> + /* stop_machine_run should never fail at this stage of the boot.
> */
> + BUG_ON(ret);
> + }
> + }
> +}
> +
> +/*
> * Local variables:
> * mode: C
> * c-file-style: "BSD"
> diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
> index 16a3b1be8e..032a6a882d 100644
> --- a/xen/arch/arm/setup.c
> +++ b/xen/arch/arm/setup.c
> @@ -849,6 +849,7 @@ void __init start_xen(unsigned long boot_phys_offset,
> * stop_machine (tasklets initialized via an initcall).
> */
> apply_alternatives_all();
> + enable_errata_workarounds();
>
> /* Create initial domain 0. */
> /* The vGIC for DOM0 is exactly emulating the hardware GIC */
> diff --git a/xen/include/asm-arm/cpuerrata.h b/xen/include/asm-arm/cpuerrata.h
> index 8b158429c7..7de68361ff 100644
> --- a/xen/include/asm-arm/cpuerrata.h
> +++ b/xen/include/asm-arm/cpuerrata.h
> @@ -5,6 +5,7 @@
> #include <asm/alternative.h>
>
> void check_local_cpu_errata(void);
> +void enable_errata_workarounds(void);
>
> #ifdef CONFIG_HAS_ALTERNATIVE
>
> diff --git a/xen/include/asm-arm/cpufeature.h
> b/xen/include/asm-arm/cpufeature.h
> index f00b6dbd39..21c65e198c 100644
> --- a/xen/include/asm-arm/cpufeature.h
> +++ b/xen/include/asm-arm/cpufeature.h
> @@ -74,6 +74,7 @@ struct arm_cpu_capabilities {
> const char *desc;
> u16 capability;
> bool (*matches)(const struct arm_cpu_capabilities *);
> + int (*enable)(void *); /* Called on every active CPUs */
> union {
> struct { /* To be used for eratum handling only */
> u32 midr_model;
> @@ -85,6 +86,8 @@ struct arm_cpu_capabilities {
> void update_cpu_capabilities(const struct arm_cpu_capabilities *caps,
> const char *info);
>
> +void enable_cpu_capabilities(const struct arm_cpu_capabilities *caps);
> +
> #endif /* __ASSEMBLY__ */
>
> #endif
> --
> 2.11.0
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |