qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [6607] qemu: initialize hot add system / acpi gpe (Marcelo


From: Anthony Liguori
Subject: [Qemu-devel] [6607] qemu: initialize hot add system / acpi gpe (Marcelo Tosatti)
Date: Wed, 11 Feb 2009 15:21:36 +0000

Revision: 6607
          http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6607
Author:   aliguori
Date:     2009-02-11 15:21:35 +0000 (Wed, 11 Feb 2009)

Log Message:
-----------
qemu: initialize hot add system / acpi gpe (Marcelo Tosatti)

ACPI GPE support, used by PCI (and CPU) hotplug.

From: Glauber Costa <address@hidden>
Signed-off-by: Marcelo Tosatti <address@hidden>
Signed-off-by: Anthony Liguori <address@hidden>

Modified Paths:
--------------
    trunk/hw/acpi.c
    trunk/hw/pc.c
    trunk/sysemu.h

Modified: trunk/hw/acpi.c
===================================================================
--- trunk/hw/acpi.c     2009-02-11 15:21:29 UTC (rev 6606)
+++ trunk/hw/acpi.c     2009-02-11 15:21:35 UTC (rev 6607)
@@ -561,3 +561,71 @@
     }
 }
 #endif
+
+#define GPE_BASE 0xafe0
+
+struct gpe_regs {
+    uint16_t sts; /* status */
+    uint16_t en;  /* enabled */
+};
+
+static struct gpe_regs gpe;
+
+static uint32_t gpe_readb(void *opaque, uint32_t addr)
+{
+    uint32_t val = 0;
+    struct gpe_regs *g = opaque;
+    switch (addr) {
+        case GPE_BASE:
+            val = g->sts & 0xFF;
+            break;
+        case GPE_BASE + 1:
+            val =  (g->sts >> 8) & 0xFF;
+            break;
+        case GPE_BASE + 2:
+            val =  g->en & 0xFF;
+            break;
+        case GPE_BASE + 3:
+            val =  (g->en >> 8) & 0xFF;
+            break;
+        default:
+            break;
+    }
+
+#if defined(DEBUG)
+    printf("gpe read %lx == %lx\n", addr, val);
+#endif
+    return val;
+}
+
+static void gpe_writeb(void *opaque, uint32_t addr, uint32_t val)
+{
+    struct gpe_regs *g = opaque;
+    switch (addr) {
+        case GPE_BASE:
+            g->sts = (g->sts & ~0xFFFF) | (val & 0xFFFF);
+            break;
+        case GPE_BASE + 1:
+            g->sts = (g->sts & 0xFFFF) | (val << 8);
+            break;
+        case GPE_BASE + 2:
+            g->en = (g->en & ~0xFFFF) | (val & 0xFFFF);
+            break;
+        case GPE_BASE + 3:
+            g->en = (g->en & 0xFFFF) | (val << 8);
+            break;
+        default:
+            break;
+   }
+
+#if defined(DEBUG)
+    printf("gpe write %lx <== %d\n", addr, val);
+#endif
+}
+
+void qemu_system_hot_add_init(void)
+{
+    register_ioport_write(GPE_BASE, 4, 1, gpe_writeb, &gpe);
+    register_ioport_read(GPE_BASE, 4, 1,  gpe_readb, &gpe);
+
+}

Modified: trunk/hw/pc.c
===================================================================
--- trunk/hw/pc.c       2009-02-11 15:21:29 UTC (rev 6606)
+++ trunk/hw/pc.c       2009-02-11 15:21:35 UTC (rev 6607)
@@ -1010,6 +1010,8 @@
             pci_nic_init(pci_bus, nd, -1, "ne2k_pci");
     }
 
+    qemu_system_hot_add_init();
+
     if (drive_get_max_bus(IF_IDE) >= MAX_IDE_BUS) {
         fprintf(stderr, "qemu: too many IDE bus\n");
         exit(1);

Modified: trunk/sysemu.h
===================================================================
--- trunk/sysemu.h      2009-02-11 15:21:29 UTC (rev 6606)
+++ trunk/sysemu.h      2009-02-11 15:21:35 UTC (rev 6607)
@@ -166,6 +166,9 @@
 extern int drive_add(const char *file, const char *fmt, ...);
 extern int drive_init(struct drive_opt *arg, int snapshot, void *machine);
 
+/* acpi */
+void qemu_system_hot_add_init(void);
+
 /* serial ports */
 
 #define MAX_SERIAL_PORTS 4






reply via email to

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