[PATCH 1/2][Bionic] Revert "arm64: capabilities: Change scope of VHE to Boot CPU feature"

Po-Hsu Lin po-hsu.lin at canonical.com
Thu Nov 21 02:05:33 UTC 2019


Hello Ike,
as this is just reverting one commit, I think [PATCH 1/2] should be
just [PATCH], right?
Thanks

On Tue, Nov 19, 2019 at 5:53 PM Ike Panhc <ike.pan at canonical.com> wrote:
>
> BugLink: http://bugs.launchpad.net/bugs/1852723
>
> The 4.15.0-71.80 generic kernel can not boot on several arm64 machines.
> Bisect patches and find out we can solve this problem by reverting
> a single patch which comes from stable kernel update.
>
> This reverts commit 628859e8621cbb105cfbfa2138a68ddbd72958a7.
>
> Signed-off-by: Ike Panhc <ike.pan at canonical.com>
> ---
>  arch/arm64/include/asm/cpufeature.h |  6 -----
>  arch/arm64/include/asm/virt.h       |  6 +++++
>  arch/arm64/kernel/cpufeature.c      |  5 ++--
>  arch/arm64/kernel/smp.c             | 38 +++++++++++++++++++++++++++++
>  4 files changed, 46 insertions(+), 9 deletions(-)
>
> diff --git a/arch/arm64/include/asm/cpufeature.h b/arch/arm64/include/asm/cpufeature.h
> index f3aa281b97cb..513570cd3e6f 100644
> --- a/arch/arm64/include/asm/cpufeature.h
> +++ b/arch/arm64/include/asm/cpufeature.h
> @@ -289,12 +289,6 @@ extern struct arm64_ftr_reg arm64_ftr_reg_ctrel0;
>         (ARM64_CPUCAP_SCOPE_LOCAL_CPU           |       \
>          ARM64_CPUCAP_OPTIONAL_FOR_LATE_CPU)
>
> -/*
> - * CPU feature used early in the boot based on the boot CPU. All secondary
> - * CPUs must match the state of the capability as detected by the boot CPU.
> - */
> -#define ARM64_CPUCAP_STRICT_BOOT_CPU_FEATURE ARM64_CPUCAP_SCOPE_BOOT_CPU
> -
>  struct arm64_cpu_capabilities {
>         const char *desc;
>         u16 capability;
> diff --git a/arch/arm64/include/asm/virt.h b/arch/arm64/include/asm/virt.h
> index 9d1e24e030b3..c5f89442785c 100644
> --- a/arch/arm64/include/asm/virt.h
> +++ b/arch/arm64/include/asm/virt.h
> @@ -102,6 +102,12 @@ static inline bool has_vhe(void)
>         return false;
>  }
>
> +#ifdef CONFIG_ARM64_VHE
> +extern void verify_cpu_run_el(void);
> +#else
> +static inline void verify_cpu_run_el(void) {}
> +#endif
> +
>  #endif /* __ASSEMBLY__ */
>
>  #endif /* ! __ASM__VIRT_H */
> diff --git a/arch/arm64/kernel/cpufeature.c b/arch/arm64/kernel/cpufeature.c
> index d19a7b8bb6fb..672443860341 100644
> --- a/arch/arm64/kernel/cpufeature.c
> +++ b/arch/arm64/kernel/cpufeature.c
> @@ -1113,15 +1113,13 @@ static const struct arm64_cpu_capabilities arm64_features[] = {
>                 .matches = cpufeature_pan_not_uao,
>         },
>  #endif /* CONFIG_ARM64_PAN */
> -#ifdef CONFIG_ARM64_VHE
>         {
>                 .desc = "Virtualization Host Extensions",
>                 .capability = ARM64_HAS_VIRT_HOST_EXTN,
> -               .type = ARM64_CPUCAP_STRICT_BOOT_CPU_FEATURE,
> +               .type = ARM64_CPUCAP_SYSTEM_FEATURE,
>                 .matches = runs_at_el2,
>                 .cpu_enable = cpu_copy_el2regs,
>         },
> -#endif /* CONFIG_ARM64_VHE */
>         {
>                 .desc = "32-bit EL0 Support",
>                 .capability = ARM64_HAS_32BIT_EL0,
> @@ -1491,6 +1489,7 @@ static bool verify_local_cpu_caps(u16 scope_mask)
>   */
>  static void check_early_cpu_features(void)
>  {
> +       verify_cpu_run_el();
>         verify_cpu_asid_bits();
>         /*
>          * Early features are used by the kernel already. If there
> diff --git a/arch/arm64/kernel/smp.c b/arch/arm64/kernel/smp.c
> index 2faa9863d2e5..a077c3d2fd73 100644
> --- a/arch/arm64/kernel/smp.c
> +++ b/arch/arm64/kernel/smp.c
> @@ -85,6 +85,43 @@ enum ipi_msg_type {
>         IPI_WAKEUP
>  };
>
> +#ifdef CONFIG_ARM64_VHE
> +
> +/* Whether the boot CPU is running in HYP mode or not*/
> +static bool boot_cpu_hyp_mode;
> +
> +static inline void save_boot_cpu_run_el(void)
> +{
> +       boot_cpu_hyp_mode = is_kernel_in_hyp_mode();
> +}
> +
> +static inline bool is_boot_cpu_in_hyp_mode(void)
> +{
> +       return boot_cpu_hyp_mode;
> +}
> +
> +/*
> + * Verify that a secondary CPU is running the kernel at the same
> + * EL as that of the boot CPU.
> + */
> +void verify_cpu_run_el(void)
> +{
> +       bool in_el2 = is_kernel_in_hyp_mode();
> +       bool boot_cpu_el2 = is_boot_cpu_in_hyp_mode();
> +
> +       if (in_el2 ^ boot_cpu_el2) {
> +               pr_crit("CPU%d: mismatched Exception Level(EL%d) with boot CPU(EL%d)\n",
> +                                       smp_processor_id(),
> +                                       in_el2 ? 2 : 1,
> +                                       boot_cpu_el2 ? 2 : 1);
> +               cpu_panic_kernel();
> +       }
> +}
> +
> +#else
> +static inline void save_boot_cpu_run_el(void) {}
> +#endif
> +
>  #ifdef CONFIG_HOTPLUG_CPU
>  static int op_cpu_kill(unsigned int cpu);
>  #else
> @@ -410,6 +447,7 @@ void __init smp_prepare_boot_cpu(void)
>          */
>         jump_label_init();
>         cpuinfo_store_boot_cpu();
> +       save_boot_cpu_run_el();
>  }
>
>  static u64 __init of_get_cpu_mpidr(struct device_node *dn)
> --
> 2.17.1
>
>
> --
> kernel-team mailing list
> kernel-team at lists.ubuntu.com
> https://lists.ubuntu.com/mailman/listinfo/kernel-team



More information about the kernel-team mailing list