[xen stable-4.6] xen/arm: Introduce enable callback to enable a capabilities on each online CPU

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

[xen stable-4.6] xen/arm: Introduce enable callback to enable a capabilities on each online CPU

patchbot
commit ee23fcc2539ce8143ae4ce58a7c140fa46a4359b
Author:     Julien Grall <[hidden email]>
AuthorDate: Tue Jan 16 14:23:33 2018 +0000
Commit:     Stefano Stabellini <[hidden email]>
CommitDate: Fri Feb 16 16:35:02 2018 -0800

    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 <[hidden email]>
    Reviewed-by: Stefano Stabellini <[hidden email]>
    Signed-off-by: Stefano Stabellini <[hidden email]>
    (cherry picked from commit 7500495155aacce437878cb576f45224ae984f40)
   
    Conflicts:
            xen/include/asm-arm/cpufeature.h
            xen/arch/arm/setup.c
---
 xen/arch/arm/cpuerrata.c         |  6 ++++++
 xen/arch/arm/cpufeature.c        | 29 +++++++++++++++++++++++++++++
 xen/arch/arm/setup.c             |  2 ++
 xen/include/asm-arm/cpuerrata.h  |  1 +
 xen/include/asm-arm/cpufeature.h |  3 +++
 5 files changed, 41 insertions(+)

diff --git a/xen/arch/arm/cpuerrata.c b/xen/arch/arm/cpuerrata.c
index 03ae7b496c..563cc7a0e4 100644
--- a/xen/arch/arm/cpuerrata.c
+++ b/xen/arch/arm/cpuerrata.c
@@ -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
diff --git a/xen/arch/arm/cpufeature.c b/xen/arch/arm/cpufeature.c
index 088625bbac..c1cd425067 100644
--- a/xen/arch/arm/cpufeature.c
+++ b/xen/arch/arm/cpufeature.c
@@ -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);
@@ -41,6 +42,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 e329ac708a..ba899d792c 100644
--- a/xen/arch/arm/setup.c
+++ b/xen/arch/arm/setup.c
@@ -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;
diff --git a/xen/include/asm-arm/cpuerrata.h b/xen/include/asm-arm/cpuerrata.h
index c495ee5009..5d66194fa7 100644
--- a/xen/include/asm-arm/cpuerrata.h
+++ b/xen/include/asm-arm/cpuerrata.h
@@ -2,6 +2,7 @@
 #define __ARM_CPUERRATA_H__
 
 void check_local_cpu_errata(void);
+void enable_errata_workarounds(void);
 
 #endif /* __ARM_CPUERRATA_H__ */
 /*
diff --git a/xen/include/asm-arm/cpufeature.h b/xen/include/asm-arm/cpufeature.h
index fb57295ec5..1802499e29 100644
--- a/xen/include/asm-arm/cpufeature.h
+++ b/xen/include/asm-arm/cpufeature.h
@@ -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
--
generated by git-patchbot for /home/xen/git/xen.git#stable-4.6

_______________________________________________
Xen-changelog mailing list
[hidden email]
https://lists.xenproject.org/xen-changelog