qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 6/6] add bios support for cpu hotplug.


From: Glauber Costa
Subject: [Qemu-devel] [PATCH 6/6] add bios support for cpu hotplug.
Date: Fri, 17 Apr 2009 11:20:49 -0400

This adds patches to bochs-bios to support cpu hotplug

first one creates entries in acpi tables, and the second one
removes the now unused static sdt.

Signed-off-by: Glauber Costa <address@hidden>
---
 ...012-qemu-bios-create-acpi-cpu-definitions.patch |  293 ++++++++++++++++++++
 ...emu-bios-remove-acpi_build_processor_ssdt.patch |   55 ++++
 pc-bios/bios-pq/series                             |    2 +
 3 files changed, 350 insertions(+), 0 deletions(-)
 create mode 100644 
pc-bios/bios-pq/0012-qemu-bios-create-acpi-cpu-definitions.patch
 create mode 100644 
pc-bios/bios-pq/0013-qemu-bios-remove-acpi_build_processor_ssdt.patch

diff --git a/pc-bios/bios-pq/0012-qemu-bios-create-acpi-cpu-definitions.patch 
b/pc-bios/bios-pq/0012-qemu-bios-create-acpi-cpu-definitions.patch
new file mode 100644
index 0000000..89bf081
--- /dev/null
+++ b/pc-bios/bios-pq/0012-qemu-bios-create-acpi-cpu-definitions.patch
@@ -0,0 +1,293 @@
+From 09ce41fd61e075c47777df08641cd76ca733f172 Mon Sep 17 00:00:00 2001
+From: Glauber Costa <address@hidden>
+Date: Fri, 17 Apr 2009 10:51:18 -0400
+Subject: [PATCH] create acpi cpu definitions
+
+This comes directly from kvm-userspace. It creates
+the necessary infrastructure for cpu hotplug, by
+creating _MAT and _STA entries in cpu devices,
+and by allowing notifications to the guest to happen
+
+note that now, we have to fill acpi tables with MAX_CPUS,
+instead of smp_cpus, otherwise we'll never be able to grow
+the cpu number.
+
+Signed-off-by: Glauber Costa <address@hidden>
+---
+ bios/acpi-dsdt.dsl |  116 +++++++++++++++++++++++++++++++++++++++++++++++++++-
+ bios/rombios.h     |    2 +
+ bios/rombios32.c   |   72 +++++---------------------------
+ 3 files changed, 128 insertions(+), 62 deletions(-)
+
+diff --git a/bios/acpi-dsdt.dsl b/bios/acpi-dsdt.dsl
+index 7bff30a..23d8d6c 100644
+--- a/bios/acpi-dsdt.dsl
++++ b/bios/acpi-dsdt.dsl
+@@ -25,6 +25,120 @@ DefinitionBlock (
+     0x1                 // OEM Revision
+     )
+ {
++   Scope (\_PR)
++   {
++      OperationRegion(PRST, SystemIO, 0xaf00, 32)
++      Field (PRST, ByteAcc, NoLock, Preserve)
++      {
++              PRS, 256
++      }
++
++      Name(PRSS, Buffer(32){}) /* shadow CPU status bitmask */
++      Name(SSVL, 0)
++
++      Method(CRST, 1) {
++              If (LEqual(SSVL, 0)) {
++                      Store(PRS, PRSS) /* read CPUs status bitmaks from HW */
++                      Store(1, SSVL)
++                }
++              ShiftRight(Arg0, 3, Local1)
++              Store(DerefOf(Index(PRSS, Local1)), Local2)
++              Return(And(Local2, ShiftLeft(1, And(Arg0, 0x7))))
++      }
++
++#define gen_processor(nr, name)                                           \
++      Processor (CPU##name, nr, 0x0000b010, 0x06) {                       \
++            Name (PREN, Buffer(0x8) {0x0, 0x8, nr, nr, 0x1, 0x0, 0x0, 0x0}) \
++            Name (PRDS, Buffer(0x8) {0x0, 0x8, nr, nr, 0x0, 0x0, 0x0, 0x0}) \
++            Method(_MAT, 0) {                                               \
++                If (CRST(nr)) { Return(PREN) }                              \
++                Else { Return(PRDS) }                                       \
++            }                                                               \
++            Method (_STA) {                                                 \
++                If (CRST(nr)) { Return(0xF) }                               \
++                Else { Return(0x9) }                                        \
++            }                                                               \
++        }                                                                   \
++
++
++      gen_processor(0, 0)
++      gen_processor(1, 1)
++      gen_processor(2, 2)
++      gen_processor(3, 3)
++      gen_processor(4, 4)
++      gen_processor(5, 5)
++      gen_processor(6, 6)
++      gen_processor(7, 7)
++      gen_processor(8, 8)
++      gen_processor(9, 9)
++      gen_processor(10, A)
++      gen_processor(11, B)
++      gen_processor(12, C)
++      gen_processor(13, D)
++      gen_processor(14, E)
++
++      Method (NTFY, 2) {
++#define gen_ntfy(nr)                              \
++      If (LEqual(Arg0, 0x##nr)) {               \
++              Notify(CPU##nr, Arg1)             \
++      }
++              gen_ntfy(0)
++              gen_ntfy(1)
++              gen_ntfy(2)
++              gen_ntfy(3)
++              gen_ntfy(4)
++              gen_ntfy(5)
++              gen_ntfy(6)
++              gen_ntfy(7)
++              gen_ntfy(8)
++              gen_ntfy(9)
++              gen_ntfy(A)
++              gen_ntfy(B)
++              gen_ntfy(C)
++              gen_ntfy(D)
++              gen_ntfy(E)
++              Return(One)
++      }
++
++      /* Works on 8 bit quentity.
++         * Arg1 - Shadow status bits
++         * Arg2 - Current status bits
++       */
++        Method(PR1, 3) {
++          Xor(Arg1, Arg2, Local0) /* figure out what chaged */
++          ShiftLeft(Arg0, 3, Local1)
++            While (LNotEqual(Local0, Zero)) {
++              If (And(Local0, 1)) {      /* if staus have changed */
++                    if(And(Arg2, 1)) {     /* check previous status */
++                      Store(3, Local3)
++                  } Else {
++                      Store(1, Local3)
++                  }
++                  NTFY(Local1, Local3)
++                }
++              ShiftRight(Local0, 1, Local0)
++              ShiftRight(Arg2, 1, Arg2)
++              Increment(Local1)
++          }
++          Return(One)
++      }
++
++      Method(PRSC, 0) {
++              Store(Buffer(32){}, Local0)
++              Store(PRS, Local0) /* read CPUs status bitmask into Local0 */
++              Store(Zero, Local1)
++              /* loop over bitmask byte by byte to see what have chaged */
++              While(LLess(Local1, 32)) {
++                      Store(DerefOf(Index(Local0, Local1)), Local2)
++                      Store(DerefOf(Index(PRSS, Local1)), Local3)
++                      PR1(Local1, Local2, Local3)
++                      Increment(Local1)
++                }
++              Store(Local0, PRSS) /* store curr satust bitmask into shadow */
++              Return(One)
++      }
++    }
++
+     Scope (\)
+     {
+         /* Debug Output */
+@@ -706,7 +820,7 @@ DefinitionBlock (
+
+         }
+         Method(_L02) {
+-            Return(0x01)
++          Return(\_PR.PRSC())
+         }
+         Method(_L03) {
+             Return(0x01)
+diff --git a/bios/rombios.h b/bios/rombios.h
+index 6f9cbb1..085e287 100644
+--- a/bios/rombios.h
++++ b/bios/rombios.h
+@@ -58,6 +58,8 @@
+ #define SMB_IO_BASE       0xb100
+ #define SMP_MSR_ADDR      0x0510
+
++#define MAX_CPUS      256
++
+   // Define the application NAME
+ #if defined(BX_QEMU)
+ #  define BX_APPNAME "QEMU"
+diff --git a/bios/rombios32.c b/bios/rombios32.c
+index 7be4216..3063409 100644
+--- a/bios/rombios32.c
++++ b/bios/rombios32.c
+@@ -1126,20 +1126,22 @@ 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 */
+         if (i == 0)
+             putb(&q, 3); /* cpu flags: enabled, bootstrap cpu */
+-        else
++        else if ( i < smp_cpus)
+             putb(&q, 1); /* cpu flags: enabled */
++        else
++            putb(&q, 0); /* cpu flags: disabled */
+         putb(&q, 0); /* cpu signature */
+         putb(&q, 6);
+         putb(&q, 0);
+@@ -1508,57 +1510,6 @@ static void acpi_build_table_header(struct 
acpi_table_header *h,
+     h->checksum = acpi_checksum((void *)h, len);
+ }
+
+-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;
+-
+-    ssdt_ptr[9] = 0; // checksum;
+-    ssdt_ptr += sizeof(struct acpi_table_header);
+-
+-    // caluculate the length of processor block and scope block excluding 
PkgLength
+-    length = 0x0d * acpi_cpus + 4;
+-
+-    // build processor scope header
+-    *(ssdt_ptr++) = 0x10; // ScopeOp
+-    if (length <= 0x3e) {
+-        *(ssdt_ptr++) = length + 1;
+-    } else {
+-        *(ssdt_ptr++) = 0x7F;
+-        *(ssdt_ptr++) = (length + 2) >> 6;
+-    }
+-    *(ssdt_ptr++) = '_'; // Name
+-    *(ssdt_ptr++) = 'P';
+-    *(ssdt_ptr++) = 'R';
+-    *(ssdt_ptr++) = '_';
+-
+-    // build object for each processor
+-    for(i=0;i<acpi_cpus;i++) {
+-        *(ssdt_ptr++) = 0x5B; // ProcessorOp
+-        *(ssdt_ptr++) = 0x83;
+-        *(ssdt_ptr++) = 0x0B; // Length
+-        *(ssdt_ptr++) = 'C';  // Name (CPUxx)
+-        *(ssdt_ptr++) = 'P';
+-        if ((i & 0xf0) != 0)
+-            *(ssdt_ptr++) = (i >> 4) < 0xa ? (i >> 4) + '0' : (i >> 4) + 'A' 
- 0xa;
+-        else
+-            *(ssdt_ptr++) = 'U';
+-        *(ssdt_ptr++) = (i & 0xf) < 0xa ? (i & 0xf) + '0' : (i & 0xf) + 'A' - 
0xa;
+-        *(ssdt_ptr++) = i;
+-        *(ssdt_ptr++) = 0x10; // Processor block address
+-        *(ssdt_ptr++) = 0xb0;
+-        *(ssdt_ptr++) = 0;
+-        *(ssdt_ptr++) = 0;
+-        *(ssdt_ptr++) = 6;    // Processor block length
+-    }
+-
+-    acpi_build_table_header((struct acpi_table_header *)ssdt,
+-                            "SSDT", ssdt_ptr - ssdt, 1);
+-
+-    return ssdt_ptr - ssdt;
+-}
+-
+ /* base_addr must be a multiple of 4KB */
+ void acpi_bios_init(void)
+ {
+@@ -1613,14 +1564,10 @@ void acpi_bios_init(void)
+     dsdt = (void *)(addr);
+     addr += sizeof(AmlCode);
+
+-    ssdt_addr = addr;
+-    ssdt = (void *)(addr);
+-    addr += acpi_build_processor_ssdt(ssdt);
+-
+     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
+@@ -1693,12 +1640,15 @@ 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;i<smp_cpus;i++) {
++        for(i=0;i< MAX_CPUS;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 < smp_cpus)
++                apic->flags = cpu_to_le32(1);
++            else
++                apic->flags = 0;
+             apic++;
+         }
+         io_apic = (void *)apic;
+--
+1.5.6.6
+
diff --git 
a/pc-bios/bios-pq/0013-qemu-bios-remove-acpi_build_processor_ssdt.patch 
b/pc-bios/bios-pq/0013-qemu-bios-remove-acpi_build_processor_ssdt.patch
new file mode 100644
index 0000000..492a625
--- /dev/null
+++ b/pc-bios/bios-pq/0013-qemu-bios-remove-acpi_build_processor_ssdt.patch
@@ -0,0 +1,55 @@
+From 10ab1258c77ee1de9f56bf284cdde97990a81575 Mon Sep 17 00:00:00 2001
+From: Glauber Costa <address@hidden>
+Date: Tue, 26 Feb 2008 16:56:45 -0300
+Subject: [PATCH] kvm: bios: remove acpi_build_processor_ssdt
+
+now present in the dsdt.
+
+Signed-off-by: Glauber Costa <address@hidden>
+Signed-off-by: Avi Kivity <address@hidden>
+---
+ bios/rombios32.c |   55 ------------------------------------------------------
+ 1 files changed, 0 insertions(+), 55 deletions(-)
+
+Index: bochs/bios/rombios32.c
+===================================================================
+--- bochs.orig/bios/rombios32.c
++++ bochs/bios/rombios32.c
+@@ -1275,9 +1275,9 @@ struct rsdt_descriptor_rev1
+ {
+       ACPI_TABLE_HEADER_DEF                           /* ACPI common table 
header */
+ #ifdef BX_QEMU
+-      uint32_t                             table_offset_entry [4]; /* Array 
of pointers to other */
+-#else
+       uint32_t                             table_offset_entry [3]; /* Array 
of pointers to other */
++#else
++      uint32_t                             table_offset_entry [2]; /* Array 
of pointers to other */
+ #endif
+                        /* ACPI tables */
+ } __attribute__((__packed__));
+@@ -1518,12 +1518,12 @@ void acpi_bios_init(void)
+     struct fadt_descriptor_rev1 *fadt;
+     struct facs_descriptor_rev1 *facs;
+     struct multiple_apic_table *madt;
+-    uint8_t *dsdt, *ssdt;
++    uint8_t *dsdt;
+ #ifdef BX_QEMU
+     struct acpi_20_hpet *hpet;
+     uint32_t hpet_addr;
+ #endif
+-    uint32_t base_addr, rsdt_addr, fadt_addr, addr, facs_addr, dsdt_addr, 
ssdt_addr;
++    uint32_t base_addr, rsdt_addr, fadt_addr, addr, facs_addr, dsdt_addr;
+     uint32_t acpi_tables_size, madt_addr, madt_size, rsdt_size;
+     uint16_t i, external_tables;
+ 
+@@ -1700,9 +1700,8 @@ void acpi_bios_init(void)
+     /* RSDT */
+     rsdt->table_offset_entry[0] = cpu_to_le32(fadt_addr);
+     rsdt->table_offset_entry[1] = cpu_to_le32(madt_addr);
+-    rsdt->table_offset_entry[2] = cpu_to_le32(ssdt_addr);
+ #ifdef BX_QEMU
+-    rsdt->table_offset_entry[3] = cpu_to_le32(hpet_addr);
++    rsdt->table_offset_entry[2] = cpu_to_le32(hpet_addr);
+ #endif
+     acpi_build_table_header((struct acpi_table_header *)rsdt,
+                             "RSDT", rsdt_size, 1);
diff --git a/pc-bios/bios-pq/series b/pc-bios/bios-pq/series
index 5a29df9..8f88ee1 100644
--- a/pc-bios/bios-pq/series
+++ b/pc-bios/bios-pq/series
@@ -9,3 +9,5 @@
 0009_qemu-bios-pci-hotplug-support.patch
 0010_bios-mark-the-acpi-sci-interrupt-as-connected-to-irq-9.patch
 0011_read-additional-acpi-tables-from-a-vm.patch
+0012-qemu-bios-create-acpi-cpu-definitions.patch
+0013-qemu-bios-remove-acpi_build_processor_ssdt.patch
-- 
1.5.6.6





reply via email to

[Prev in Thread] Current Thread [Next in Thread]