[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 2/6] xen/arm: Provide macros to help creating workaround helpers
On Wed, 27 Jul 2016, Julien Grall wrote: > Workarounds may require to execute a different path when the platform > is affected by the associated erratum. Furthermore, this may need to > be called in the common code. > > To avoid too much intrusion/overhead, the workaround helpers need to > be a nop on architecture which will never have the workaround and have > to be quick to check whether the platform requires it. > > The alternative framework is used to transform the check in a single > instruction. When the framework is not available, the helper will have > ~6 instructions including 1 instruction load. > > The macro will create a handler called check_workaround_xxxxx with > xxxx the erratum number. > > For instance, the line bellow will create a workaround helper for > erratum #424242 which is enabled when the capability > ARM64_WORKAROUND_424242 is set and only available for ARM64: > > CHECK_WORKAROUND_HELPER(424242, ARM64_WORKAROUND_42424242, CONFIG_ARM64) > > Signed-off-by: Julien Grall <julien.grall@xxxxxxx> > Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx> Acked-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> > --- > Changes in v2: > - Add Konrad's reviewed-by > --- > xen/include/asm-arm/cpuerrata.h | 39 +++++++++++++++++++++++++++++++++++++++ > 1 file changed, 39 insertions(+) > > diff --git a/xen/include/asm-arm/cpuerrata.h b/xen/include/asm-arm/cpuerrata.h > index c495ee5..2982a92 100644 > --- a/xen/include/asm-arm/cpuerrata.h > +++ b/xen/include/asm-arm/cpuerrata.h > @@ -1,8 +1,47 @@ > #ifndef __ARM_CPUERRATA_H__ > #define __ARM_CPUERRATA_H__ > > +#include <xen/config.h> > +#include <asm/cpufeature.h> > +#include <asm/alternative.h> > + > void check_local_cpu_errata(void); > > +#ifdef CONFIG_ALTERNATIVE > + > +#define CHECK_WORKAROUND_HELPER(erratum, feature, arch) \ > +static inline bool_t check_workaround_##erratum(void) \ > +{ \ > + if ( !IS_ENABLED(arch) ) \ > + return 0; \ > + else \ > + { \ > + bool_t ret; \ > + \ > + asm volatile (ALTERNATIVE("mov %0, #0", \ > + "mov %0, #1", \ > + feature) \ > + : "=r" (ret)); \ > + \ > + return unlikely(ret); \ > + } \ > +} > + > +#else /* CONFIG_ALTERNATIVE */ > + > +#define CHECK_WORKAROUND_HELPER(erratum, feature, arch) \ > +static inline bool_t check_workaround_##erratum(void) \ > +{ \ > + if ( !IS_ENABLED(arch) ) \ > + return 0; \ > + else \ > + return unlikely(cpus_have_cap(feature)); \ > +} > + > +#endif > + > +#undef CHECK_WORKAROUND_HELPER > + > #endif /* __ARM_CPUERRATA_H__ */ > /* > * Local variables: > -- > 1.9.1 > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |