Hi Julien, > On 10 Dec 2020, at 16:05, Julien Grall <jul...@xen.org> wrote: > > > > On 10/12/2020 15:48, Bertrand Marquis wrote: >> Hi Julien, >>> On 9 Dec 2020, at 23:09, Julien Grall <jul...@xen.org> wrote: >>> >>> Hi Bertand, >>> >>> On 09/12/2020 16:30, Bertrand Marquis wrote: >>>> Create a cpuinfo structure for guest and mask into it the features that >>>> we do not support in Xen or that we do not want to publish to guests. >>>> Modify some values in the cpuinfo structure for guests to mask some >>>> features which we do not want to allow to guests (like AMU) or we do not >>>> support (like SVE). >>>> The code is trying to group together registers modifications for the >>>> same feature to be able in the long term to easily enable/disable a >>>> feature depending on user parameters or add other registers modification >>>> in the same place (like enabling/disabling HCR bits). >>>> Signed-off-by: Bertrand Marquis <bertrand.marq...@arm.com> >>>> --- >>>> Changes in V2: Rebase >>>> Changes in V3: >>>> Use current_cpu_data info instead of recalling identify_cpu >>>> --- >>>> xen/arch/arm/cpufeature.c | 51 ++++++++++++++++++++++++++++++++ >>>> xen/include/asm-arm/cpufeature.h | 2 ++ >>>> 2 files changed, 53 insertions(+) >>>> diff --git a/xen/arch/arm/cpufeature.c b/xen/arch/arm/cpufeature.c >>>> index bc7ee5ac95..7255383504 100644 >>>> --- a/xen/arch/arm/cpufeature.c >>>> +++ b/xen/arch/arm/cpufeature.c >>>> @@ -24,6 +24,8 @@ >>>> DECLARE_BITMAP(cpu_hwcaps, ARM_NCAPS); >>>> +struct cpuinfo_arm __read_mostly guest_cpuinfo; >>>> + >>>> void update_cpu_capabilities(const struct arm_cpu_capabilities *caps, >>>> const char *info) >>>> { >>>> @@ -157,6 +159,55 @@ void identify_cpu(struct cpuinfo_arm *c) >>>> #endif >>>> } >>>> +/* >>>> + * This function is creating a cpuinfo structure with values modified to >>>> mask >>>> + * all cpu features that should not be published to guest. >>>> + * The created structure is then used to provide ID registers values to >>>> guests. >>>> + */ >>>> +static int __init create_guest_cpuinfo(void) >>>> +{ >>>> + /* >>>> + * TODO: The code is currently using only the features detected on >>>> the boot >>>> + * core. In the long term we should try to compute values containing >>>> only >>>> + * features supported by all cores. >>>> + */ >>>> + guest_cpuinfo = current_cpu_data; >>> >>> It would be more logical to use boot_cpu_data as this would be easier to >>> match with your comment. >> Agree, I will fix that in V4. >>> >>>> + >>>> +#ifdef CONFIG_ARM_64 >>>> + /* Disable MPAM as xen does not support it */ >>>> + guest_cpuinfo.pfr64.mpam = 0; >>>> + guest_cpuinfo.pfr64.mpam_frac = 0; >>>> + >>>> + /* Disable SVE as Xen does not support it */ >>>> + guest_cpuinfo.pfr64.sve = 0; >>>> + guest_cpuinfo.zfr64.bits[0] = 0; >>>> + >>>> + /* Disable MTE as Xen does not support it */ >>>> + guest_cpuinfo.pfr64.mte = 0; >>>> +#endif >>>> + >>>> + /* Disable AMU */ >>>> +#ifdef CONFIG_ARM_64 >>>> + guest_cpuinfo.pfr64.amu = 0; >>>> +#endif >>>> + guest_cpuinfo.pfr32.amu = 0; >>>> + >>>> + /* Disable RAS as Xen does not support it */ >>>> +#ifdef CONFIG_ARM_64 >>>> + guest_cpuinfo.pfr64.ras = 0; >>>> + guest_cpuinfo.pfr64.ras_frac = 0; >>>> +#endif >>>> + guest_cpuinfo.pfr32.ras = 0; >>>> + guest_cpuinfo.pfr32.ras_frac = 0; >>> >>> How about all the fields that are currently marked as RES0/RES1? Shouldn't >>> we make sure they will stay like that even if newer architecture use them? >> Definitely we can do more then this here (including allowing to enable some >> things for dom0 or for test reasons). >> This is a first try to solve current issues with MPAM and SVE and I plan to >> continue to enhance this in the future >> to enable more customisation here. >> I do think we could do a bit more here to have some features controlled by >> the user but this will need a bit of >> discussion to agree on a strategy. > > I think you misunderstood my comment. I am not asking whether we want to > customize the value per domain. Instead, I am raising questions for the > strategy taken in this patch. > > I am going to leave the safety aside, because I think this is orthogonal to > this patch. > > This patch is introducing a deny list. This means that all the features will > be exposed to a domain unless someone determine that this is not > supported by Xen. > > This means we will always try to catch up with what Arm decided to invent and > attempt to fix it before the silicon is out. > > Instead, I think it would be better to use an allow list. We should only > expose features to the guest we know works (this could possibly be just the > Armv8.0 one).
I understood that and I fully agree that this is what we should do: only expose what we support and know and let everything else as “disabled”. And I definitely want to do that and I think with this serie we have the required support to do that, we will need to rework how we initialise the guest_cpuinfo structure. I just want to leave this discussion for after so that we can at least right now have a current linux booting without the need to modify the linux kernel binary to remove things like SVE. Regards Bertrand > > Cheers, > > -- > Julien Grall