|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 1/3] tools/hvmloader: Retrieve (x2)APIC IDs from the APs themselves
On Tue Jan 28, 2025 at 5:59 PM GMT, Roger Pau Monné wrote:
> On Tue, Jan 28, 2025 at 04:33:40PM +0000, Alejandro Vallejo wrote:
> > Make it so the APs expose their own APIC IDs in a lookup table (LUT). We
> > can use that LUT to populate the MADT, decoupling the algorithm that
> > relates CPU IDs and APIC IDs from hvmloader.
> >
> > Modified the printf to also print the APIC ID of each CPU, as well as
> > fixing a (benign) wrong specifier being used for the vcpu id.
> >
> > Signed-off-by: Alejandro Vallejo <alejandro.vallejo@xxxxxxxxx>
> > ---
> > Changes from the v7 version of this patch in the longer topology series:
> > * s/cpu_to_x2apicid/cpu_to_apicid/
> > * Though, as I already stated, I don't think this is a good idea.
> > * Dynamically size cpu_to_apicid rather than using HVM_MAX_VCPUS.
> > * Got rid of the ap_callin removal. It's not as trivial if we don't
> > want to assume cpu0 always has apicid=0. Part of the complaints on
> > the previous versions involved the inability to do that.
> > * For debugging sanity, I've added the apicid to the CPU boot printf.
> > * Later on, toolstack will choose the APIC IDs and it's helpful
> > to know the relationship in the logs.
> > * While at it, fix the vcpu specifier s/%d/%u/
> > * Check for leaf 0xb while probing for x2apic support.
> > ---
> > tools/firmware/hvmloader/smp.c | 43 +++++++++++++++++++++++++++++++++-
> > 1 file changed, 42 insertions(+), 1 deletion(-)
> >
> > diff --git a/tools/firmware/hvmloader/smp.c b/tools/firmware/hvmloader/smp.c
> > index 1b940cefd071..c61ed524f947 100644
> > --- a/tools/firmware/hvmloader/smp.c
> > +++ b/tools/firmware/hvmloader/smp.c
> > @@ -31,9 +31,38 @@
> >
> > static int ap_callin;
> >
> > +/** True if x2apic support is exposed to the guest. */
> > +static bool has_x2apic;
> > +
> > +/**
> > + * Lookup table of (x2)APIC IDs.
>
> Not sure you need to explicitly mention (x2) in the comment? It will
> either be xAPIC or x2APIC IDs, but just using "APIC IDs" should cover
> both unambiguously?
Sure.
>
> > + *
> > + * Each entry is populated for its respective CPU as they come online.
> > This is
> > + * required for generating the MADT with minimal assumptions about ID
> > + * relationships.
> > + */
> > +uint32_t *cpu_to_apicid;
> > +
> > +static uint32_t read_apic_id(void)
> > +{
> > + uint32_t apic_id;
> > +
> > + if ( has_x2apic )
> > + cpuid(0xb, NULL, NULL, NULL, &apic_id);
> > + else
> > + {
> > + cpuid(1, NULL, &apic_id, NULL, NULL);
> > + apic_id >>= 24;
> > + }
> > +
> > + return apic_id;
> > +}
> > +
> > static void cpu_setup(unsigned int cpu)
> > {
> > - printf(" - CPU%d ... ", cpu);
> > + uint32_t apicid = cpu_to_apicid[cpu] = read_apic_id();
> > +
> > + printf(" - CPU%u[%u] ... ", cpu, apicid);
>
> I would explicitly name the field in the print:
>
> " - CPU%u APIC ID %u ... "
>
> As otherwise it's not obvious what the value in the braces is (and you
> have to go look at the code).
Sure.
>
> > cacheattr_init();
> > printf("done.\n");
> >
> > @@ -104,8 +133,20 @@ static void boot_cpu(unsigned int cpu)
> > void smp_initialise(void)
> > {
> > unsigned int i, nr_cpus = hvm_info->nr_vcpus;
> > + uint32_t ecx, max_leaf;
>
> Noticed you could narrow the scope of ecx, but at the price of
> introducing the definition line inside of the if condition. I don't
> have a strong opinion, and I assume you prefer it this way, which is
> fine IMO.
>
> Thanks, Roger.
I marginally prefer it this way, but I don't particularly care. I wanted to
avoid one more line in a hunk that's already quite high for a single CPUID
check.
Cheers,
Alejandro
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |