diff options
-rw-r--r-- | src/acpi.c | 23 | ||||
-rw-r--r-- | src/mptable.c | 18 | ||||
-rw-r--r-- | src/smbios.c | 4 |
3 files changed, 24 insertions, 21 deletions
@@ -347,9 +347,8 @@ build_fadt(int bdf) static void* build_madt(void) { - int smp_cpus = CountCPUs; int madt_size = (sizeof(struct multiple_apic_table) - + sizeof(struct madt_processor_apic) * smp_cpus + + sizeof(struct madt_processor_apic) * MaxCountCPUs + sizeof(struct madt_io_apic) + sizeof(struct madt_intsrcovr) * 16); struct multiple_apic_table *madt = malloc_high(madt_size); @@ -362,18 +361,21 @@ build_madt(void) madt->flags = cpu_to_le32(1); struct madt_processor_apic *apic = (void*)&madt[1]; int i; - for (i=0; i<smp_cpus; i++) { + for (i=0; i<MaxCountCPUs; i++) { apic->type = APIC_PROCESSOR; apic->length = sizeof(*apic); apic->processor_id = i; apic->local_apic_id = i; - apic->flags = cpu_to_le32(1); + if (i < CountCPUs) + apic->flags = cpu_to_le32(1); + else + apic->flags = cpu_to_le32(0); apic++; } struct madt_io_apic *io_apic = (void*)apic; io_apic->type = APIC_IO; io_apic->length = sizeof(*io_apic); - io_apic->io_apic_id = smp_cpus; + io_apic->io_apic_id = CountCPUs; io_apic->address = cpu_to_le32(BUILD_IOAPIC_ADDR); io_apic->interrupt = cpu_to_le32(0); @@ -408,8 +410,7 @@ build_madt(void) static void* build_ssdt(void) { - int smp_cpus = CountCPUs; - int acpi_cpus = smp_cpus > 0xff ? 0xff : smp_cpus; + int acpi_cpus = MaxCountCPUs > 0xff ? 0xff : MaxCountCPUs; // calculate the length of processor block and scope block // excluding PkgLength int cpu_length = 13 * acpi_cpus + 4; @@ -509,17 +510,17 @@ build_srat(void) if (nb_numa_nodes == 0) return NULL; - u64 *numadata = malloc_tmphigh(sizeof(u64) * (CountCPUs + nb_numa_nodes)); + u64 *numadata = malloc_tmphigh(sizeof(u64) * (MaxCountCPUs + nb_numa_nodes)); if (!numadata) { dprintf(1, "Not enough memory for read numa data from VM!\n"); return NULL; } - qemu_cfg_get_numa_data(numadata, CountCPUs + nb_numa_nodes); + qemu_cfg_get_numa_data(numadata, MaxCountCPUs + nb_numa_nodes); struct system_resource_affinity_table *srat; int srat_size = sizeof(*srat) + - sizeof(struct srat_processor_affinity) * CountCPUs + + sizeof(struct srat_processor_affinity) * MaxCountCPUs + sizeof(struct srat_memory_affinity) * (nb_numa_nodes + 2); srat = malloc_high(srat_size); @@ -534,7 +535,7 @@ build_srat(void) int i; u64 curnode; - for (i = 0; i < CountCPUs; ++i) { + for (i = 0; i < MaxCountCPUs; ++i) { core->type = SRAT_PROCESSOR; core->length = sizeof(*core); core->local_apic_id = i; diff --git a/src/mptable.c b/src/mptable.c index 4aaff1e8..793968c6 100644 --- a/src/mptable.c +++ b/src/mptable.c @@ -18,13 +18,12 @@ mptable_init(void) dprintf(3, "init MPTable\n"); - int smp_cpus = CountCPUs; - if (smp_cpus <= 1) + if (MaxCountCPUs <= 1) // Building an mptable on uniprocessor machines confuses some OSes. return; int length = (sizeof(struct mptable_config_s) - + sizeof(struct mpt_cpu) * smp_cpus + + sizeof(struct mpt_cpu) * MaxCountCPUs + sizeof(struct mpt_bus) + sizeof(struct mpt_ioapic) + sizeof(struct mpt_intsrc) * 16); @@ -49,7 +48,7 @@ mptable_init(void) config->spec = 4; memcpy(config->oemid, CONFIG_CPUNAME8, sizeof(config->oemid)); memcpy(config->productid, "0.1 ", sizeof(config->productid)); - config->entrycount = smp_cpus + 2 + 16; + config->entrycount = MaxCountCPUs + 2 + 16; config->lapic = BUILD_APIC_ADDR; // CPU definitions. @@ -57,14 +56,17 @@ mptable_init(void) cpuid(1, &cpuid_signature, &ebx, &ecx, &cpuid_features); struct mpt_cpu *cpus = (void*)&config[1]; int i; - for (i = 0; i < smp_cpus; i++) { + for (i = 0; i < MaxCountCPUs; i++) { struct mpt_cpu *cpu = &cpus[i]; memset(cpu, 0, sizeof(*cpu)); cpu->type = MPT_TYPE_CPU; cpu->apicid = i; cpu->apicver = 0x11; /* cpu flags: enabled, bootstrap cpu */ - cpu->cpuflag = (i == 0 ? 3 : 1); + if (i < CountCPUs) + cpu->cpuflag = 1 | (i == 0) ? 2 : 0; + else + cpu->cpuflag = 0; if (cpuid_signature) { cpu->cpusignature = cpuid_signature; cpu->featureflag = cpuid_features; @@ -75,13 +77,13 @@ mptable_init(void) } /* isa bus */ - struct mpt_bus *bus = (void*)&cpus[smp_cpus]; + struct mpt_bus *bus = (void*)&cpus[MaxCountCPUs]; memset(bus, 0, sizeof(*bus)); bus->type = MPT_TYPE_BUS; memcpy(bus->bustype, "ISA ", sizeof(bus->bustype)); /* ioapic */ - u8 ioapic_id = smp_cpus; + u8 ioapic_id = CountCPUs; struct mpt_ioapic *ioapic = (void*)&bus[1]; memset(ioapic, 0, sizeof(*ioapic)); ioapic->type = MPT_TYPE_IOAPIC; diff --git a/src/smbios.c b/src/smbios.c index a77c1973..ad0d0c45 100644 --- a/src/smbios.c +++ b/src/smbios.c @@ -560,8 +560,8 @@ smbios_init(void) add_struct(1, p); add_struct(3, p); - int cpu_num, smp_cpus = CountCPUs; - for (cpu_num = 1; cpu_num <= smp_cpus; cpu_num++) + int cpu_num; + for (cpu_num = 1; cpu_num <= MaxCountCPUs; cpu_num++) add_struct(4, p, cpu_num); u64 memsize = RamSizeOver4G; if (memsize) |