[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 3/3] xen/arm: Add sb instruction support
Hi, > On 9 May 2022, at 12:08, Julien Grall <julien@xxxxxxx> wrote: > > Hi, > > On 09/05/2022 11:49, Bertrand Marquis wrote: >>> On 9 May 2022, at 11:31, Julien Grall <julien@xxxxxxx> wrote: >>> On 09/05/2022 11:08, Bertrand Marquis wrote: >>>>> On 4 May 2022, at 09:06, Julien Grall <julien@xxxxxxx> wrote: >>>>> >>>>> >>>>> >>>>> On 04/05/2022 08:24, Bertrand Marquis wrote: >>>>>> Hi Julien, >>>>> >>>>> Hi Bertrand, >>>>> >>>>>>> On 3 May 2022, at 19:47, Julien Grall <julien@xxxxxxx> wrote: >>>>>>>> A new cpuerrata capability is introduced to enable the alternative >>>>>>> >>>>>>> 'sb' is definitely not an erratum. Errata are for stuff that are meant >>>>>>> to be specific to one (or multiple) CPU and they are not part of the >>>>>>> architecture. >>>>>>> >>>>>>> This is the first time we introduce a feature in Xen. So we need to add >>>>>>> a new array in cpufeature.c that will cover 'SB' for now. In future we >>>>>>> could add feature like pointer auth, LSE atomics... >>>>>> I am not quite sure why you would want to do that. >>>>>> Using the sb instruction is definitely something to do to solve erratas, >>>>>> if a CPU is not impacted by those erratas, why would you want to use >>>>>> this ? >>>>> >>>>> I agree that SB is used to solve errata but the instruction itself is not >>>>> a workaround (it may be part of it though). Instead, this is a more >>>>> efficient way to prevent speculation and will replace dsb/isb. >>>>> >>>>> Speculation is never going to disappear from processor. So, in the >>>>> future, there might be valid reason for us to say "We don't want the >>>>> processor to speculate". This would mean using SB. >>>> If the need arise then we will check depending on that how we can support >>>> it but in the current status as there is no use case I don’t think we need >>>> that. >>> >>> It is not clear how I should read this answer... If you add SB in >>> cpuerrata.c, then a user will start to see message like: >>> >>> "enabled workaround for Speculation Barrier". >>> >>> Which is completely bogus. Replacing "dsb; isb" with "sb" is mostly an >>> optimization and none of the current use will end up to be architecturaly >>> executed. >> So ultimately something like this is what you are looking for ? >> diff --git a/xen/arch/arm/cpuerrata.c b/xen/arch/arm/cpuerrata.c >> index e744abe800..7c3e5141a6 100644 >> --- a/xen/arch/arm/cpuerrata.c >> +++ b/xen/arch/arm/cpuerrata.c >> @@ -681,9 +681,12 @@ static const struct arm_cpu_capabilities arm_errata[] = >> { >> .capability = ARM64_WORKAROUND_AT_SPECULATE, >> MIDR_ALL_VERSIONS(MIDR_CORTEX_A55), >> }, >> +}; >> + >> +static const struct arm_cpu_capabilities arm_features[] = { >> #ifdef CONFIG_ARM_64 >> { >> - .desc = "Speculation barrier (SB)", >> + .desc = "Speculation barrier instruction (SB)", >> .capability = ARM64_HAS_SB, >> .matches = has_sb_instruction, >> }, >> @@ -694,6 +697,7 @@ static const struct arm_cpu_capabilities arm_errata[] = { >> void check_local_cpu_errata(void) >> { >> update_cpu_capabilities(arm_errata, "enabled workaround for"); >> + update_cpu_capabilities(arm_features, "enabled support for"); >> } > What I am looking for is two separate arrays: one for workaround and the > other for features. Something like (untested): > > diff --git a/xen/arch/arm/cpufeature.c b/xen/arch/arm/cpufeature.c > index a58965f7b9bf..54c10751dba8 100644 > --- a/xen/arch/arm/cpufeature.c > +++ b/xen/arch/arm/cpufeature.c > @@ -70,6 +70,20 @@ void __init enable_cpu_capabilities(const struct > arm_cpu_capabilities *caps) > } > } > > +static const struct arm_cpu_capabilities arm_features[] = { > + /* XXX: Add SB */ > + {}, > +}; > + > +void check_local_cpu_features(void) > +{ > + update_cpu_capabilities(arm_features, "enabled support for"); > +} > + > +void __init enable_cpu_features(void) > +{ > + enable_cpu_capabilities(arm_features); > +} > + > /* > * Run through the enabled capabilities and enable() them on the calling CPU. > * If enabling of any capability fails the error is returned. After enabling a > diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c > index d5d0792ed48a..c2cd442844df 100644 > --- a/xen/arch/arm/setup.c > +++ b/xen/arch/arm/setup.c > @@ -951,6 +951,7 @@ void __init start_xen(unsigned long boot_phys_offset, > * (called from smp_init_cpus()). > */ > check_local_cpu_errata(); > + check_local_cpu_features(); > > init_xen_time(); > > @@ -1021,6 +1022,7 @@ void __init start_xen(unsigned long boot_phys_offset, > */ > apply_alternatives_all(); > enable_errata_workarounds(); > + enable_cpu_features(); > > /* Create initial domain 0. */ > if ( !is_dom0less_mode() ) > diff --git a/xen/arch/arm/smpboot.c b/xen/arch/arm/smpboot.c > index 7bfd0a73a7d2..d6b8c598df98 100644 > --- a/xen/arch/arm/smpboot.c > +++ b/xen/arch/arm/smpboot.c > @@ -383,6 +383,7 @@ void start_secondary(void) > local_abort_enable(); > > check_local_cpu_errata(); > + check_local_cpu_features(); > > printk(XENLOG_DEBUG "CPU %u booted.\n", smp_processor_id()); Thanks for the code, I get the idea and will do that. Cheers Bertrand > > Cheers, > > -- > Julien Grall
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |