[PATCH 1/2][Bionic] Revert "arm64: capabilities: Change scope of VHE to Boot CPU feature"
Ike Panhc
ike.pan at canonical.com
Thu Nov 21 02:35:54 UTC 2019
Yes, I forget to edit subject before sending it out.
On 11/21/19 10:05 AM, Po-Hsu Lin wrote:
> 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