|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v2 10/15] xen/arm: Detect silicon revision and set cap bits accordingly
On Mon, 30 May 2016, Julien Grall wrote:
> Hi Stefano,
>
> On 30/05/2016 16:02, Stefano Stabellini wrote:
> > On Mon, 23 May 2016, Julien Grall wrote:
> > > After each CPU has been started, we iterate through a list of CPU
> > > errata to detect CPUs which need from hypervisor code patches.
> > >
> > > For each bug there is a function which check if that a particular CPU is
> > > affected. This needs to be done on every CPUs to cover heterogenous
> > > system properly.
> > >
> > > If a certain erratum has been detected, the capability bit will be set
> > > and later the call to apply_alternatives() will trigger the actual code
> > > patching.
> > >
> > > The code is based on the file arch/arm64/kernel/cpu_errata.c in Linux
> > > v4.6-rc3.
> > >
> > > Signed-off-by: Julien Grall <julien.grall@xxxxxxx>
> > >
> > > ---
> > > Changes in v2:
> > > - Use XENLOG_INFO for the loglevel of the message
> > > ---
> > > xen/arch/arm/Makefile | 1 +
> > > xen/arch/arm/cpuerrata.c | 26 ++++++++++++++++++++++++++
> > > xen/arch/arm/cpufeature.c | 16 ++++++++++++++++
> > > xen/arch/arm/setup.c | 3 +++
> > > xen/arch/arm/smpboot.c | 3 +++
> > > xen/include/asm-arm/cpuerrata.h | 6 ++++++
> > > xen/include/asm-arm/cpufeature.h | 15 +++++++++++++++
> > > 7 files changed, 70 insertions(+)
> > > create mode 100644 xen/arch/arm/cpuerrata.c
> > > create mode 100644 xen/include/asm-arm/cpuerrata.h
> > >
> > > diff --git a/xen/arch/arm/Makefile b/xen/arch/arm/Makefile
> > > index 2d330aa..307578c 100644
> > > --- a/xen/arch/arm/Makefile
> > > +++ b/xen/arch/arm/Makefile
> > > @@ -7,6 +7,7 @@ subdir-$(CONFIG_ACPI) += acpi
> > > obj-$(CONFIG_ALTERNATIVE) += alternative.o
> > > obj-y += bootfdt.o
> > > obj-y += cpu.o
> > > +obj-y += cpuerrata.o
> > > obj-y += cpufeature.o
> > > obj-y += decode.o
> > > obj-y += device.o
> > > diff --git a/xen/arch/arm/cpuerrata.c b/xen/arch/arm/cpuerrata.c
> > > new file mode 100644
> > > index 0000000..52d39f8
> > > --- /dev/null
> > > +++ b/xen/arch/arm/cpuerrata.c
> > > @@ -0,0 +1,26 @@
> > > +#include <xen/config.h>
> > > +#include <asm/cpufeature.h>
> > > +#include <asm/cpuerrata.h>
> > > +
> > > +#define MIDR_RANGE(model, min, max) \
> > > + .matches = is_affected_midr_range, \
> > > + .midr_model = model, \
> > > + .midr_range_min = min, \
> > > + .midr_range_max = max
> > > +
> > > +static bool_t __maybe_unused
> >
> > I would remove __maybe_unused given that you are going to use this
> > function in later patches.
>
> The user can decide to disable all the errata, so this function will be
> unused.
>
> Also, if I drop the __may_unused now, the compilation will fail because nobody
> is use it so far.
Ah, I see.
> > > +is_affected_midr_range(const struct arm_cpu_capabilities *entry)
> > > +{
> > > + return MIDR_IS_CPU_MODEL_RANGE(boot_cpu_data.midr.bits,
> > > entry->midr_model,
> > > + entry->midr_range_min,
> > > + entry->midr_range_max);
> > > +}
> > > +
> > > +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 should actually be called on arm64 only, right?
> > Given that runtime patching is unimplemented on arm32. I wouldn't want
> > to rely on the fact that we don't have any arm32 workarounds at the
> > moment.
>
> Whilst runtime patching is making use of the cpu features, not all the
> features (or erratum) may require runtime patching.
>
> So I deliberately keep this code enabled on ARM32.
All right. But then what is stopping people from reading
docs/misc/arm/silicon-errata.txt and trying to use it on arm32?
> > > diff --git a/xen/arch/arm/cpufeature.c b/xen/arch/arm/cpufeature.c
> > > index 7a1b56b..088625b 100644
> > > --- a/xen/arch/arm/cpufeature.c
> > > +++ b/xen/arch/arm/cpufeature.c
> > > @@ -24,6 +24,22 @@
> > >
> > > DECLARE_BITMAP(cpu_hwcaps, ARM_NCAPS);
> > >
> > > +void update_cpu_capabilities(const struct arm_cpu_capabilities *caps,
> > > + const char *info)
> >
> > The info parameter is unnecessary.
>
> It is used in the printk below:
>
> printk(XENLOG_INFO "%s: %s\n", info, caps[i].desc);
I know. Couldn't you just write the message directly below? It doesn't
look like that passing around that string is adding much value to the
code.
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |