mirror of
https://github.com/xen-project/xen.git
synced 2026-10-28 10:11:27 +01:00
tools/hvmloader: Retrieve APIC IDs from the APs themselves
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@cloud.com> Acked-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
1 parent
55e2d86baa
commit
9ad0db58c7
2 files changed
+44
-1
No files matched your search
@@ -48,6 +48,8 @@ extern uint8_t ioapic_version;
|
||||
|
||||
#define IOAPIC_ID 0x01
|
||||
|
||||
extern uint32_t *cpu_to_apicid;
|
||||
|
||||
#define LAPIC_BASE_ADDRESS 0xfee00000
|
||||
#define LAPIC_ID(vcpu_id) ((vcpu_id) * 2)
|
||||
|
||||
|
||||
@@ -31,9 +31,38 @@
|
||||
|
||||
static int ap_callin;
|
||||
|
||||
/** True if x2apic support is exposed to the guest. */
|
||||
static bool has_x2apic;
|
||||
|
||||
/**
|
||||
* Lookup table of APIC IDs.
|
||||
*
|
||||
* 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 APIC ID %u ... ", cpu, apicid);
|
||||
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;
|
||||
|
||||
cpuid(0, &max_leaf, NULL, NULL, NULL);
|
||||
if ( max_leaf >= 0xb )
|
||||
{
|
||||
cpuid(1, NULL, NULL, &ecx, NULL);
|
||||
has_x2apic = (ecx >> 21) & 1;
|
||||
if ( has_x2apic )
|
||||
printf("x2APIC supported\n");
|
||||
}
|
||||
|
||||
printf("Multiprocessor initialisation:\n");
|
||||
cpu_to_apicid = scratch_alloc(sizeof(*cpu_to_apicid) * nr_cpus,
|
||||
sizeof(*cpu_to_apicid));
|
||||
cpu_setup(0);
|
||||
for ( i = 1; i < nr_cpus; i++ )
|
||||
boot_cpu(i);
|
||||
|
||||