xen/arm: Introduce enable callback to enable a capabilities on each online CPU

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@linaro.org>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
Signed-off-by: Stefano Stabellini <sstabellini@kernel.org>
(cherry picked from commit 7500495155)

Conflicts:
	xen/include/asm-arm/cpufeature.h
	xen/arch/arm/setup.c
This commit is contained in:
Julien Grall authored and Stefano Stabellini committed 2018-02-16 16:35:02 -08:00
1 parent 56510154bb
commit ee23fcc253
5 files changed
+41

No files matched your search

+6
View File
@@ -24,6 +24,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
+29
View File
@@ -20,6 +20,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
+2
View File
@@ -829,6 +829,8 @@ void __init start_xen(unsigned long boot_phys_offset,
do_initcalls();
enable_errata_workarounds();
/* Create initial domain 0. */
/* The vGIC for DOM0 is exactly emulating the hardware GIC */
config.gic_version = XEN_DOMCTL_CONFIG_GIC_NATIVE;
+1
View File
@@ -2,6 +2,7 @@
#define __ARM_CPUERRATA_H__
void check_local_cpu_errata(void);
void enable_errata_workarounds(void);
#endif /* __ARM_CPUERRATA_H__ */
/*
+3
View File
@@ -66,6 +66,7 @@ struct arm_cpu_capabilities {
const char *desc;
u16 capability;
bool_t (*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;
@@ -77,6 +78,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
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.