From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MTFul-00039a-JT for qemu-devel@nongnu.org; Tue, 21 Jul 2009 10:01:55 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MTFug-00037J-Gk for qemu-devel@nongnu.org; Tue, 21 Jul 2009 10:01:55 -0400 Received: from [199.232.76.173] (port=38254 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MTFug-00037A-8G for qemu-devel@nongnu.org; Tue, 21 Jul 2009 10:01:50 -0400 Received: from relay3.sgi.com ([192.48.156.57]:50522 helo=relay.sgi.com) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MTFua-0007vD-Ky for qemu-devel@nongnu.org; Tue, 21 Jul 2009 10:01:49 -0400 Message-Id: <20090720145118.488555518@sgi.com> Date: Mon, 20 Jul 2009 16:43:14 +0200 From: Jes Sorensen References: <20090720144312.052887035@sgi.com> Content-Disposition: inline; filename=0002-qemu-bios-patches.patch Subject: [Qemu-devel] [PATCH 2/2] QEMU BOCHS bios patches to use maxcpus value. List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Anthony Liguori Cc: qemu-devel@nongnu.org Signed-off-by: Jes Sorensen --- pc-bios/bios-pq/0020-qemu-kvm-cfg-maxcpus.patch | 61 +++++++++++++++ pc-bios/bios-pq/0021-qemu-madt-maxcpus.patch | 96 ++++++++++++++++++++++++ pc-bios/bios-pq/series | 2 3 files changed, 159 insertions(+) Index: qemu/pc-bios/bios-pq/0020-qemu-kvm-cfg-maxcpus.patch =================================================================== --- /dev/null +++ qemu/pc-bios/bios-pq/0020-qemu-kvm-cfg-maxcpus.patch @@ -0,0 +1,61 @@ +Read max_cpus variable from QEMU_CFG. If not provided, use value of +smp_cpus. + +Signed-off-by: Jes Sorensen + +diff --git a/bios/rombios.h b/bios/rombios.h +index 8ece2ee..dbf3bd3 100644 +--- a/bios/rombios.h ++++ b/bios/rombios.h +@@ -65,6 +65,7 @@ + #define QEMU_CFG_UUID 0x02 + #define QEMU_CFG_NUMA 0x0d + #define QEMU_CFG_BOOT_MENU 0x0e ++#define QEMU_CFG_MAX_CPUS 0x0f + #define QEMU_CFG_ARCH_LOCAL 0x8000 + #define QEMU_CFG_ACPI_TABLES (QEMU_CFG_ARCH_LOCAL + 0) + #define QEMU_CFG_SMBIOS_ENTRIES (QEMU_CFG_ARCH_LOCAL + 1) +diff --git a/bios/rombios32.c b/bios/rombios32.c +index 69e82b1..462884a 100644 +--- a/bios/rombios32.c ++++ b/bios/rombios32.c +@@ -436,6 +436,7 @@ void delay_ms(int n) + } + + uint16_t smp_cpus; ++uint16_t max_cpus; + uint32_t cpuid_signature; + uint32_t cpuid_features; + uint32_t cpuid_ext_features; +@@ -526,6 +527,19 @@ static uint16_t smbios_entries(void) + return cnt; + } + ++static uint16_t get_max_cpus(void) ++{ ++ uint16_t cnt; ++ ++ qemu_cfg_select(QEMU_CFG_MAX_CPUS); ++ qemu_cfg_read((uint8_t*)&cnt, sizeof(cnt)); ++ ++ if (!cnt) ++ cnt = smp_cpus; ++ ++ return cnt; ++} ++ + uint64_t qemu_cfg_get64 (void) + { + uint64_t ret; +@@ -1645,6 +1659,11 @@ void acpi_bios_init(void) + uint16_t i, external_tables; + int nb_numa_nodes; + ++#ifdef BX_QEMU ++ max_cpus = get_max_cpus(); ++#else ++ max_cpus = smp_cpus; ++#endif + /* reserve memory space for tables */ + #ifdef BX_USE_EBDA_TABLES + ebda_cur_addr = align(ebda_cur_addr, 16); Index: qemu/pc-bios/bios-pq/0021-qemu-madt-maxcpus.patch =================================================================== --- /dev/null +++ qemu/pc-bios/bios-pq/0021-qemu-madt-maxcpus.patch @@ -0,0 +1,96 @@ +Use max_cpus when building bios tables. + +Signed-off-by: Jes Sorensen + +diff --git a/bios/rombios32.c b/bios/rombios32.c +index 462884a..1ec4a09 100644 +--- a/bios/rombios32.c ++++ b/bios/rombios32.c +@@ -1144,13 +1144,13 @@ static void mptable_init(void) + putstr(&q, "0.1 "); /* vendor id */ + putle32(&q, 0); /* OEM table ptr */ + putle16(&q, 0); /* OEM table size */ +- putle16(&q, smp_cpus + 18); /* entry count */ ++ putle16(&q, max_cpus + 18); /* entry count */ + putle32(&q, 0xfee00000); /* local APIC addr */ + putle16(&q, 0); /* ext table length */ + putb(&q, 0); /* ext table checksum */ + putb(&q, 0); /* reserved */ + +- for(i = 0; i < smp_cpus; i++) { ++ for(i = 0; i < max_cpus; i++) { + putb(&q, 0); /* entry type = processor */ + putb(&q, i); /* APIC id */ + putb(&q, 0x11); /* local APIC version number */ +@@ -1177,7 +1177,7 @@ static void mptable_init(void) + putstr(&q, "ISA "); + + /* ioapic */ +- ioapic_id = smp_cpus; ++ ioapic_id = max_cpus; + putb(&q, 2); /* entry type = I/O APIC */ + putb(&q, ioapic_id); /* apic ID */ + putb(&q, 0x11); /* I/O APIC version number */ +@@ -1577,7 +1577,7 @@ int acpi_build_processor_ssdt(uint8_t *ssdt) + { + uint8_t *ssdt_ptr = ssdt; + int i, length; +- int acpi_cpus = smp_cpus > 0xff ? 0xff : smp_cpus; ++ int acpi_cpus = max_cpus > 0xff ? 0xff : max_cpus; + + ssdt_ptr[9] = 0; // checksum; + ssdt_ptr += sizeof(struct acpi_table_header); +@@ -1714,7 +1714,7 @@ void acpi_bios_init(void) + addr = (addr + 7) & ~7; + srat_addr = addr; + srat_size = sizeof(*srat) + +- sizeof(struct srat_processor_affinity) * smp_cpus + ++ sizeof(struct srat_processor_affinity) * max_cpus + + sizeof(struct srat_memory_affinity) * (nb_numa_nodes + 2); + srat = (void *)(addr); + addr += srat_size; +@@ -1727,7 +1727,7 @@ void acpi_bios_init(void) + addr = (addr + 7) & ~7; + madt_addr = addr; + madt_size = sizeof(*madt) + +- sizeof(struct madt_processor_apic) * smp_cpus + ++ sizeof(struct madt_processor_apic) * max_cpus + + #ifdef BX_QEMU + sizeof(struct madt_io_apic) + sizeof(struct madt_int_override); + #else +@@ -1800,7 +1800,7 @@ void acpi_bios_init(void) + madt->local_apic_address = cpu_to_le32(0xfee00000); + madt->flags = cpu_to_le32(1); + apic = (void *)(madt + 1); +- for(i=0;itype = APIC_PROCESSOR; + apic->length = sizeof(*apic); + apic->processor_id = i; +@@ -1811,7 +1811,7 @@ void acpi_bios_init(void) + 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 = max_cpus; + io_apic->address = cpu_to_le32(0xfec00000); + io_apic->interrupt = cpu_to_le32(0); + #ifdef BX_QEMU +@@ -1845,7 +1845,7 @@ void acpi_bios_init(void) + srat->reserved1=1; + + core = (void*)(srat + 1); +- for (i = 0; i < smp_cpus; ++i) { ++ for (i = 0; i < max_cpus; ++i) { + core->type = SRAT_PROCESSOR; + core->length = sizeof(*core); + core->local_apic_id = i; +@@ -2604,7 +2604,7 @@ void smbios_init(void) + add_struct(0, p); + add_struct(1, p); + add_struct(3, p); +- for (cpu_num = 1; cpu_num <= smp_cpus; cpu_num++) ++ for (cpu_num = 1; cpu_num <= max_cpus; cpu_num++) + add_struct(4, p, cpu_num); + + /* Each 'memory device' covers up to 16GB of address space. */ Index: qemu/pc-bios/bios-pq/series =================================================================== --- qemu.orig/pc-bios/bios-pq/series +++ qemu/pc-bios/bios-pq/series @@ -17,3 +17,5 @@ 0017-bochs-bios-Move-QEMU_CFG-constants-to-rombios.h.patch 0018-bochs-bios-Make-boot-prompt-optional.patch 0019-bios-fix-multiple-calls.patch +0020-qemu-kvm-cfg-maxcpus.patch +0021-qemu-madt-maxcpus.patch