qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups
@ 2010-05-14  7:28 Isaku Yamahata
  2010-05-14  7:28 ` [Qemu-devel] [PATCH 01/26] acpi: split out piix4 smbus routines from acpi.c into pm_smbus.c Isaku Yamahata
                   ` (26 more replies)
  0 siblings, 27 replies; 29+ messages in thread
From: Isaku Yamahata @ 2010-05-14  7:28 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, yamahata, kraxel

patch series description:
This patch series is for spliting out piix specific part from pc emulator
to make it easier to implement other pc chipset emulator.

I observed that make was confused not to rebuild files sometimes due to
splitting up a file into files. It results in duplicated/undefined symbols.
In that case, 'make clean;make' will fix it.


Blue, your patches were combied into 21/26, and 22/26. Please check it.
Your patches to acpi.c had some issues. I fixed them in this patch series.

1/2 acpi: remove static pm_state:
  The first argument, dev, of piix4_device_hotplug() is not
  PIIX4PMState device, but hot plugged device.
  So the container_of() doesn't make sense.
2/2 acpi: remove static gpe and pci0_status variables   
  The call back argument to pge_readb(), gpe_writeb() is struct gpe_regs.
  Not PIIX4PMState. 
  The callback argument pcihotplug_read(), pcihotplug_write() is
  struct pci_status. Not PIIX4PMState.
  Those argument type is void*, so compiler didn't catch it.

thanks,

Changes from V12:
- 2/26 acpi: split out apm register emulation from acpi.c
  The patch originally convert CMOS S3 code to qemu_irq. However
  the conversion is already done by Blue Swirl. So the patch was simplified.
- 22/26 pci hotadd, acpi_piix4: remove global variables
  Minor style fix according to Blue's patch.
- rebased to 5acd0646b6033d40ef5d0ae06338cc354108f640

Changes from V11:
- s/pc_smbus/pm_smbus/g, s/pc_apm/apm/g and so on
  because it isn't pc specifc. mips also uses it.
- No logic changes.

Changes from V10:
- pass DeviceState* to pc_smbus_init(), now info qtree shows smbus.
- change pci hotplug argument from void * to DeviceState*.

Changes from V9:
- rebased 502e64fe23f19c086d42f6178cdda19e58996080
- use qemu_irq to remove global variables, rtc_state
- make rtc_xxx functions accept/return ISADevice and related clean ups
- pci hot plug clean up
- removed #ifdef DEBUG patches.


Changes from V8:
- make rtc_xxx functions accept/return ISADevice.
- move up ioapic initalization patch.
- fixed up copyright notice.

Changes from V7:
- rebased to fe0d61231eb6be6a83c54f4a2795f924ee963f8f

Changes from v6:
- rebased to 731c54f86988d3f28268f184fabfe9b2a32fb5d3

Changes from v5:
- rebased 0.11.0-rc0
- changed qemu_system_powerdown_register() to call
  qemu_system_shutdown_request() if qemu_system_shutdown() is called before
  registering.

Changes from v4:
- fix version number.
- rebased anthony's staging tree whose latest change set is
  62969268f876c547ee64da6d60e0f363e0f1df75

Changes from v3:
- move qemu_system_powerdown() in vl.c and more generic
  following the comment by Marcelo Tosatti <mtosatti@redhat.com>
  acpi.c: make qemu_system_powerdown() piix independent.
- define cmos_set_s3_resume_init() and cmos_set_s3_resume() in pc.c
  even if TARGET_I386 isn't defined following th ecommit by
  Paolo Bonzini <bonzini@gnu.org>
  pc.c: remove a global variable, RTCState *rtc_state.
- minor compilation fixes

Changes from v2:
- clean up pc_pci_device_init() not to use unnecessary braces.

Changes from v1:
- make patches full bisectable
- typo s/allocte/allocate/
- some minor fixes
- dropped a merged patch

Isaku Yamahata (26):
  acpi: split out piix4 smbus routines from acpi.c into pm_smbus.c
  acpi: split out apm register emulation from acpi.c
  acpi: add acpi constants from linux header files and use them.
  acpi: split acpi.c into the common part and the piix4 part.
  pc: initialize ioapic before use.
  pc, i440fx: Make smm enable/disable function i440fx independent.
  pc: make an unnecessary global variable, pit, local.
  pc: remove a global variable, floppy_controller.
  pc: remove global variable rtc_state by using qemu_irq.
  pc: introduce a function to allocate cpu irq.
  pc: make pc_init1() not refer ferr_irq directly.
  pc: split out cpu initialization from pc_init1() into pc_cpus_init().
  pc: split out memory allocation from pc_init1() into pc_memory_init()
  pc: split out vga initialization from pc_init1() into pc_vga_init().
  pc: split out basic device init from pc_init1() into
    pc_basic_device_init()
  pc: split out pci device init from pc_init1() into
    pc_pci_device_init()
  pc: split out piix specific part from pc.c into pc_piix.c
  pc: move rtc declarations from pc.h into a dedicated header file.
  rtc: make rtc_xxx accept/return ISADevice instead of RTCState.
  acpi_piix4: qdevfy.
  pci hotplug: add argument to pci hot plug callback.
  pci hotadd, acpi_piix4: remove global variables
  pm_smbus: remove #ifdef DEBUG.
  acpi_piix4: remove #ifdef DEBUG.
  apm: remove #ifdef DEBUG.
  mc146818rtc: remove #ifdef DEBUG_CMOS.

 Makefile.target  |    2 +
 hw/acpi.c        |  743 +-----------------------------------------------------
 hw/acpi.h        |   78 ++++++
 hw/acpi_piix4.c  |  602 +++++++++++++++++++++++++++++++++++++++++++
 hw/apm.c         |   87 +++++++
 hw/apm.h         |   22 ++
 hw/fdc.h         |    5 +
 hw/mc146818rtc.c |   44 ++--
 hw/mc146818rtc.h |   10 +
 hw/mips_jazz.c   |    1 +
 hw/mips_malta.c  |    3 +-
 hw/mips_r4k.c    |    3 +-
 hw/pc.c          |  423 +++++++------------------------
 hw/pc.h          |   48 +++-
 hw/pc_piix.c     |  316 +++++++++++++++++++++++
 hw/pci.c         |    8 +-
 hw/pci.h         |    4 +-
 hw/piix_pci.c    |    5 +-
 hw/pm_smbus.c    |  181 +++++++++++++
 hw/pm_smbus.h    |   21 ++
 hw/ppc_prep.c    |    1 +
 21 files changed, 1500 insertions(+), 1107 deletions(-)
 create mode 100644 hw/acpi.h
 create mode 100644 hw/acpi_piix4.c
 create mode 100644 hw/apm.c
 create mode 100644 hw/apm.h
 create mode 100644 hw/mc146818rtc.h
 create mode 100644 hw/pc_piix.c
 create mode 100644 hw/pm_smbus.c
 create mode 100644 hw/pm_smbus.h

^ permalink raw reply	[flat|nested] 29+ messages in thread

* [Qemu-devel] [PATCH 01/26] acpi: split out piix4 smbus routines from acpi.c into pm_smbus.c
  2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
@ 2010-05-14  7:28 ` Isaku Yamahata
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 02/26] acpi: split out apm register emulation from acpi.c Isaku Yamahata
                   ` (25 subsequent siblings)
  26 siblings, 0 replies; 29+ messages in thread
From: Isaku Yamahata @ 2010-05-14  7:28 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, yamahata, kraxel, Aurelien Jarno

Split out piix4 smbus routines from acpi.c into pm_smbus.c and
use it.
The split out smbus emulation will be used later.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
Cc: Aurelien Jarno <aurelien@aurel32.net>

---
changes v11 -> v12
- switch the prefix, pc to pm since this is used by not only pc,
  but also mips. both filenames and symbol names.

changes v10 -> v11
- add DeviceState *qdev argument to pc_smbus_init()
  for info qtree.
---
 Makefile.target |    2 +
 hw/acpi.c       |  164 +++------------------------------------------------
 hw/pm_smbus.c   |  178 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 hw/pm_smbus.h   |   21 +++++++
 4 files changed, 209 insertions(+), 156 deletions(-)
 create mode 100644 hw/pm_smbus.c
 create mode 100644 hw/pm_smbus.h

diff --git a/Makefile.target b/Makefile.target
index c092900..c2539bd 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -195,6 +195,7 @@ obj-i386-y += cirrus_vga.o apic.o ioapic.o piix_pci.o
 obj-i386-y += vmmouse.o vmport.o hpet.o
 obj-i386-y += device-hotplug.o pci-hotplug.o smbios.o wdt_ib700.o
 obj-i386-y += debugcon.o multiboot.o
+obj-i386-y += pm_smbus.o
 
 # shared objects
 obj-ppc-y = ppc.o
@@ -220,6 +221,7 @@ obj-mips-y += dma.o vga.o i8259.o
 obj-mips-y += g364fb.o jazz_led.o
 obj-mips-y += gt64xxx.o pckbd.o mc146818rtc.o
 obj-mips-y += piix4.o cirrus_vga.o
+obj-mips-y += pm_smbus.o
 
 obj-microblaze-y = petalogix_s3adsp1800_mmu.o
 
diff --git a/hw/acpi.c b/hw/acpi.c
index e3b63b7..ad8f4c7 100644
--- a/hw/acpi.c
+++ b/hw/acpi.c
@@ -17,6 +17,7 @@
  */
 #include "hw.h"
 #include "pc.h"
+#include "pm_smbus.h"
 #include "pci.h"
 #include "qemu-timer.h"
 #include "sysemu.h"
@@ -39,15 +40,9 @@ typedef struct PIIX4PMState {
     uint8_t apms;
     QEMUTimer *tmr_timer;
     int64_t tmr_overflow_time;
-    i2c_bus *smbus;
-    uint8_t smb_stat;
-    uint8_t smb_ctl;
-    uint8_t smb_cmd;
-    uint8_t smb_addr;
-    uint8_t smb_data0;
-    uint8_t smb_data1;
-    uint8_t smb_data[32];
-    uint8_t smb_index;
+
+    PMSMBus smb;
+
     qemu_irq irq;
     qemu_irq cmos_s3;
     qemu_irq smi_irq;
@@ -68,14 +63,6 @@ typedef struct PIIX4PMState {
 #define ACPI_ENABLE 0xf1
 #define ACPI_DISABLE 0xf0
 
-#define SMBHSTSTS 0x00
-#define SMBHSTCNT 0x02
-#define SMBHSTCMD 0x03
-#define SMBHSTADD 0x04
-#define SMBHSTDAT0 0x05
-#define SMBHSTDAT1 0x06
-#define SMBBLKDAT 0x07
-
 static PIIX4PMState *pm_state;
 
 static uint32_t get_pmtmr(PIIX4PMState *s)
@@ -282,141 +269,6 @@ static void acpi_dbg_writel(void *opaque, uint32_t addr, uint32_t val)
 #endif
 }
 
-static void smb_transaction(PIIX4PMState *s)
-{
-    uint8_t prot = (s->smb_ctl >> 2) & 0x07;
-    uint8_t read = s->smb_addr & 0x01;
-    uint8_t cmd = s->smb_cmd;
-    uint8_t addr = s->smb_addr >> 1;
-    i2c_bus *bus = s->smbus;
-
-#ifdef DEBUG
-    printf("SMBus trans addr=0x%02x prot=0x%02x\n", addr, prot);
-#endif
-    switch(prot) {
-    case 0x0:
-        smbus_quick_command(bus, addr, read);
-        break;
-    case 0x1:
-        if (read) {
-            s->smb_data0 = smbus_receive_byte(bus, addr);
-        } else {
-            smbus_send_byte(bus, addr, cmd);
-        }
-        break;
-    case 0x2:
-        if (read) {
-            s->smb_data0 = smbus_read_byte(bus, addr, cmd);
-        } else {
-            smbus_write_byte(bus, addr, cmd, s->smb_data0);
-        }
-        break;
-    case 0x3:
-        if (read) {
-            uint16_t val;
-            val = smbus_read_word(bus, addr, cmd);
-            s->smb_data0 = val;
-            s->smb_data1 = val >> 8;
-        } else {
-            smbus_write_word(bus, addr, cmd, (s->smb_data1 << 8) | s->smb_data0);
-        }
-        break;
-    case 0x5:
-        if (read) {
-            s->smb_data0 = smbus_read_block(bus, addr, cmd, s->smb_data);
-        } else {
-            smbus_write_block(bus, addr, cmd, s->smb_data, s->smb_data0);
-        }
-        break;
-    default:
-        goto error;
-    }
-    return;
-
-  error:
-    s->smb_stat |= 0x04;
-}
-
-static void smb_ioport_writeb(void *opaque, uint32_t addr, uint32_t val)
-{
-    PIIX4PMState *s = opaque;
-    addr &= 0x3f;
-#ifdef DEBUG
-    printf("SMB writeb port=0x%04x val=0x%02x\n", addr, val);
-#endif
-    switch(addr) {
-    case SMBHSTSTS:
-        s->smb_stat = 0;
-        s->smb_index = 0;
-        break;
-    case SMBHSTCNT:
-        s->smb_ctl = val;
-        if (val & 0x40)
-            smb_transaction(s);
-        break;
-    case SMBHSTCMD:
-        s->smb_cmd = val;
-        break;
-    case SMBHSTADD:
-        s->smb_addr = val;
-        break;
-    case SMBHSTDAT0:
-        s->smb_data0 = val;
-        break;
-    case SMBHSTDAT1:
-        s->smb_data1 = val;
-        break;
-    case SMBBLKDAT:
-        s->smb_data[s->smb_index++] = val;
-        if (s->smb_index > 31)
-            s->smb_index = 0;
-        break;
-    default:
-        break;
-    }
-}
-
-static uint32_t smb_ioport_readb(void *opaque, uint32_t addr)
-{
-    PIIX4PMState *s = opaque;
-    uint32_t val;
-
-    addr &= 0x3f;
-    switch(addr) {
-    case SMBHSTSTS:
-        val = s->smb_stat;
-        break;
-    case SMBHSTCNT:
-        s->smb_index = 0;
-        val = s->smb_ctl & 0x1f;
-        break;
-    case SMBHSTCMD:
-        val = s->smb_cmd;
-        break;
-    case SMBHSTADD:
-        val = s->smb_addr;
-        break;
-    case SMBHSTDAT0:
-        val = s->smb_data0;
-        break;
-    case SMBHSTDAT1:
-        val = s->smb_data1;
-        break;
-    case SMBBLKDAT:
-        val = s->smb_data[s->smb_index++];
-        if (s->smb_index > 31)
-            s->smb_index = 0;
-        break;
-    default:
-        val = 0;
-        break;
-    }
-#ifdef DEBUG
-    printf("SMB readb port=0x%04x val=0x%02x\n", addr, val);
-#endif
-    return val;
-}
-
 static void pm_io_space_update(PIIX4PMState *s)
 {
     uint32_t pm_io_base;
@@ -545,8 +397,8 @@ i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
     pci_conf[0x90] = smb_io_base | 1;
     pci_conf[0x91] = smb_io_base >> 8;
     pci_conf[0xd2] = 0x09;
-    register_ioport_write(smb_io_base, 64, 1, smb_ioport_writeb, s);
-    register_ioport_read(smb_io_base, 64, 1, smb_ioport_readb, s);
+    register_ioport_write(smb_io_base, 64, 1, smb_ioport_writeb, &s->smb);
+    register_ioport_read(smb_io_base, 64, 1, smb_ioport_readb, &s->smb);
 
     s->tmr_timer = qemu_new_timer(vm_clock, pm_tmr_timer, s);
 
@@ -554,13 +406,13 @@ i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
 
     vmstate_register(0, &vmstate_acpi, s);
 
-    s->smbus = i2c_init_bus(NULL, "i2c");
+    pm_smbus_init(NULL, &s->smb);
     s->irq = sci_irq;
     s->cmos_s3 = cmos_s3;
     s->smi_irq = smi_irq;
     qemu_register_reset(piix4_reset, s);
 
-    return s->smbus;
+    return s->smb.smbus;
 }
 
 #define GPE_BASE 0xafe0
diff --git a/hw/pm_smbus.c b/hw/pm_smbus.c
new file mode 100644
index 0000000..6ef6b9e
--- /dev/null
+++ b/hw/pm_smbus.c
@@ -0,0 +1,178 @@
+/*
+ * PC SMBus implementation
+ * splitted from acpi.c
+ *
+ * Copyright (c) 2006 Fabrice Bellard
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA  02110-1301 USA
+ */
+#include "hw.h"
+#include "pc.h"
+#include "pm_smbus.h"
+#include "pci.h"
+#include "qemu-timer.h"
+#include "sysemu.h"
+#include "i2c.h"
+#include "smbus.h"
+#include "kvm.h"
+
+/* no save/load? */
+
+#define SMBHSTSTS       0x00
+#define SMBHSTCNT       0x02
+#define SMBHSTCMD       0x03
+#define SMBHSTADD       0x04
+#define SMBHSTDAT0      0x05
+#define SMBHSTDAT1      0x06
+#define SMBBLKDAT       0x07
+
+static void smb_transaction(PMSMBus *s)
+{
+    uint8_t prot = (s->smb_ctl >> 2) & 0x07;
+    uint8_t read = s->smb_addr & 0x01;
+    uint8_t cmd = s->smb_cmd;
+    uint8_t addr = s->smb_addr >> 1;
+    i2c_bus *bus = s->smbus;
+
+#ifdef DEBUG
+    printf("SMBus trans addr=0x%02x prot=0x%02x\n", addr, prot);
+#endif
+    switch(prot) {
+    case 0x0:
+        smbus_quick_command(bus, addr, read);
+        break;
+    case 0x1:
+        if (read) {
+            s->smb_data0 = smbus_receive_byte(bus, addr);
+        } else {
+            smbus_send_byte(bus, addr, cmd);
+        }
+        break;
+    case 0x2:
+        if (read) {
+            s->smb_data0 = smbus_read_byte(bus, addr, cmd);
+        } else {
+            smbus_write_byte(bus, addr, cmd, s->smb_data0);
+        }
+        break;
+    case 0x3:
+        if (read) {
+            uint16_t val;
+            val = smbus_read_word(bus, addr, cmd);
+            s->smb_data0 = val;
+            s->smb_data1 = val >> 8;
+        } else {
+            smbus_write_word(bus, addr, cmd, (s->smb_data1 << 8) | s->smb_data0);
+        }
+        break;
+    case 0x5:
+        if (read) {
+            s->smb_data0 = smbus_read_block(bus, addr, cmd, s->smb_data);
+        } else {
+            smbus_write_block(bus, addr, cmd, s->smb_data, s->smb_data0);
+        }
+        break;
+    default:
+        goto error;
+    }
+    return;
+
+  error:
+    s->smb_stat |= 0x04;
+}
+
+void smb_ioport_writeb(void *opaque, uint32_t addr, uint32_t val)
+{
+    PMSMBus *s = opaque;
+    addr &= 0x3f;
+#ifdef DEBUG
+    printf("SMB writeb port=0x%04x val=0x%02x\n", addr, val);
+#endif
+    switch(addr) {
+    case SMBHSTSTS:
+        s->smb_stat = 0;
+        s->smb_index = 0;
+        break;
+    case SMBHSTCNT:
+        s->smb_ctl = val;
+        if (val & 0x40)
+            smb_transaction(s);
+        break;
+    case SMBHSTCMD:
+        s->smb_cmd = val;
+        break;
+    case SMBHSTADD:
+        s->smb_addr = val;
+        break;
+    case SMBHSTDAT0:
+        s->smb_data0 = val;
+        break;
+    case SMBHSTDAT1:
+        s->smb_data1 = val;
+        break;
+    case SMBBLKDAT:
+        s->smb_data[s->smb_index++] = val;
+        if (s->smb_index > 31)
+            s->smb_index = 0;
+        break;
+    default:
+        break;
+    }
+}
+
+uint32_t smb_ioport_readb(void *opaque, uint32_t addr)
+{
+    PMSMBus *s = opaque;
+    uint32_t val;
+
+    addr &= 0x3f;
+    switch(addr) {
+    case SMBHSTSTS:
+        val = s->smb_stat;
+        break;
+    case SMBHSTCNT:
+        s->smb_index = 0;
+        val = s->smb_ctl & 0x1f;
+        break;
+    case SMBHSTCMD:
+        val = s->smb_cmd;
+        break;
+    case SMBHSTADD:
+        val = s->smb_addr;
+        break;
+    case SMBHSTDAT0:
+        val = s->smb_data0;
+        break;
+    case SMBHSTDAT1:
+        val = s->smb_data1;
+        break;
+    case SMBBLKDAT:
+        val = s->smb_data[s->smb_index++];
+        if (s->smb_index > 31)
+            s->smb_index = 0;
+        break;
+    default:
+        val = 0;
+        break;
+    }
+#ifdef DEBUG
+    printf("SMB readb port=0x%04x val=0x%02x\n", addr, val);
+#endif
+    return val;
+}
+
+void pm_smbus_init(DeviceState *parent, PMSMBus *smb)
+{
+    smb->smbus = i2c_init_bus(parent, "i2c");
+}
diff --git a/hw/pm_smbus.h b/hw/pm_smbus.h
new file mode 100644
index 0000000..4750a40
--- /dev/null
+++ b/hw/pm_smbus.h
@@ -0,0 +1,21 @@
+#ifndef PM_SMBUS_H
+#define PM_SMBUS_H
+
+typedef struct PMSMBus {
+    i2c_bus *smbus;
+
+    uint8_t smb_stat;
+    uint8_t smb_ctl;
+    uint8_t smb_cmd;
+    uint8_t smb_addr;
+    uint8_t smb_data0;
+    uint8_t smb_data1;
+    uint8_t smb_data[32];
+    uint8_t smb_index;
+} PMSMBus;
+
+void pm_smbus_init(DeviceState *parent, PMSMBus *smb);
+void smb_ioport_writeb(void *opaque, uint32_t addr, uint32_t val);
+uint32_t smb_ioport_readb(void *opaque, uint32_t addr);
+
+#endif /* !PM_SMBUS_H */
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [Qemu-devel] [PATCH 02/26] acpi: split out apm register emulation from acpi.c
  2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
  2010-05-14  7:28 ` [Qemu-devel] [PATCH 01/26] acpi: split out piix4 smbus routines from acpi.c into pm_smbus.c Isaku Yamahata
@ 2010-05-14  7:29 ` Isaku Yamahata
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 03/26] acpi: add acpi constants from linux header files and use them Isaku Yamahata
                   ` (24 subsequent siblings)
  26 siblings, 0 replies; 29+ messages in thread
From: Isaku Yamahata @ 2010-05-14  7:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, yamahata, kraxel, Aurelien Jarno

Split out apm register emulation for acpi.c into apm.c.
The apm emulation will be used later.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
Cc: Aurelien Jarno <aurelien@aurel32.net>

---
changes v11 -> v12
- drop pc prefix as this is used by not only pc, but also mips.
  including filenames and symbol names
---
 Makefile.target |    4 +-
 hw/acpi.c       |   61 +++++++++++----------------------------
 hw/apm.c        |   85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 hw/apm.h        |   22 ++++++++++++++
 4 files changed, 127 insertions(+), 45 deletions(-)
 create mode 100644 hw/apm.c
 create mode 100644 hw/apm.h

diff --git a/Makefile.target b/Makefile.target
index c2539bd..4e1101b 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -195,7 +195,7 @@ obj-i386-y += cirrus_vga.o apic.o ioapic.o piix_pci.o
 obj-i386-y += vmmouse.o vmport.o hpet.o
 obj-i386-y += device-hotplug.o pci-hotplug.o smbios.o wdt_ib700.o
 obj-i386-y += debugcon.o multiboot.o
-obj-i386-y += pm_smbus.o
+obj-i386-y += pm_smbus.o apm.o
 
 # shared objects
 obj-ppc-y = ppc.o
@@ -221,7 +221,7 @@ obj-mips-y += dma.o vga.o i8259.o
 obj-mips-y += g364fb.o jazz_led.o
 obj-mips-y += gt64xxx.o pckbd.o mc146818rtc.o
 obj-mips-y += piix4.o cirrus_vga.o
-obj-mips-y += pm_smbus.o
+obj-mips-y += pm_smbus.o apm.o
 
 obj-microblaze-y = petalogix_s3adsp1800_mmu.o
 
diff --git a/hw/acpi.c b/hw/acpi.c
index ad8f4c7..8dc9538 100644
--- a/hw/acpi.c
+++ b/hw/acpi.c
@@ -17,6 +17,7 @@
  */
 #include "hw.h"
 #include "pc.h"
+#include "apm.h"
 #include "pm_smbus.h"
 #include "pci.h"
 #include "qemu-timer.h"
@@ -36,8 +37,9 @@ typedef struct PIIX4PMState {
     uint16_t pmsts;
     uint16_t pmen;
     uint16_t pmcntrl;
-    uint8_t apmc;
-    uint8_t apms;
+
+    APMState apm;
+
     QEMUTimer *tmr_timer;
     int64_t tmr_overflow_time;
 
@@ -218,48 +220,22 @@ static uint32_t pm_ioport_readl(void *opaque, uint32_t addr)
     return val;
 }
 
-static void pm_smi_writeb(void *opaque, uint32_t addr, uint32_t val)
+static void apm_ctrl_changed(uint32_t val, void *arg)
 {
-    PIIX4PMState *s = opaque;
-    addr &= 1;
-#ifdef DEBUG
-    printf("pm_smi_writeb addr=0x%x val=0x%02x\n", addr, val);
-#endif
-    if (addr == 0) {
-        s->apmc = val;
-
-        /* ACPI specs 3.0, 4.7.2.5 */
-        if (val == ACPI_ENABLE) {
-            s->pmcntrl |= SCI_EN;
-        } else if (val == ACPI_DISABLE) {
-            s->pmcntrl &= ~SCI_EN;
-        }
+    PIIX4PMState *s = arg;
 
-        if (s->dev.config[0x5b] & (1 << 1)) {
-            if (s->smi_irq) {
-                qemu_irq_raise(s->smi_irq);
-            }
-        }
-    } else {
-        s->apms = val;
+    /* ACPI specs 3.0, 4.7.2.5 */
+    if (val == ACPI_ENABLE) {
+        s->pmcntrl |= SCI_EN;
+    } else if (val == ACPI_DISABLE) {
+        s->pmcntrl &= ~SCI_EN;
     }
-}
 
-static uint32_t pm_smi_readb(void *opaque, uint32_t addr)
-{
-    PIIX4PMState *s = opaque;
-    uint32_t val;
-
-    addr &= 1;
-    if (addr == 0) {
-        val = s->apmc;
-    } else {
-        val = s->apms;
+    if (s->dev.config[0x5b] & (1 << 1)) {
+        if (s->smi_irq) {
+            qemu_irq_raise(s->smi_irq);
+        }
     }
-#ifdef DEBUG
-    printf("pm_smi_readb addr=0x%x val=0x%02x\n", addr, val);
-#endif
-    return val;
 }
 
 static void acpi_dbg_writel(void *opaque, uint32_t addr, uint32_t val)
@@ -315,8 +291,7 @@ static const VMStateDescription vmstate_acpi = {
         VMSTATE_UINT16(pmsts, PIIX4PMState),
         VMSTATE_UINT16(pmen, PIIX4PMState),
         VMSTATE_UINT16(pmcntrl, PIIX4PMState),
-        VMSTATE_UINT8(apmc, PIIX4PMState),
-        VMSTATE_UINT8(apms, PIIX4PMState),
+        VMSTATE_STRUCT(apm, PIIX4PMState, 0, vmstate_apm, APMState),
         VMSTATE_TIMER(tmr_timer, PIIX4PMState),
         VMSTATE_INT64(tmr_overflow_time, PIIX4PMState),
         VMSTATE_END_OF_LIST()
@@ -375,8 +350,8 @@ i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
 
     pci_conf[0x40] = 0x01; /* PM io base read only bit */
 
-    register_ioport_write(0xb2, 2, 1, pm_smi_writeb, s);
-    register_ioport_read(0xb2, 2, 1, pm_smi_readb, s);
+    /* APM */
+    apm_init(&s->apm, apm_ctrl_changed, s);
 
     register_ioport_write(ACPI_DBG_IO_ADDR, 4, 4, acpi_dbg_writel, s);
 
diff --git a/hw/apm.c b/hw/apm.c
new file mode 100644
index 0000000..d20db3d
--- /dev/null
+++ b/hw/apm.c
@@ -0,0 +1,85 @@
+/*
+ * QEMU PC APM controller Emulation
+ * This is split out from acpi.c
+ *
+ * Copyright (c) 2006 Fabrice Bellard
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>
+ */
+
+#include "apm.h"
+#include "hw.h"
+#include "isa.h"
+
+//#define DEBUG
+
+/* fixed I/O location */
+#define APM_CNT_IOPORT  0xb2
+#define APM_STS_IOPORT  0xb3
+
+static void apm_ioport_writeb(void *opaque, uint32_t addr, uint32_t val)
+{
+    APMState *apm = opaque;
+    addr &= 1;
+#ifdef DEBUG
+    printf("apm_ioport_writeb addr=0x%x val=0x%02x\n", addr, val);
+#endif
+    if (addr == 0) {
+        apm->apmc = val;
+
+        if (apm->callback) {
+            (apm->callback)(val, apm->arg);
+        }
+    } else {
+        apm->apms = val;
+    }
+}
+
+static uint32_t apm_ioport_readb(void *opaque, uint32_t addr)
+{
+    APMState *apm = opaque;
+    uint32_t val;
+
+    addr &= 1;
+    if (addr == 0) {
+        val = apm->apmc;
+    } else {
+        val = apm->apms;
+    }
+#ifdef DEBUG
+    printf("apm_ioport_readb addr=0x%x val=0x%02x\n", addr, val);
+#endif
+    return val;
+}
+
+const VMStateDescription vmstate_apm = {
+    .name = "APM State",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .minimum_version_id_old = 1,
+    .fields = (VMStateField[]) {
+        VMSTATE_UINT8(apmc, APMState),
+        VMSTATE_UINT8(apms, APMState),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
+void apm_init(APMState *apm, apm_ctrl_changed_t callback, void *arg)
+{
+    apm->callback = callback;
+    apm->arg = arg;
+
+    /* ioport 0xb2, 0xb3 */
+    register_ioport_write(APM_CNT_IOPORT, 2, 1, apm_ioport_writeb, apm);
+    register_ioport_read(APM_CNT_IOPORT, 2, 1, apm_ioport_readb, apm);
+}
diff --git a/hw/apm.h b/hw/apm.h
new file mode 100644
index 0000000..f7c741e
--- /dev/null
+++ b/hw/apm.h
@@ -0,0 +1,22 @@
+#ifndef APM_H
+#define APM_H
+
+#include <stdint.h>
+#include "qemu-common.h"
+#include "hw.h"
+
+typedef void (*apm_ctrl_changed_t)(uint32_t val, void *arg);
+
+typedef struct APMState {
+    uint8_t apmc;
+    uint8_t apms;
+
+    apm_ctrl_changed_t callback;
+    void *arg;
+} APMState;
+
+void apm_init(APMState *s, apm_ctrl_changed_t callback, void *arg);
+
+extern const VMStateDescription vmstate_apm;
+
+#endif /* APM_H */
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [Qemu-devel] [PATCH 03/26] acpi: add acpi constants from linux header files and use them.
  2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
  2010-05-14  7:28 ` [Qemu-devel] [PATCH 01/26] acpi: split out piix4 smbus routines from acpi.c into pm_smbus.c Isaku Yamahata
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 02/26] acpi: split out apm register emulation from acpi.c Isaku Yamahata
@ 2010-05-14  7:29 ` Isaku Yamahata
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 04/26] acpi: split acpi.c into the common part and the piix4 part Isaku Yamahata
                   ` (23 subsequent siblings)
  26 siblings, 0 replies; 29+ messages in thread
From: Isaku Yamahata @ 2010-05-14  7:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, yamahata, kraxel

add acpi constants from linux header files and
replace the old constants with them.
The acpi constants will be used by other file.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/acpi.c |   56 +++++++++++++++++++------------------------
 hw/acpi.h |   78 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 103 insertions(+), 31 deletions(-)
 create mode 100644 hw/acpi.h

diff --git a/hw/acpi.c b/hw/acpi.c
index 8dc9538..891378c 100644
--- a/hw/acpi.c
+++ b/hw/acpi.c
@@ -24,12 +24,10 @@
 #include "sysemu.h"
 #include "i2c.h"
 #include "smbus.h"
+#include "acpi.h"
 
 //#define DEBUG
 
-/* i82731AB (PIIX4) compatible power management function */
-#define PM_FREQ 3579545
-
 #define ACPI_DBG_IO_ADDR  0xb044
 
 typedef struct PIIX4PMState {
@@ -51,17 +49,6 @@ typedef struct PIIX4PMState {
     int kvm_enabled;
 } PIIX4PMState;
 
-#define RSM_STS (1 << 15)
-#define PWRBTN_STS (1 << 8)
-#define RTC_EN (1 << 10)
-#define PWRBTN_EN (1 << 8)
-#define GBL_EN (1 << 5)
-#define TMROF_EN (1 << 0)
-
-#define SCI_EN (1 << 0)
-
-#define SUS_EN (1 << 13)
-
 #define ACPI_ENABLE 0xf1
 #define ACPI_DISABLE 0xf0
 
@@ -70,7 +57,7 @@ static PIIX4PMState *pm_state;
 static uint32_t get_pmtmr(PIIX4PMState *s)
 {
     uint32_t d;
-    d = muldiv64(qemu_get_clock(vm_clock), PM_FREQ, get_ticks_per_sec());
+    d = muldiv64(qemu_get_clock(vm_clock), PM_TIMER_FREQUENCY, get_ticks_per_sec());
     return d & 0xffffff;
 }
 
@@ -78,9 +65,10 @@ static int get_pmsts(PIIX4PMState *s)
 {
     int64_t d;
 
-    d = muldiv64(qemu_get_clock(vm_clock), PM_FREQ, get_ticks_per_sec());
+    d = muldiv64(qemu_get_clock(vm_clock), PM_TIMER_FREQUENCY,
+                 get_ticks_per_sec());
     if (d >= s->tmr_overflow_time)
-        s->pmsts |= TMROF_EN;
+        s->pmsts |= ACPI_BITMASK_TIMER_STATUS;
     return s->pmsts;
 }
 
@@ -91,11 +79,16 @@ static void pm_update_sci(PIIX4PMState *s)
 
     pmsts = get_pmsts(s);
     sci_level = (((pmsts & s->pmen) &
-                  (RTC_EN | PWRBTN_EN | GBL_EN | TMROF_EN)) != 0);
+                  (ACPI_BITMASK_RT_CLOCK_ENABLE |
+                   ACPI_BITMASK_POWER_BUTTON_ENABLE |
+                   ACPI_BITMASK_GLOBAL_LOCK_ENABLE |
+                   ACPI_BITMASK_TIMER_ENABLE)) != 0);
     qemu_set_irq(s->irq, sci_level);
     /* schedule a timer interruption if needed */
-    if ((s->pmen & TMROF_EN) && !(pmsts & TMROF_EN)) {
-        expire_time = muldiv64(s->tmr_overflow_time, get_ticks_per_sec(), PM_FREQ);
+    if ((s->pmen & ACPI_BITMASK_TIMER_ENABLE) &&
+        !(pmsts & ACPI_BITMASK_TIMER_STATUS)) {
+        expire_time = muldiv64(s->tmr_overflow_time, get_ticks_per_sec(),
+                               PM_TIMER_FREQUENCY);
         qemu_mod_timer(s->tmr_timer, expire_time);
     } else {
         qemu_del_timer(s->tmr_timer);
@@ -118,9 +111,9 @@ static void pm_ioport_writew(void *opaque, uint32_t addr, uint32_t val)
             int64_t d;
             int pmsts;
             pmsts = get_pmsts(s);
-            if (pmsts & val & TMROF_EN) {
+            if (pmsts & val & ACPI_BITMASK_TIMER_STATUS) {
                 /* if TMRSTS is reset, then compute the new overflow time */
-                d = muldiv64(qemu_get_clock(vm_clock), PM_FREQ,
+                d = muldiv64(qemu_get_clock(vm_clock), PM_TIMER_FREQUENCY,
                              get_ticks_per_sec());
                 s->tmr_overflow_time = (d + 0x800000LL) & ~0x7fffffLL;
             }
@@ -135,8 +128,8 @@ static void pm_ioport_writew(void *opaque, uint32_t addr, uint32_t val)
     case 0x04:
         {
             int sus_typ;
-            s->pmcntrl = val & ~(SUS_EN);
-            if (val & SUS_EN) {
+            s->pmcntrl = val & ~(ACPI_BITMASK_SLEEP_ENABLE);
+            if (val & ACPI_BITMASK_SLEEP_ENABLE) {
                 /* change suspend type */
                 sus_typ = (val >> 10) & 7;
                 switch(sus_typ) {
@@ -144,9 +137,10 @@ static void pm_ioport_writew(void *opaque, uint32_t addr, uint32_t val)
                     qemu_system_shutdown_request();
                     break;
                 case 1:
-                    /* RSM_STS should be set on resume. Pretend that resume
-                       was caused by power button */
-                    s->pmsts |= (RSM_STS | PWRBTN_STS);
+                    /* ACPI_BITMASK_WAKE_STATUS should be set on resume.
+                       Pretend that resume was caused by power button */
+                    s->pmsts |= (ACPI_BITMASK_WAKE_STATUS |
+                                 ACPI_BITMASK_POWER_BUTTON_STATUS);
                     qemu_system_reset_request();
                     if (s->cmos_s3) {
                         qemu_irq_raise(s->cmos_s3);
@@ -226,9 +220,9 @@ static void apm_ctrl_changed(uint32_t val, void *arg)
 
     /* ACPI specs 3.0, 4.7.2.5 */
     if (val == ACPI_ENABLE) {
-        s->pmcntrl |= SCI_EN;
+        s->pmcntrl |= ACPI_BITMASK_SCI_ENABLE;
     } else if (val == ACPI_DISABLE) {
-        s->pmcntrl &= ~SCI_EN;
+        s->pmcntrl &= ~ACPI_BITMASK_SCI_ENABLE;
     }
 
     if (s->dev.config[0x5b] & (1 << 1)) {
@@ -320,8 +314,8 @@ static void piix4_powerdown(void *opaque, int irq, int power_failing)
 
     if (!s) {
         qemu_system_shutdown_request();
-    } else if (s->pmen & PWRBTN_EN) {
-        s->pmsts |= PWRBTN_EN;
+    } else if (s->pmen & ACPI_BITMASK_POWER_BUTTON_ENABLE) {
+        s->pmsts |= ACPI_BITMASK_POWER_BUTTON_STATUS;
         pm_update_sci(s);
     }
 }
diff --git a/hw/acpi.h b/hw/acpi.h
new file mode 100644
index 0000000..51b56b6
--- /dev/null
+++ b/hw/acpi.h
@@ -0,0 +1,78 @@
+#ifndef QEMU_HW_ACPI_H
+#define QEMU_HW_ACPI_H
+/*
+ *  Copyright (c) 2009 Isaku Yamahata <yamahata at valinux co jp>
+ *                     VA Linux Systems Japan K.K.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA  02110-1301 USA
+ */
+
+/* from linux include/acpi/actype.h */
+/* Default ACPI register widths */
+
+#define ACPI_GPE_REGISTER_WIDTH         8
+#define ACPI_PM1_REGISTER_WIDTH         16
+#define ACPI_PM2_REGISTER_WIDTH         8
+#define ACPI_PM_TIMER_WIDTH             32
+
+/* PM Timer ticks per second (HZ) */
+#define PM_TIMER_FREQUENCY  3579545
+
+
+/* ACPI fixed hardware registers */
+
+/* from linux/drivers/acpi/acpica/aclocal.h */
+/* Masks used to access the bit_registers */
+
+/* PM1x_STS */
+#define ACPI_BITMASK_TIMER_STATUS               0x0001
+#define ACPI_BITMASK_BUS_MASTER_STATUS          0x0010
+#define ACPI_BITMASK_GLOBAL_LOCK_STATUS         0x0020
+#define ACPI_BITMASK_POWER_BUTTON_STATUS        0x0100
+#define ACPI_BITMASK_SLEEP_BUTTON_STATUS        0x0200
+#define ACPI_BITMASK_RT_CLOCK_STATUS            0x0400
+#define ACPI_BITMASK_PCIEXP_WAKE_STATUS         0x4000	/* ACPI 3.0 */
+#define ACPI_BITMASK_WAKE_STATUS                0x8000
+
+#define ACPI_BITMASK_ALL_FIXED_STATUS           (\
+	ACPI_BITMASK_TIMER_STATUS          | \
+	ACPI_BITMASK_BUS_MASTER_STATUS     | \
+	ACPI_BITMASK_GLOBAL_LOCK_STATUS    | \
+	ACPI_BITMASK_POWER_BUTTON_STATUS   | \
+	ACPI_BITMASK_SLEEP_BUTTON_STATUS   | \
+	ACPI_BITMASK_RT_CLOCK_STATUS       | \
+	ACPI_BITMASK_WAKE_STATUS)
+
+/* PM1x_EN */
+#define ACPI_BITMASK_TIMER_ENABLE               0x0001
+#define ACPI_BITMASK_GLOBAL_LOCK_ENABLE         0x0020
+#define ACPI_BITMASK_POWER_BUTTON_ENABLE        0x0100
+#define ACPI_BITMASK_SLEEP_BUTTON_ENABLE        0x0200
+#define ACPI_BITMASK_RT_CLOCK_ENABLE            0x0400
+#define ACPI_BITMASK_PCIEXP_WAKE_DISABLE        0x4000	/* ACPI 3.0 */
+
+/* PM1x_CNT */
+#define ACPI_BITMASK_SCI_ENABLE                 0x0001
+#define ACPI_BITMASK_BUS_MASTER_RLD             0x0002
+#define ACPI_BITMASK_GLOBAL_LOCK_RELEASE        0x0004
+#define ACPI_BITMASK_SLEEP_TYPE                 0x1C00
+#define ACPI_BITMASK_SLEEP_ENABLE               0x2000
+
+/* PM2_CNT */
+#define ACPI_BITMASK_ARB_DISABLE                0x0001
+
+/* PM_TMR */
+
+#endif /* !QEMU_HW_ACPI_H */
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [Qemu-devel] [PATCH 04/26] acpi: split acpi.c into the common part and the piix4 part.
  2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
                   ` (2 preceding siblings ...)
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 03/26] acpi: add acpi constants from linux header files and use them Isaku Yamahata
@ 2010-05-14  7:29 ` Isaku Yamahata
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 05/26] pc: initialize ioapic before use Isaku Yamahata
                   ` (22 subsequent siblings)
  26 siblings, 0 replies; 29+ messages in thread
From: Isaku Yamahata @ 2010-05-14  7:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, yamahata, kraxel

Split acpi.c into the common part and the piix4 specific part.
The common part will be used later.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
---
 Makefile.target             |    4 +-
 hw/acpi.c                   |  562 -------------------------------------------
 hw/{acpi.c => acpi_piix4.c} |  170 -------------
 3 files changed, 2 insertions(+), 734 deletions(-)
 copy hw/{acpi.c => acpi_piix4.c} (76%)

diff --git a/Makefile.target b/Makefile.target
index 4e1101b..9d44660 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -195,7 +195,7 @@ obj-i386-y += cirrus_vga.o apic.o ioapic.o piix_pci.o
 obj-i386-y += vmmouse.o vmport.o hpet.o
 obj-i386-y += device-hotplug.o pci-hotplug.o smbios.o wdt_ib700.o
 obj-i386-y += debugcon.o multiboot.o
-obj-i386-y += pm_smbus.o apm.o
+obj-i386-y += pm_smbus.o apm.o acpi_piix4.o
 
 # shared objects
 obj-ppc-y = ppc.o
@@ -221,7 +221,7 @@ obj-mips-y += dma.o vga.o i8259.o
 obj-mips-y += g364fb.o jazz_led.o
 obj-mips-y += gt64xxx.o pckbd.o mc146818rtc.o
 obj-mips-y += piix4.o cirrus_vga.o
-obj-mips-y += pm_smbus.o apm.o
+obj-mips-y += pm_smbus.o apm.o acpi_piix4.o
 
 obj-microblaze-y = petalogix_s3adsp1800_mmu.o
 
diff --git a/hw/acpi.c b/hw/acpi.c
index 891378c..4c4df56 100644
--- a/hw/acpi.c
+++ b/hw/acpi.c
@@ -17,572 +17,10 @@
  */
 #include "hw.h"
 #include "pc.h"
-#include "apm.h"
-#include "pm_smbus.h"
 #include "pci.h"
-#include "qemu-timer.h"
 #include "sysemu.h"
-#include "i2c.h"
-#include "smbus.h"
 #include "acpi.h"
 
-//#define DEBUG
-
-#define ACPI_DBG_IO_ADDR  0xb044
-
-typedef struct PIIX4PMState {
-    PCIDevice dev;
-    uint16_t pmsts;
-    uint16_t pmen;
-    uint16_t pmcntrl;
-
-    APMState apm;
-
-    QEMUTimer *tmr_timer;
-    int64_t tmr_overflow_time;
-
-    PMSMBus smb;
-
-    qemu_irq irq;
-    qemu_irq cmos_s3;
-    qemu_irq smi_irq;
-    int kvm_enabled;
-} PIIX4PMState;
-
-#define ACPI_ENABLE 0xf1
-#define ACPI_DISABLE 0xf0
-
-static PIIX4PMState *pm_state;
-
-static uint32_t get_pmtmr(PIIX4PMState *s)
-{
-    uint32_t d;
-    d = muldiv64(qemu_get_clock(vm_clock), PM_TIMER_FREQUENCY, get_ticks_per_sec());
-    return d & 0xffffff;
-}
-
-static int get_pmsts(PIIX4PMState *s)
-{
-    int64_t d;
-
-    d = muldiv64(qemu_get_clock(vm_clock), PM_TIMER_FREQUENCY,
-                 get_ticks_per_sec());
-    if (d >= s->tmr_overflow_time)
-        s->pmsts |= ACPI_BITMASK_TIMER_STATUS;
-    return s->pmsts;
-}
-
-static void pm_update_sci(PIIX4PMState *s)
-{
-    int sci_level, pmsts;
-    int64_t expire_time;
-
-    pmsts = get_pmsts(s);
-    sci_level = (((pmsts & s->pmen) &
-                  (ACPI_BITMASK_RT_CLOCK_ENABLE |
-                   ACPI_BITMASK_POWER_BUTTON_ENABLE |
-                   ACPI_BITMASK_GLOBAL_LOCK_ENABLE |
-                   ACPI_BITMASK_TIMER_ENABLE)) != 0);
-    qemu_set_irq(s->irq, sci_level);
-    /* schedule a timer interruption if needed */
-    if ((s->pmen & ACPI_BITMASK_TIMER_ENABLE) &&
-        !(pmsts & ACPI_BITMASK_TIMER_STATUS)) {
-        expire_time = muldiv64(s->tmr_overflow_time, get_ticks_per_sec(),
-                               PM_TIMER_FREQUENCY);
-        qemu_mod_timer(s->tmr_timer, expire_time);
-    } else {
-        qemu_del_timer(s->tmr_timer);
-    }
-}
-
-static void pm_tmr_timer(void *opaque)
-{
-    PIIX4PMState *s = opaque;
-    pm_update_sci(s);
-}
-
-static void pm_ioport_writew(void *opaque, uint32_t addr, uint32_t val)
-{
-    PIIX4PMState *s = opaque;
-    addr &= 0x3f;
-    switch(addr) {
-    case 0x00:
-        {
-            int64_t d;
-            int pmsts;
-            pmsts = get_pmsts(s);
-            if (pmsts & val & ACPI_BITMASK_TIMER_STATUS) {
-                /* if TMRSTS is reset, then compute the new overflow time */
-                d = muldiv64(qemu_get_clock(vm_clock), PM_TIMER_FREQUENCY,
-                             get_ticks_per_sec());
-                s->tmr_overflow_time = (d + 0x800000LL) & ~0x7fffffLL;
-            }
-            s->pmsts &= ~val;
-            pm_update_sci(s);
-        }
-        break;
-    case 0x02:
-        s->pmen = val;
-        pm_update_sci(s);
-        break;
-    case 0x04:
-        {
-            int sus_typ;
-            s->pmcntrl = val & ~(ACPI_BITMASK_SLEEP_ENABLE);
-            if (val & ACPI_BITMASK_SLEEP_ENABLE) {
-                /* change suspend type */
-                sus_typ = (val >> 10) & 7;
-                switch(sus_typ) {
-                case 0: /* soft power off */
-                    qemu_system_shutdown_request();
-                    break;
-                case 1:
-                    /* ACPI_BITMASK_WAKE_STATUS should be set on resume.
-                       Pretend that resume was caused by power button */
-                    s->pmsts |= (ACPI_BITMASK_WAKE_STATUS |
-                                 ACPI_BITMASK_POWER_BUTTON_STATUS);
-                    qemu_system_reset_request();
-                    if (s->cmos_s3) {
-                        qemu_irq_raise(s->cmos_s3);
-                    }
-                default:
-                    break;
-                }
-            }
-        }
-        break;
-    default:
-        break;
-    }
-#ifdef DEBUG
-    printf("PM writew port=0x%04x val=0x%04x\n", addr, val);
-#endif
-}
-
-static uint32_t pm_ioport_readw(void *opaque, uint32_t addr)
-{
-    PIIX4PMState *s = opaque;
-    uint32_t val;
-
-    addr &= 0x3f;
-    switch(addr) {
-    case 0x00:
-        val = get_pmsts(s);
-        break;
-    case 0x02:
-        val = s->pmen;
-        break;
-    case 0x04:
-        val = s->pmcntrl;
-        break;
-    default:
-        val = 0;
-        break;
-    }
-#ifdef DEBUG
-    printf("PM readw port=0x%04x val=0x%04x\n", addr, val);
-#endif
-    return val;
-}
-
-static void pm_ioport_writel(void *opaque, uint32_t addr, uint32_t val)
-{
-    //    PIIX4PMState *s = opaque;
-#ifdef DEBUG
-    addr &= 0x3f;
-    printf("PM writel port=0x%04x val=0x%08x\n", addr, val);
-#endif
-}
-
-static uint32_t pm_ioport_readl(void *opaque, uint32_t addr)
-{
-    PIIX4PMState *s = opaque;
-    uint32_t val;
-
-    addr &= 0x3f;
-    switch(addr) {
-    case 0x08:
-        val = get_pmtmr(s);
-        break;
-    default:
-        val = 0;
-        break;
-    }
-#ifdef DEBUG
-    printf("PM readl port=0x%04x val=0x%08x\n", addr, val);
-#endif
-    return val;
-}
-
-static void apm_ctrl_changed(uint32_t val, void *arg)
-{
-    PIIX4PMState *s = arg;
-
-    /* ACPI specs 3.0, 4.7.2.5 */
-    if (val == ACPI_ENABLE) {
-        s->pmcntrl |= ACPI_BITMASK_SCI_ENABLE;
-    } else if (val == ACPI_DISABLE) {
-        s->pmcntrl &= ~ACPI_BITMASK_SCI_ENABLE;
-    }
-
-    if (s->dev.config[0x5b] & (1 << 1)) {
-        if (s->smi_irq) {
-            qemu_irq_raise(s->smi_irq);
-        }
-    }
-}
-
-static void acpi_dbg_writel(void *opaque, uint32_t addr, uint32_t val)
-{
-#if defined(DEBUG)
-    printf("ACPI: DBG: 0x%08x\n", val);
-#endif
-}
-
-static void pm_io_space_update(PIIX4PMState *s)
-{
-    uint32_t pm_io_base;
-
-    if (s->dev.config[0x80] & 1) {
-        pm_io_base = le32_to_cpu(*(uint32_t *)(s->dev.config + 0x40));
-        pm_io_base &= 0xffc0;
-
-        /* XXX: need to improve memory and ioport allocation */
-#if defined(DEBUG)
-        printf("PM: mapping to 0x%x\n", pm_io_base);
-#endif
-        register_ioport_write(pm_io_base, 64, 2, pm_ioport_writew, s);
-        register_ioport_read(pm_io_base, 64, 2, pm_ioport_readw, s);
-        register_ioport_write(pm_io_base, 64, 4, pm_ioport_writel, s);
-        register_ioport_read(pm_io_base, 64, 4, pm_ioport_readl, s);
-    }
-}
-
-static void pm_write_config(PCIDevice *d,
-                            uint32_t address, uint32_t val, int len)
-{
-    pci_default_write_config(d, address, val, len);
-    if (range_covers_byte(address, len, 0x80))
-        pm_io_space_update((PIIX4PMState *)d);
-}
-
-static int vmstate_acpi_post_load(void *opaque, int version_id)
-{
-    PIIX4PMState *s = opaque;
-
-    pm_io_space_update(s);
-    return 0;
-}
-
-static const VMStateDescription vmstate_acpi = {
-    .name = "piix4_pm",
-    .version_id = 1,
-    .minimum_version_id = 1,
-    .minimum_version_id_old = 1,
-    .post_load = vmstate_acpi_post_load,
-    .fields      = (VMStateField []) {
-        VMSTATE_PCI_DEVICE(dev, PIIX4PMState),
-        VMSTATE_UINT16(pmsts, PIIX4PMState),
-        VMSTATE_UINT16(pmen, PIIX4PMState),
-        VMSTATE_UINT16(pmcntrl, PIIX4PMState),
-        VMSTATE_STRUCT(apm, PIIX4PMState, 0, vmstate_apm, APMState),
-        VMSTATE_TIMER(tmr_timer, PIIX4PMState),
-        VMSTATE_INT64(tmr_overflow_time, PIIX4PMState),
-        VMSTATE_END_OF_LIST()
-    }
-};
-
-static void piix4_reset(void *opaque)
-{
-    PIIX4PMState *s = opaque;
-    uint8_t *pci_conf = s->dev.config;
-
-    pci_conf[0x58] = 0;
-    pci_conf[0x59] = 0;
-    pci_conf[0x5a] = 0;
-    pci_conf[0x5b] = 0;
-
-    if (s->kvm_enabled) {
-        /* Mark SMM as already inited (until KVM supports SMM). */
-        pci_conf[0x5B] = 0x02;
-    }
-}
-
-static void piix4_powerdown(void *opaque, int irq, int power_failing)
-{
-    PIIX4PMState *s = opaque;
-
-    if (!s) {
-        qemu_system_shutdown_request();
-    } else if (s->pmen & ACPI_BITMASK_POWER_BUTTON_ENABLE) {
-        s->pmsts |= ACPI_BITMASK_POWER_BUTTON_STATUS;
-        pm_update_sci(s);
-    }
-}
-
-i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
-                       qemu_irq sci_irq, qemu_irq cmos_s3, qemu_irq smi_irq,
-                       int kvm_enabled)
-{
-    PIIX4PMState *s;
-    uint8_t *pci_conf;
-
-    s = (PIIX4PMState *)pci_register_device(bus,
-                                         "PM", sizeof(PIIX4PMState),
-                                         devfn, NULL, pm_write_config);
-    pm_state = s;
-    pci_conf = s->dev.config;
-    pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_INTEL);
-    pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_INTEL_82371AB_3);
-    pci_conf[0x06] = 0x80;
-    pci_conf[0x07] = 0x02;
-    pci_conf[0x08] = 0x03; // revision number
-    pci_conf[0x09] = 0x00;
-    pci_config_set_class(pci_conf, PCI_CLASS_BRIDGE_OTHER);
-    pci_conf[PCI_HEADER_TYPE] = PCI_HEADER_TYPE_NORMAL; // header_type
-    pci_conf[0x3d] = 0x01; // interrupt pin 1
-
-    pci_conf[0x40] = 0x01; /* PM io base read only bit */
-
-    /* APM */
-    apm_init(&s->apm, apm_ctrl_changed, s);
-
-    register_ioport_write(ACPI_DBG_IO_ADDR, 4, 4, acpi_dbg_writel, s);
-
-    s->kvm_enabled = kvm_enabled;
-    if (s->kvm_enabled) {
-        /* Mark SMM as already inited to prevent SMM from running.  KVM does not
-         * support SMM mode. */
-        pci_conf[0x5B] = 0x02;
-    }
-
-    /* XXX: which specification is used ? The i82731AB has different
-       mappings */
-    pci_conf[0x5f] = (parallel_hds[0] != NULL ? 0x80 : 0) | 0x10;
-    pci_conf[0x63] = 0x60;
-    pci_conf[0x67] = (serial_hds[0] != NULL ? 0x08 : 0) |
-	(serial_hds[1] != NULL ? 0x90 : 0);
-
-    pci_conf[0x90] = smb_io_base | 1;
-    pci_conf[0x91] = smb_io_base >> 8;
-    pci_conf[0xd2] = 0x09;
-    register_ioport_write(smb_io_base, 64, 1, smb_ioport_writeb, &s->smb);
-    register_ioport_read(smb_io_base, 64, 1, smb_ioport_readb, &s->smb);
-
-    s->tmr_timer = qemu_new_timer(vm_clock, pm_tmr_timer, s);
-
-    qemu_system_powerdown = *qemu_allocate_irqs(piix4_powerdown, s, 1);
-
-    vmstate_register(0, &vmstate_acpi, s);
-
-    pm_smbus_init(NULL, &s->smb);
-    s->irq = sci_irq;
-    s->cmos_s3 = cmos_s3;
-    s->smi_irq = smi_irq;
-    qemu_register_reset(piix4_reset, s);
-
-    return s->smb.smbus;
-}
-
-#define GPE_BASE 0xafe0
-#define PCI_BASE 0xae00
-#define PCI_EJ_BASE 0xae08
-
-struct gpe_regs {
-    uint16_t sts; /* status */
-    uint16_t en;  /* enabled */
-};
-
-struct pci_status {
-    uint32_t up;
-    uint32_t down;
-};
-
-static struct gpe_regs gpe;
-static struct pci_status pci0_status;
-
-static uint32_t gpe_read_val(uint16_t val, uint32_t addr)
-{
-    if (addr & 1)
-        return (val >> 8) & 0xff;
-    return val & 0xff;
-}
-
-static uint32_t gpe_readb(void *opaque, uint32_t addr)
-{
-    uint32_t val = 0;
-    struct gpe_regs *g = opaque;
-    switch (addr) {
-        case GPE_BASE:
-        case GPE_BASE + 1:
-            val = gpe_read_val(g->sts, addr);
-            break;
-        case GPE_BASE + 2:
-        case GPE_BASE + 3:
-            val = gpe_read_val(g->en, addr);
-            break;
-        default:
-            break;
-    }
-
-#if defined(DEBUG)
-    printf("gpe read %x == %x\n", addr, val);
-#endif
-    return val;
-}
-
-static void gpe_write_val(uint16_t *cur, int addr, uint32_t val)
-{
-    if (addr & 1)
-        *cur = (*cur & 0xff) | (val << 8);
-    else
-        *cur = (*cur & 0xff00) | (val & 0xff);
-}
-
-static void gpe_reset_val(uint16_t *cur, int addr, uint32_t val)
-{
-    uint16_t x1, x0 = val & 0xff;
-    int shift = (addr & 1) ? 8 : 0;
-
-    x1 = (*cur >> shift) & 0xff;
-
-    x1 = x1 & ~x0;
-
-    *cur = (*cur & (0xff << (8 - shift))) | (x1 << shift);
-}
-
-static void gpe_writeb(void *opaque, uint32_t addr, uint32_t val)
-{
-    struct gpe_regs *g = opaque;
-    switch (addr) {
-        case GPE_BASE:
-        case GPE_BASE + 1:
-            gpe_reset_val(&g->sts, addr, val);
-            break;
-        case GPE_BASE + 2:
-        case GPE_BASE + 3:
-            gpe_write_val(&g->en, addr, val);
-            break;
-        default:
-            break;
-   }
-
-#if defined(DEBUG)
-    printf("gpe write %x <== %d\n", addr, val);
-#endif
-}
-
-static uint32_t pcihotplug_read(void *opaque, uint32_t addr)
-{
-    uint32_t val = 0;
-    struct pci_status *g = opaque;
-    switch (addr) {
-        case PCI_BASE:
-            val = g->up;
-            break;
-        case PCI_BASE + 4:
-            val = g->down;
-            break;
-        default:
-            break;
-    }
-
-#if defined(DEBUG)
-    printf("pcihotplug read %x == %x\n", addr, val);
-#endif
-    return val;
-}
-
-static void pcihotplug_write(void *opaque, uint32_t addr, uint32_t val)
-{
-    struct pci_status *g = opaque;
-    switch (addr) {
-        case PCI_BASE:
-            g->up = val;
-            break;
-        case PCI_BASE + 4:
-            g->down = val;
-            break;
-   }
-
-#if defined(DEBUG)
-    printf("pcihotplug write %x <== %d\n", addr, val);
-#endif
-}
-
-static uint32_t pciej_read(void *opaque, uint32_t addr)
-{
-#if defined(DEBUG)
-    printf("pciej read %x\n", addr);
-#endif
-    return 0;
-}
-
-static void pciej_write(void *opaque, uint32_t addr, uint32_t val)
-{
-    BusState *bus = opaque;
-    DeviceState *qdev, *next;
-    PCIDevice *dev;
-    int slot = ffs(val) - 1;
-
-    QLIST_FOREACH_SAFE(qdev, &bus->children, sibling, next) {
-        dev = DO_UPCAST(PCIDevice, qdev, qdev);
-        if (PCI_SLOT(dev->devfn) == slot) {
-            qdev_free(qdev);
-        }
-    }
-
-
-#if defined(DEBUG)
-    printf("pciej write %x <== %d\n", addr, val);
-#endif
-}
-
-static int piix4_device_hotplug(PCIDevice *dev, int state);
-
-void piix4_acpi_system_hot_add_init(PCIBus *bus)
-{
-    register_ioport_write(GPE_BASE, 4, 1, gpe_writeb, &gpe);
-    register_ioport_read(GPE_BASE, 4, 1,  gpe_readb, &gpe);
-
-    register_ioport_write(PCI_BASE, 8, 4, pcihotplug_write, &pci0_status);
-    register_ioport_read(PCI_BASE, 8, 4,  pcihotplug_read, &pci0_status);
-
-    register_ioport_write(PCI_EJ_BASE, 4, 4, pciej_write, bus);
-    register_ioport_read(PCI_EJ_BASE, 4, 4,  pciej_read, bus);
-
-    pci_bus_hotplug(bus, piix4_device_hotplug);
-}
-
-static void enable_device(struct pci_status *p, struct gpe_regs *g, int slot)
-{
-    g->sts |= 2;
-    p->up |= (1 << slot);
-}
-
-static void disable_device(struct pci_status *p, struct gpe_regs *g, int slot)
-{
-    g->sts |= 2;
-    p->down |= (1 << slot);
-}
-
-static int piix4_device_hotplug(PCIDevice *dev, int state)
-{
-    int slot = PCI_SLOT(dev->devfn);
-
-    pci0_status.up = 0;
-    pci0_status.down = 0;
-    if (state)
-        enable_device(&pci0_status, &gpe, slot);
-    else
-        disable_device(&pci0_status, &gpe, slot);
-    if (gpe.en & 2) {
-        qemu_set_irq(pm_state->irq, 1);
-        qemu_set_irq(pm_state->irq, 0);
-    }
-    return 0;
-}
-
 struct acpi_table_header
 {
     char signature [4];    /* ACPI signature (4 ASCII characters) */
diff --git a/hw/acpi.c b/hw/acpi_piix4.c
similarity index 76%
copy from hw/acpi.c
copy to hw/acpi_piix4.c
index 891378c..1292d2b 100644
--- a/hw/acpi.c
+++ b/hw/acpi_piix4.c
@@ -20,7 +20,6 @@
 #include "apm.h"
 #include "pm_smbus.h"
 #include "pci.h"
-#include "qemu-timer.h"
 #include "sysemu.h"
 #include "i2c.h"
 #include "smbus.h"
@@ -582,172 +581,3 @@ static int piix4_device_hotplug(PCIDevice *dev, int state)
     }
     return 0;
 }
-
-struct acpi_table_header
-{
-    char signature [4];    /* ACPI signature (4 ASCII characters) */
-    uint32_t length;          /* Length of table, in bytes, including header */
-    uint8_t revision;         /* ACPI Specification minor version # */
-    uint8_t checksum;         /* To make sum of entire table == 0 */
-    char oem_id [6];       /* OEM identification */
-    char oem_table_id [8]; /* OEM table identification */
-    uint32_t oem_revision;    /* OEM revision number */
-    char asl_compiler_id [4]; /* ASL compiler vendor ID */
-    uint32_t asl_compiler_revision; /* ASL compiler revision number */
-} __attribute__((packed));
-
-char *acpi_tables;
-size_t acpi_tables_len;
-
-static int acpi_checksum(const uint8_t *data, int len)
-{
-    int sum, i;
-    sum = 0;
-    for(i = 0; i < len; i++)
-        sum += data[i];
-    return (-sum) & 0xff;
-}
-
-int acpi_table_add(const char *t)
-{
-    static const char *dfl_id = "QEMUQEMU";
-    char buf[1024], *p, *f;
-    struct acpi_table_header acpi_hdr;
-    unsigned long val;
-    size_t off;
-
-    memset(&acpi_hdr, 0, sizeof(acpi_hdr));
-  
-    if (get_param_value(buf, sizeof(buf), "sig", t)) {
-        strncpy(acpi_hdr.signature, buf, 4);
-    } else {
-        strncpy(acpi_hdr.signature, dfl_id, 4);
-    }
-    if (get_param_value(buf, sizeof(buf), "rev", t)) {
-        val = strtoul(buf, &p, 10);
-        if (val > 255 || *p != '\0')
-            goto out;
-    } else {
-        val = 1;
-    }
-    acpi_hdr.revision = (int8_t)val;
-
-    if (get_param_value(buf, sizeof(buf), "oem_id", t)) {
-        strncpy(acpi_hdr.oem_id, buf, 6);
-    } else {
-        strncpy(acpi_hdr.oem_id, dfl_id, 6);
-    }
-
-    if (get_param_value(buf, sizeof(buf), "oem_table_id", t)) {
-        strncpy(acpi_hdr.oem_table_id, buf, 8);
-    } else {
-        strncpy(acpi_hdr.oem_table_id, dfl_id, 8);
-    }
-
-    if (get_param_value(buf, sizeof(buf), "oem_rev", t)) {
-        val = strtol(buf, &p, 10);
-        if(*p != '\0')
-            goto out;
-    } else {
-        val = 1;
-    }
-    acpi_hdr.oem_revision = cpu_to_le32(val);
-
-    if (get_param_value(buf, sizeof(buf), "asl_compiler_id", t)) {
-        strncpy(acpi_hdr.asl_compiler_id, buf, 4);
-    } else {
-        strncpy(acpi_hdr.asl_compiler_id, dfl_id, 4);
-    }
-
-    if (get_param_value(buf, sizeof(buf), "asl_compiler_rev", t)) {
-        val = strtol(buf, &p, 10);
-        if(*p != '\0')
-            goto out;
-    } else {
-        val = 1;
-    }
-    acpi_hdr.asl_compiler_revision = cpu_to_le32(val);
-    
-    if (!get_param_value(buf, sizeof(buf), "data", t)) {
-         buf[0] = '\0';
-    }
-
-    acpi_hdr.length = sizeof(acpi_hdr);
-
-    f = buf;
-    while (buf[0]) {
-        struct stat s;
-        char *n = strchr(f, ':');
-        if (n)
-            *n = '\0';
-        if(stat(f, &s) < 0) {
-            fprintf(stderr, "Can't stat file '%s': %s\n", f, strerror(errno));
-            goto out;
-        }
-        acpi_hdr.length += s.st_size;
-        if (!n)
-            break;
-        *n = ':';
-        f = n + 1;
-    }
-
-    if (!acpi_tables) {
-        acpi_tables_len = sizeof(uint16_t);
-        acpi_tables = qemu_mallocz(acpi_tables_len);
-    }
-    p = acpi_tables + acpi_tables_len;
-    acpi_tables_len += sizeof(uint16_t) + acpi_hdr.length;
-    acpi_tables = qemu_realloc(acpi_tables, acpi_tables_len);
-
-    acpi_hdr.length = cpu_to_le32(acpi_hdr.length);
-    *(uint16_t*)p = acpi_hdr.length;
-    p += sizeof(uint16_t);
-    memcpy(p, &acpi_hdr, sizeof(acpi_hdr));
-    off = sizeof(acpi_hdr);
-
-    f = buf;
-    while (buf[0]) {
-        struct stat s;
-        int fd;
-        char *n = strchr(f, ':');
-        if (n)
-            *n = '\0';
-        fd = open(f, O_RDONLY);
-
-        if(fd < 0)
-            goto out;
-        if(fstat(fd, &s) < 0) {
-            close(fd);
-            goto out;
-        }
-
-        do {
-            int r;
-            r = read(fd, p + off, s.st_size);
-            if (r > 0) {
-                off += r;
-                s.st_size -= r;
-            } else if ((r < 0 && errno != EINTR) || r == 0) {
-                close(fd);
-                goto out;
-            }
-        } while(s.st_size);
-
-        close(fd);
-        if (!n)
-            break;
-        f = n + 1;
-    }
-
-    ((struct acpi_table_header*)p)->checksum = acpi_checksum((uint8_t*)p, off);
-    /* increase number of tables */
-    (*(uint16_t*)acpi_tables) =
-	    cpu_to_le32(le32_to_cpu(*(uint16_t*)acpi_tables) + 1);
-    return 0;
-out:
-    if (acpi_tables) {
-        qemu_free(acpi_tables);
-        acpi_tables = NULL;
-    }
-    return -1;
-}
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [Qemu-devel] [PATCH 05/26] pc: initialize ioapic before use.
  2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
                   ` (3 preceding siblings ...)
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 04/26] acpi: split acpi.c into the common part and the piix4 part Isaku Yamahata
@ 2010-05-14  7:29 ` Isaku Yamahata
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 06/26] pc, i440fx: Make smm enable/disable function i440fx independent Isaku Yamahata
                   ` (21 subsequent siblings)
  26 siblings, 0 replies; 29+ messages in thread
From: Isaku Yamahata @ 2010-05-14  7:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, yamahata, kraxel

The changeset of 2c8d9340203c7f19265fd4cb2341f568217a3af6
prevents isa_irq_handler() from NULL refering of IsaIrqState::ioapic.
However it would be better to initialize the member before reference.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/pc.c |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/hw/pc.c b/hw/pc.c
index db2b9a2..8842766 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -921,6 +921,9 @@ static void pc_init1(ram_addr_t ram_size,
     i8259 = i8259_init(cpu_irq[0]);
     isa_irq_state = qemu_mallocz(sizeof(*isa_irq_state));
     isa_irq_state->i8259 = i8259;
+    if (pci_enabled) {
+        isa_irq_state->ioapic = ioapic_init();
+    }
     isa_irq = qemu_allocate_irqs(isa_irq_handler, isa_irq_state, 24);
 
     if (pci_enabled) {
@@ -964,9 +967,6 @@ static void pc_init1(ram_addr_t ram_size,
     register_ioport_read(0x92, 1, 1, ioport92_read, NULL);
     register_ioport_write(0x92, 1, 1, ioport92_write, NULL);
 
-    if (pci_enabled) {
-        isa_irq_state->ioapic = ioapic_init();
-    }
     pit = pit_init(0x40, isa_reserve_irq(0));
     pcspk_init(pit);
     if (!no_hpet) {
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [Qemu-devel] [PATCH 06/26] pc, i440fx: Make smm enable/disable function i440fx independent.
  2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
                   ` (4 preceding siblings ...)
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 05/26] pc: initialize ioapic before use Isaku Yamahata
@ 2010-05-14  7:29 ` Isaku Yamahata
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 07/26] pc: make an unnecessary global variable, pit, local Isaku Yamahata
                   ` (20 subsequent siblings)
  26 siblings, 0 replies; 29+ messages in thread
From: Isaku Yamahata @ 2010-05-14  7:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, yamahata, kraxel

make cpu_smm_update() generic to be independent on i440fx by
registering a callback.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/pc.c       |   18 +++++++++++++++---
 hw/pc.h       |    4 +++-
 hw/piix_pci.c |    5 ++++-
 3 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/hw/pc.c b/hw/pc.c
index 8842766..691803f 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -68,7 +68,6 @@
 static FDCtrl *floppy_controller;
 static RTCState *rtc_state;
 static PITState *pit;
-static PCII440FXState *i440fx_state;
 
 #define E820_NR_ENTRIES		16
 
@@ -125,10 +124,22 @@ uint64_t cpu_get_tsc(CPUX86State *env)
 }
 
 /* SMM support */
+
+static cpu_set_smm_t smm_set;
+static void *smm_arg;
+
+void cpu_smm_register(cpu_set_smm_t callback, void *arg)
+{
+    assert(smm_set == NULL);
+    assert(smm_arg == NULL);
+    smm_set = callback;
+    smm_arg = arg;
+}
+
 void cpu_smm_update(CPUState *env)
 {
-    if (i440fx_state && env == first_cpu)
-        i440fx_set_smm(i440fx_state, (env->hflags >> HF_SMM_SHIFT) & 1);
+    if (smm_set && smm_arg && env == first_cpu)
+        smm_set(!!(env->hflags & HF_SMM_MASK), smm_arg);
 }
 
 
@@ -813,6 +824,7 @@ static void pc_init1(ram_addr_t ram_size,
     ram_addr_t below_4g_mem_size, above_4g_mem_size = 0;
     int bios_size, isa_bios_size;
     PCIBus *pci_bus;
+    PCII440FXState *i440fx_state;
     int piix3_devfn = -1;
     qemu_irq *cpu_irq;
     qemu_irq *isa_irq;
diff --git a/hw/pc.h b/hw/pc.h
index d11a576..77239a0 100644
--- a/hw/pc.h
+++ b/hw/pc.h
@@ -80,6 +80,9 @@ extern int fd_bootchk;
 void ioport_set_a20(int enable);
 int ioport_get_a20(void);
 
+typedef void (*cpu_set_smm_t)(int smm, void *arg);
+void cpu_smm_register(cpu_set_smm_t callback, void *arg);
+
 /* acpi.c */
 extern int acpi_enabled;
 extern char *acpi_tables;
@@ -108,7 +111,6 @@ struct PCII440FXState;
 typedef struct PCII440FXState PCII440FXState;
 
 PCIBus *i440fx_init(PCII440FXState **pi440fx_state, int *piix_devfn, qemu_irq *pic, int ram_size);
-void i440fx_set_smm(PCII440FXState *d, int val);
 void i440fx_init_memory_mappings(PCII440FXState *d);
 
 /* piix4.c */
diff --git a/hw/piix_pci.c b/hw/piix_pci.c
index 97519db..aff7f6d 100644
--- a/hw/piix_pci.c
+++ b/hw/piix_pci.c
@@ -114,8 +114,10 @@ static void i440fx_update_memory_mappings(PCII440FXState *d)
     }
 }
 
-void i440fx_set_smm(PCII440FXState *d, int val)
+static void i440fx_set_smm(int val, void *arg)
 {
+    PCII440FXState *d = arg;
+
     val = (val != 0);
     if (d->smm_enabled != val) {
         d->smm_enabled = val;
@@ -210,6 +212,7 @@ static int i440fx_initfn(PCIDevice *dev)
 
     d->dev.config[I440FX_SMRAM] = 0x02;
 
+    cpu_smm_register(&i440fx_set_smm, d);
     return 0;
 }
 
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [Qemu-devel] [PATCH 07/26] pc: make an unnecessary global variable, pit, local.
  2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
                   ` (5 preceding siblings ...)
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 06/26] pc, i440fx: Make smm enable/disable function i440fx independent Isaku Yamahata
@ 2010-05-14  7:29 ` Isaku Yamahata
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 08/26] pc: remove a global variable, floppy_controller Isaku Yamahata
                   ` (19 subsequent siblings)
  26 siblings, 0 replies; 29+ messages in thread
From: Isaku Yamahata @ 2010-05-14  7:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, yamahata, kraxel

remove unnecessary global static variables, pit.
Make it local.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/pc.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/hw/pc.c b/hw/pc.c
index 691803f..b23684e 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -67,7 +67,6 @@
 
 static FDCtrl *floppy_controller;
 static RTCState *rtc_state;
-static PITState *pit;
 
 #define E820_NR_ENTRIES		16
 
@@ -835,6 +834,7 @@ static void pc_init1(ram_addr_t ram_size,
     DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
     DriveInfo *fd[MAX_FD];
     void *fw_cfg;
+    PITState *pit;
 
     if (ram_size >= 0xe0000000 ) {
         above_4g_mem_size = ram_size - 0xe0000000;
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [Qemu-devel] [PATCH 08/26] pc: remove a global variable, floppy_controller.
  2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
                   ` (6 preceding siblings ...)
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 07/26] pc: make an unnecessary global variable, pit, local Isaku Yamahata
@ 2010-05-14  7:29 ` Isaku Yamahata
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 09/26] pc: remove global variable rtc_state by using qemu_irq Isaku Yamahata
                   ` (18 subsequent siblings)
  26 siblings, 0 replies; 29+ messages in thread
From: Isaku Yamahata @ 2010-05-14  7:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, yamahata, kraxel

Remove a global variable, floppy_controller.
Since it is unnecessarily global, make it local and pass it as
a function argument.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/pc.c |    8 +++++---
 1 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/hw/pc.c b/hw/pc.c
index b23684e..3b6da4a 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -65,7 +65,6 @@
 
 #define MAX_IDE_BUS 2
 
-static FDCtrl *floppy_controller;
 static RTCState *rtc_state;
 
 #define E820_NR_ENTRIES		16
@@ -273,7 +272,8 @@ static int pc_boot_set(void *opaque, const char *boot_device)
 
 /* hd_table must contain 4 block drivers */
 static void cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
-                      const char *boot_device, DriveInfo **hd_table)
+                      const char *boot_device, DriveInfo **hd_table,
+                      FDCtrl *floppy_controller)
 {
     RTCState *s = rtc_state;
     int val;
@@ -834,6 +834,7 @@ static void pc_init1(ram_addr_t ram_size,
     DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
     DriveInfo *fd[MAX_FD];
     void *fw_cfg;
+    FDCtrl *floppy_controller;
     PITState *pit;
 
     if (ram_size >= 0xe0000000 ) {
@@ -1035,7 +1036,8 @@ static void pc_init1(ram_addr_t ram_size,
     }
     floppy_controller = fdctrl_init_isa(fd);
 
-    cmos_init(below_4g_mem_size, above_4g_mem_size, boot_device, hd);
+    cmos_init(below_4g_mem_size, above_4g_mem_size, boot_device, hd,
+              floppy_controller);
 
     if (pci_enabled && usb_enabled) {
         usb_uhci_piix3_init(pci_bus, piix3_devfn + 2);
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [Qemu-devel] [PATCH 09/26] pc: remove global variable rtc_state by using qemu_irq.
  2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
                   ` (7 preceding siblings ...)
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 08/26] pc: remove a global variable, floppy_controller Isaku Yamahata
@ 2010-05-14  7:29 ` Isaku Yamahata
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 10/26] pc: introduce a function to allocate cpu irq Isaku Yamahata
                   ` (17 subsequent siblings)
  26 siblings, 0 replies; 29+ messages in thread
From: Isaku Yamahata @ 2010-05-14  7:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, yamahata, Paolo Bonzini, kraxel

Remove the reference to the global variable, rtc_state, by passing
function argument to cmos_init_hd(), cmos_init().

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Cc: Paolo Bonzini <bonzini@gnu.org>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
Cc: Blue Swirl <blauwirbel@gmail.com>

---
Changes v12 -> v13
Blue already converted the CMOS S3 to use qemu_irq by
the change set of 53b67b3052f39b049bc7c79ae1ce132c90098c6c.
So the patch is simplified.
---
 hw/pc.c |   16 +++++++---------
 1 files changed, 7 insertions(+), 9 deletions(-)

diff --git a/hw/pc.c b/hw/pc.c
index 3b6da4a..c88158c 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -65,8 +65,6 @@
 
 #define MAX_IDE_BUS 2
 
-static RTCState *rtc_state;
-
 #define E820_NR_ENTRIES		16
 
 struct e820_entry {
@@ -207,9 +205,9 @@ static int cmos_get_fd_drive_type(int fd0)
     return val;
 }
 
-static void cmos_init_hd(int type_ofs, int info_ofs, BlockDriverState *hd)
+static void cmos_init_hd(int type_ofs, int info_ofs, BlockDriverState *hd,
+                         RTCState *s)
 {
-    RTCState *s = rtc_state;
     int cylinders, heads, sectors;
     bdrv_get_geometry_hint(hd, &cylinders, &heads, &sectors);
     rtc_set_memory(s, type_ofs, 47);
@@ -273,9 +271,8 @@ static int pc_boot_set(void *opaque, const char *boot_device)
 /* hd_table must contain 4 block drivers */
 static void cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
                       const char *boot_device, DriveInfo **hd_table,
-                      FDCtrl *floppy_controller)
+                      FDCtrl *floppy_controller, RTCState *s)
 {
-    RTCState *s = rtc_state;
     int val;
     int fd0, fd1, nb;
     int i;
@@ -350,9 +347,9 @@ static void cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
 
     rtc_set_memory(s, 0x12, (hd_table[0] ? 0xf0 : 0) | (hd_table[1] ? 0x0f : 0));
     if (hd_table[0])
-        cmos_init_hd(0x19, 0x1b, hd_table[0]->bdrv);
+        cmos_init_hd(0x19, 0x1b, hd_table[0]->bdrv, s);
     if (hd_table[1])
-        cmos_init_hd(0x1a, 0x24, hd_table[1]->bdrv);
+        cmos_init_hd(0x1a, 0x24, hd_table[1]->bdrv, s);
 
     val = 0;
     for (i = 0; i < 4; i++) {
@@ -835,6 +832,7 @@ static void pc_init1(ram_addr_t ram_size,
     DriveInfo *fd[MAX_FD];
     void *fw_cfg;
     FDCtrl *floppy_controller;
+    RTCState *rtc_state;
     PITState *pit;
 
     if (ram_size >= 0xe0000000 ) {
@@ -1037,7 +1035,7 @@ static void pc_init1(ram_addr_t ram_size,
     floppy_controller = fdctrl_init_isa(fd);
 
     cmos_init(below_4g_mem_size, above_4g_mem_size, boot_device, hd,
-              floppy_controller);
+              floppy_controller, rtc_state);
 
     if (pci_enabled && usb_enabled) {
         usb_uhci_piix3_init(pci_bus, piix3_devfn + 2);
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [Qemu-devel] [PATCH 10/26] pc: introduce a function to allocate cpu irq.
  2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
                   ` (8 preceding siblings ...)
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 09/26] pc: remove global variable rtc_state by using qemu_irq Isaku Yamahata
@ 2010-05-14  7:29 ` Isaku Yamahata
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 11/26] pc: make pc_init1() not refer ferr_irq directly Isaku Yamahata
                   ` (16 subsequent siblings)
  26 siblings, 0 replies; 29+ messages in thread
From: Isaku Yamahata @ 2010-05-14  7:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, yamahata, kraxel

Introduce a function, pc_allocate_cpu_irq(), to allocate cpu irq
in order to make pic_irq_request() piix independent.
Later piix code will be split out to another file keeping pic_irq_request()
static.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/pc.c |    7 ++++++-
 1 files changed, 6 insertions(+), 1 deletions(-)

diff --git a/hw/pc.c b/hw/pc.c
index c88158c..fa11477 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -805,6 +805,11 @@ static CPUState *pc_new_cpu(const char *cpu_model)
     return env;
 }
 
+static qemu_irq *pc_allocate_cpu_irq(void)
+{
+    return qemu_allocate_irqs(pic_irq_request, NULL, 1);
+}
+
 /* PC hardware initialisation */
 static void pc_init1(ram_addr_t ram_size,
                      const char *boot_device,
@@ -928,7 +933,7 @@ static void pc_init1(ram_addr_t ram_size,
         rom_add_option(option_rom[i]);
     }
 
-    cpu_irq = qemu_allocate_irqs(pic_irq_request, NULL, 1);
+    cpu_irq = pc_allocate_cpu_irq();
     i8259 = i8259_init(cpu_irq[0]);
     isa_irq_state = qemu_mallocz(sizeof(*isa_irq_state));
     isa_irq_state->i8259 = i8259;
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [Qemu-devel] [PATCH 11/26] pc: make pc_init1() not refer ferr_irq directly.
  2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
                   ` (9 preceding siblings ...)
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 10/26] pc: introduce a function to allocate cpu irq Isaku Yamahata
@ 2010-05-14  7:29 ` Isaku Yamahata
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 12/26] pc: split out cpu initialization from pc_init1() into pc_cpus_init() Isaku Yamahata
                   ` (15 subsequent siblings)
  26 siblings, 0 replies; 29+ messages in thread
From: Isaku Yamahata @ 2010-05-14  7:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, yamahata, kraxel

By introducing a registering function, make pc_init1() not refer to
ferr_irq directly in order to make ferr_irq piix independent.
Later pc_init1() will be split out into another file keeping ferr_irq
static.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/pc.c |    8 +++++++-
 hw/pc.h |    2 ++
 2 files changed, 9 insertions(+), 1 deletions(-)

diff --git a/hw/pc.c b/hw/pc.c
index fa11477..18c025b 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -102,6 +102,12 @@ static void ioport80_write(void *opaque, uint32_t addr, uint32_t data)
 
 /* MSDOS compatibility mode FPU exception support */
 static qemu_irq ferr_irq;
+
+void pc_register_ferr_irq(qemu_irq irq)
+{
+    ferr_irq = irq;
+}
+
 /* XXX: add IGNNE support */
 void cpu_set_ferr(CPUX86State *s)
 {
@@ -950,7 +956,7 @@ static void pc_init1(ram_addr_t ram_size,
     }
     isa_bus_irqs(isa_irq);
 
-    ferr_irq = isa_reserve_irq(13);
+    pc_register_ferr_irq(isa_reserve_irq(13));
 
     /* init basic PC hardware */
     register_ioport_write(0x80, 1, 1, ioport80_write, NULL);
diff --git a/hw/pc.h b/hw/pc.h
index 77239a0..abf02de 100644
--- a/hw/pc.h
+++ b/hw/pc.h
@@ -77,6 +77,8 @@ void rtc_set_date(RTCState *s, const struct tm *tm);
 /* pc.c */
 extern int fd_bootchk;
 
+void pc_register_ferr_irq(qemu_irq irq);
+
 void ioport_set_a20(int enable);
 int ioport_get_a20(void);
 
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [Qemu-devel] [PATCH 12/26] pc: split out cpu initialization from pc_init1() into pc_cpus_init().
  2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
                   ` (10 preceding siblings ...)
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 11/26] pc: make pc_init1() not refer ferr_irq directly Isaku Yamahata
@ 2010-05-14  7:29 ` Isaku Yamahata
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 13/26] pc: split out memory allocation from pc_init1() into pc_memory_init() Isaku Yamahata
                   ` (14 subsequent siblings)
  26 siblings, 0 replies; 29+ messages in thread
From: Isaku Yamahata @ 2010-05-14  7:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, yamahata, kraxel

split out cpu initialization which is piix independent from pc_init1()
into pc_cpus_init(). Later it will be used.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/pc.c |   31 +++++++++++++++++++------------
 1 files changed, 19 insertions(+), 12 deletions(-)

diff --git a/hw/pc.c b/hw/pc.c
index 18c025b..9f720df 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -811,6 +811,24 @@ static CPUState *pc_new_cpu(const char *cpu_model)
     return env;
 }
 
+static void pc_cpus_init(const char *cpu_model)
+{
+    int i;
+
+    /* init CPUs */
+    if (cpu_model == NULL) {
+#ifdef TARGET_X86_64
+        cpu_model = "qemu64";
+#else
+        cpu_model = "qemu32";
+#endif
+    }
+
+    for(i = 0; i < smp_cpus; i++) {
+        pc_new_cpu(cpu_model);
+    }
+}
+
 static qemu_irq *pc_allocate_cpu_irq(void)
 {
     return qemu_allocate_irqs(pic_irq_request, NULL, 1);
@@ -855,18 +873,7 @@ static void pc_init1(ram_addr_t ram_size,
 
     linux_boot = (kernel_filename != NULL);
 
-    /* init CPUs */
-    if (cpu_model == NULL) {
-#ifdef TARGET_X86_64
-        cpu_model = "qemu64";
-#else
-        cpu_model = "qemu32";
-#endif
-    }
-
-    for (i = 0; i < smp_cpus; i++) {
-        pc_new_cpu(cpu_model);
-    }
+    pc_cpus_init(cpu_model);
 
     vmport_init();
 
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [Qemu-devel] [PATCH 13/26] pc: split out memory allocation from pc_init1() into pc_memory_init()
  2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
                   ` (11 preceding siblings ...)
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 12/26] pc: split out cpu initialization from pc_init1() into pc_cpus_init() Isaku Yamahata
@ 2010-05-14  7:29 ` Isaku Yamahata
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 14/26] pc: split out vga initialization from pc_init1() into pc_vga_init() Isaku Yamahata
                   ` (13 subsequent siblings)
  26 siblings, 0 replies; 29+ messages in thread
From: Isaku Yamahata @ 2010-05-14  7:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, yamahata, kraxel

Split out memory allocation and rom/bios loading which doesn't depend
on piix from pc_init1() into pc_memory_init().
Later it will be used.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/pc.c |   73 ++++++++++++++++++++++++++++++++++++++------------------------
 1 files changed, 45 insertions(+), 28 deletions(-)

diff --git a/hw/pc.c b/hw/pc.c
index 9f720df..2e37c63 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -834,35 +834,19 @@ static qemu_irq *pc_allocate_cpu_irq(void)
     return qemu_allocate_irqs(pic_irq_request, NULL, 1);
 }
 
-/* PC hardware initialisation */
-static void pc_init1(ram_addr_t ram_size,
-                     const char *boot_device,
-                     const char *kernel_filename,
-                     const char *kernel_cmdline,
-                     const char *initrd_filename,
-                     const char *cpu_model,
-                     int pci_enabled)
+static void pc_memory_init(ram_addr_t ram_size,
+                           const char *kernel_filename,
+                           const char *kernel_cmdline,
+                           const char *initrd_filename,
+                           ram_addr_t *below_4g_mem_size_p,
+                           ram_addr_t *above_4g_mem_size_p)
 {
     char *filename;
     int ret, linux_boot, i;
     ram_addr_t ram_addr, bios_offset, option_rom_offset;
     ram_addr_t below_4g_mem_size, above_4g_mem_size = 0;
     int bios_size, isa_bios_size;
-    PCIBus *pci_bus;
-    PCII440FXState *i440fx_state;
-    int piix3_devfn = -1;
-    qemu_irq *cpu_irq;
-    qemu_irq *isa_irq;
-    qemu_irq *i8259;
-    qemu_irq *cmos_s3;
-    qemu_irq *smi_irq;
-    IsaIrqState *isa_irq_state;
-    DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
-    DriveInfo *fd[MAX_FD];
-    void *fw_cfg;
-    FDCtrl *floppy_controller;
-    RTCState *rtc_state;
-    PITState *pit;
+    void **fw_cfg;
 
     if (ram_size >= 0xe0000000 ) {
         above_4g_mem_size = ram_size - 0xe0000000;
@@ -870,13 +854,11 @@ static void pc_init1(ram_addr_t ram_size,
     } else {
         below_4g_mem_size = ram_size;
     }
+    *above_4g_mem_size_p = above_4g_mem_size;
+    *below_4g_mem_size_p = below_4g_mem_size;
 
     linux_boot = (kernel_filename != NULL);
 
-    pc_cpus_init(cpu_model);
-
-    vmport_init();
-
     /* allocate RAM */
     ram_addr = qemu_ram_alloc(below_4g_mem_size);
     cpu_register_physical_memory(0, 0xa0000, ram_addr);
@@ -939,12 +921,47 @@ static void pc_init1(ram_addr_t ram_size,
     rom_set_fw(fw_cfg);
 
     if (linux_boot) {
-        load_linux(fw_cfg, kernel_filename, initrd_filename, kernel_cmdline, below_4g_mem_size);
+        load_linux(*fw_cfg, kernel_filename, initrd_filename, kernel_cmdline, below_4g_mem_size);
     }
 
     for (i = 0; i < nb_option_roms; i++) {
         rom_add_option(option_rom[i]);
     }
+}
+
+/* PC hardware initialisation */
+static void pc_init1(ram_addr_t ram_size,
+                     const char *boot_device,
+                     const char *kernel_filename,
+                     const char *kernel_cmdline,
+                     const char *initrd_filename,
+                     const char *cpu_model,
+                     int pci_enabled)
+{
+    int i;
+    ram_addr_t below_4g_mem_size, above_4g_mem_size;
+    PCIBus *pci_bus;
+    PCII440FXState *i440fx_state;
+    int piix3_devfn = -1;
+    qemu_irq *cpu_irq;
+    qemu_irq *isa_irq;
+    qemu_irq *i8259;
+    qemu_irq *cmos_s3;
+    qemu_irq *smi_irq;
+    IsaIrqState *isa_irq_state;
+    DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
+    DriveInfo *fd[MAX_FD];
+    FDCtrl *floppy_controller;
+    RTCState *rtc_state;
+    PITState *pit;
+
+    pc_cpus_init(cpu_model);
+
+    vmport_init();
+
+    /* allocate ram and load rom/bios */
+    pc_memory_init(ram_size, kernel_filename, kernel_cmdline, initrd_filename,
+                   &below_4g_mem_size, &above_4g_mem_size);
 
     cpu_irq = pc_allocate_cpu_irq();
     i8259 = i8259_init(cpu_irq[0]);
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [Qemu-devel] [PATCH 14/26] pc: split out vga initialization from pc_init1() into pc_vga_init().
  2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
                   ` (12 preceding siblings ...)
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 13/26] pc: split out memory allocation from pc_init1() into pc_memory_init() Isaku Yamahata
@ 2010-05-14  7:29 ` Isaku Yamahata
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 15/26] pc: split out basic device init from pc_init1() into pc_basic_device_init() Isaku Yamahata
                   ` (12 subsequent siblings)
  26 siblings, 0 replies; 29+ messages in thread
From: Isaku Yamahata @ 2010-05-14  7:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, yamahata, kraxel

Split out vga initialization which is independent of piix
from pc_init1() as pc_vga_init().
Later it will be used.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/pc.c |   41 +++++++++++++++++++++++------------------
 1 files changed, 23 insertions(+), 18 deletions(-)

diff --git a/hw/pc.c b/hw/pc.c
index 2e37c63..53df13d 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -929,6 +929,28 @@ static void pc_memory_init(ram_addr_t ram_size,
     }
 }
 
+static void pc_vga_init(PCIBus *pci_bus)
+{
+    if (cirrus_vga_enabled) {
+        if (pci_bus) {
+            pci_cirrus_vga_init(pci_bus);
+        } else {
+            isa_cirrus_vga_init();
+        }
+    } else if (vmsvga_enabled) {
+        if (pci_bus)
+            pci_vmsvga_init(pci_bus);
+        else
+            fprintf(stderr, "%s: vmware_vga: no PCI bus\n", __FUNCTION__);
+    } else if (std_vga_enabled) {
+        if (pci_bus) {
+            pci_vga_init(pci_bus, 0, 0);
+        } else {
+            isa_vga_init();
+        }
+    }
+}
+
 /* PC hardware initialisation */
 static void pc_init1(ram_addr_t ram_size,
                      const char *boot_device,
@@ -987,24 +1009,7 @@ static void pc_init1(ram_addr_t ram_size,
 
     register_ioport_write(0xf0, 1, 1, ioportF0_write, NULL);
 
-    if (cirrus_vga_enabled) {
-        if (pci_enabled) {
-            pci_cirrus_vga_init(pci_bus);
-        } else {
-            isa_cirrus_vga_init();
-        }
-    } else if (vmsvga_enabled) {
-        if (pci_enabled)
-            pci_vmsvga_init(pci_bus);
-        else
-            fprintf(stderr, "%s: vmware_vga: no PCI bus\n", __FUNCTION__);
-    } else if (std_vga_enabled) {
-        if (pci_enabled) {
-            pci_vga_init(pci_bus, 0, 0);
-        } else {
-            isa_vga_init();
-        }
-    }
+    pc_vga_init(pci_enabled? pci_bus: NULL);
 
     rtc_state = rtc_init(2000);
 
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [Qemu-devel] [PATCH 15/26] pc: split out basic device init from pc_init1() into pc_basic_device_init()
  2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
                   ` (13 preceding siblings ...)
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 14/26] pc: split out vga initialization from pc_init1() into pc_vga_init() Isaku Yamahata
@ 2010-05-14  7:29 ` Isaku Yamahata
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 16/26] pc: split out pci device init from pc_init1() into pc_pci_device_init() Isaku Yamahata
                   ` (11 subsequent siblings)
  26 siblings, 0 replies; 29+ messages in thread
From: Isaku Yamahata @ 2010-05-14  7:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, yamahata, kraxel

Split out basic device, i.e. legacy devices like floppy, initialization
from pc_init1() into pc_basic_device_init().
Later it will be used.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/pc.c |   86 +++++++++++++++++++++++++++++++++++---------------------------
 1 files changed, 48 insertions(+), 38 deletions(-)

diff --git a/hw/pc.c b/hw/pc.c
index 53df13d..d820a51 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -951,6 +951,52 @@ static void pc_vga_init(PCIBus *pci_bus)
     }
 }
 
+static void pc_basic_device_init(qemu_irq *isa_irq,
+                                 FDCtrl **floppy_controller,
+                                 RTCState **rtc_state)
+{
+    int i;
+    DriveInfo *fd[MAX_FD];
+    PITState *pit;
+
+    register_ioport_write(0x80, 1, 1, ioport80_write, NULL);
+
+    register_ioport_write(0xf0, 1, 1, ioportF0_write, NULL);
+
+    *rtc_state = rtc_init(2000);
+
+    qemu_register_boot_set(pc_boot_set, *rtc_state);
+
+    register_ioport_read(0x92, 1, 1, ioport92_read, NULL);
+    register_ioport_write(0x92, 1, 1, ioport92_write, NULL);
+
+    pit = pit_init(0x40, isa_reserve_irq(0));
+    pcspk_init(pit);
+    if (!no_hpet) {
+        hpet_init(isa_irq);
+    }
+
+    for(i = 0; i < MAX_SERIAL_PORTS; i++) {
+        if (serial_hds[i]) {
+            serial_isa_init(i, serial_hds[i]);
+        }
+    }
+
+    for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
+        if (parallel_hds[i]) {
+            parallel_init(i, parallel_hds[i]);
+        }
+    }
+
+    isa_create_simple("i8042");
+    DMA_init(0);
+
+    for(i = 0; i < MAX_FD; i++) {
+        fd[i] = drive_get(IF_FLOPPY, 0, i);
+    }
+    *floppy_controller = fdctrl_init_isa(fd);
+}
+
 /* PC hardware initialisation */
 static void pc_init1(ram_addr_t ram_size,
                      const char *boot_device,
@@ -972,10 +1018,8 @@ static void pc_init1(ram_addr_t ram_size,
     qemu_irq *smi_irq;
     IsaIrqState *isa_irq_state;
     DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
-    DriveInfo *fd[MAX_FD];
     FDCtrl *floppy_controller;
     RTCState *rtc_state;
-    PITState *pit;
 
     pc_cpus_init(cpu_model);
 
@@ -1004,37 +1048,10 @@ static void pc_init1(ram_addr_t ram_size,
 
     pc_register_ferr_irq(isa_reserve_irq(13));
 
-    /* init basic PC hardware */
-    register_ioport_write(0x80, 1, 1, ioport80_write, NULL);
-
-    register_ioport_write(0xf0, 1, 1, ioportF0_write, NULL);
-
     pc_vga_init(pci_enabled? pci_bus: NULL);
 
-    rtc_state = rtc_init(2000);
-
-    qemu_register_boot_set(pc_boot_set, rtc_state);
-
-    register_ioport_read(0x92, 1, 1, ioport92_read, NULL);
-    register_ioport_write(0x92, 1, 1, ioport92_write, NULL);
-
-    pit = pit_init(0x40, isa_reserve_irq(0));
-    pcspk_init(pit);
-    if (!no_hpet) {
-        hpet_init(isa_irq);
-    }
-
-    for(i = 0; i < MAX_SERIAL_PORTS; i++) {
-        if (serial_hds[i]) {
-            serial_isa_init(i, serial_hds[i]);
-        }
-    }
-
-    for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
-        if (parallel_hds[i]) {
-            parallel_init(i, parallel_hds[i]);
-        }
-    }
+    /* init basic PC hardware */
+    pc_basic_device_init(isa_irq, &floppy_controller, &rtc_state);
 
     for(i = 0; i < nb_nics; i++) {
         NICInfo *nd = &nd_table[i];
@@ -1063,17 +1080,10 @@ static void pc_init1(ram_addr_t ram_size,
         }
     }
 
-    isa_create_simple("i8042");
-    DMA_init(0);
 #ifdef HAS_AUDIO
     audio_init(pci_enabled ? pci_bus : NULL, isa_irq);
 #endif
 
-    for(i = 0; i < MAX_FD; i++) {
-        fd[i] = drive_get(IF_FLOPPY, 0, i);
-    }
-    floppy_controller = fdctrl_init_isa(fd);
-
     cmos_init(below_4g_mem_size, above_4g_mem_size, boot_device, hd,
               floppy_controller, rtc_state);
 
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [Qemu-devel] [PATCH 16/26] pc: split out pci device init from pc_init1() into pc_pci_device_init()
  2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
                   ` (14 preceding siblings ...)
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 15/26] pc: split out basic device init from pc_init1() into pc_basic_device_init() Isaku Yamahata
@ 2010-05-14  7:29 ` Isaku Yamahata
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 17/26] pc: split out piix specific part from pc.c into pc_piix.c Isaku Yamahata
                   ` (10 subsequent siblings)
  26 siblings, 0 replies; 29+ messages in thread
From: Isaku Yamahata @ 2010-05-14  7:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, yamahata, kraxel

Split out pci device initialization from pc_init1() into pc_pci_device_init().
and removed unnecessary braces.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/pc.c |   19 ++++++++++++-------
 1 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/hw/pc.c b/hw/pc.c
index d820a51..5c8a11b 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -997,6 +997,17 @@ static void pc_basic_device_init(qemu_irq *isa_irq,
     *floppy_controller = fdctrl_init_isa(fd);
 }
 
+static void pc_pci_device_init(PCIBus *pci_bus)
+{
+    int max_bus;
+    int bus;
+
+    max_bus = drive_get_max_bus(IF_SCSI);
+    for (bus = 0; bus <= max_bus; bus++) {
+        pci_create_simple(pci_bus, -1, "lsi53c895a");
+    }
+}
+
 /* PC hardware initialisation */
 static void pc_init1(ram_addr_t ram_size,
                      const char *boot_device,
@@ -1116,13 +1127,7 @@ static void pc_init1(ram_addr_t ram_size,
     }
 
     if (pci_enabled) {
-	int max_bus;
-        int bus;
-
-        max_bus = drive_get_max_bus(IF_SCSI);
-	for (bus = 0; bus <= max_bus; bus++) {
-            pci_create_simple(pci_bus, -1, "lsi53c895a");
-        }
+        pc_pci_device_init(pci_bus);
     }
 }
 
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [Qemu-devel] [PATCH 17/26] pc: split out piix specific part from pc.c into pc_piix.c
  2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
                   ` (15 preceding siblings ...)
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 16/26] pc: split out pci device init from pc_init1() into pc_pci_device_init() Isaku Yamahata
@ 2010-05-14  7:29 ` Isaku Yamahata
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 18/26] pc: move rtc declarations from pc.h into a dedicated header file Isaku Yamahata
                   ` (9 subsequent siblings)
  26 siblings, 0 replies; 29+ messages in thread
From: Isaku Yamahata @ 2010-05-14  7:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, yamahata, kraxel

Finally, we can safely split out the piix specific part from pc.c
into pc_piix.c.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
---
 Makefile.target |    2 +-
 hw/fdc.h        |    5 +
 hw/pc.c         |  351 ++++---------------------------------------------------
 hw/pc.h         |   33 +++++
 hw/pc_piix.c    |  317 +++++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 381 insertions(+), 327 deletions(-)
 create mode 100644 hw/pc_piix.c

diff --git a/Makefile.target b/Makefile.target
index 9d44660..a5c6b8d 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -195,7 +195,7 @@ obj-i386-y += cirrus_vga.o apic.o ioapic.o piix_pci.o
 obj-i386-y += vmmouse.o vmport.o hpet.o
 obj-i386-y += device-hotplug.o pci-hotplug.o smbios.o wdt_ib700.o
 obj-i386-y += debugcon.o multiboot.o
-obj-i386-y += pm_smbus.o apm.o acpi_piix4.o
+obj-i386-y += pm_smbus.o apm.o acpi_piix4.o pc_piix.o
 
 # shared objects
 obj-ppc-y = ppc.o
diff --git a/hw/fdc.h b/hw/fdc.h
index d173902..c48b5e0 100644
--- a/hw/fdc.h
+++ b/hw/fdc.h
@@ -1,3 +1,6 @@
+#ifndef HW_FDC_H
+#define HW_FDC_H
+
 /* fdc.c */
 #include "sysemu.h"
 #define MAX_FD 2
@@ -10,3 +13,5 @@ FDCtrl *fdctrl_init_sysbus(qemu_irq irq, int dma_chann,
 FDCtrl *sun4m_fdctrl_init(qemu_irq irq, target_phys_addr_t io_base,
                           DriveInfo **fds, qemu_irq *fdc_tc);
 int fdctrl_get_drive_type(FDCtrl *fdctrl, int drive_num);
+
+#endif
diff --git a/hw/pc.c b/hw/pc.c
index 5c8a11b..4f65049 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -27,26 +27,13 @@
 #include "fdc.h"
 #include "pci.h"
 #include "vmware_vga.h"
-#include "usb-uhci.h"
-#include "usb-ohci.h"
-#include "prep_pci.h"
-#include "apb_pci.h"
-#include "block.h"
-#include "sysemu.h"
-#include "audio/audio.h"
-#include "net.h"
-#include "smbus.h"
-#include "boards.h"
 #include "monitor.h"
 #include "fw_cfg.h"
 #include "hpet_emul.h"
-#include "watchdog.h"
 #include "smbios.h"
-#include "ide.h"
 #include "loader.h"
 #include "elf.h"
 #include "multiboot.h"
-#include "kvm.h"
 
 /* output Bochs bios info messages */
 //#define DEBUG_BIOS
@@ -63,8 +50,6 @@
 #define FW_CFG_IRQ0_OVERRIDE (FW_CFG_ARCH_LOCAL + 2)
 #define FW_CFG_E820_TABLE (FW_CFG_ARCH_LOCAL + 3)
 
-#define MAX_IDE_BUS 2
-
 #define E820_NR_ENTRIES		16
 
 struct e820_entry {
@@ -80,12 +65,7 @@ struct e820_table {
 
 static struct e820_table e820_table;
 
-typedef struct isa_irq_state {
-    qemu_irq *i8259;
-    qemu_irq *ioapic;
-} IsaIrqState;
-
-static void isa_irq_handler(void *opaque, int n, int level)
+void isa_irq_handler(void *opaque, int n, int level)
 {
     IsaIrqState *isa = (IsaIrqState *)opaque;
 
@@ -275,9 +255,9 @@ static int pc_boot_set(void *opaque, const char *boot_device)
 }
 
 /* hd_table must contain 4 block drivers */
-static void cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
-                      const char *boot_device, DriveInfo **hd_table,
-                      FDCtrl *floppy_controller, RTCState *s)
+void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
+                  const char *boot_device, DriveInfo **hd_table,
+                  FDCtrl *floppy_controller, RTCState *s)
 {
     int val;
     int fd0, fd1, nb;
@@ -723,10 +703,6 @@ static void load_linux(void *fw_cfg,
     nb_option_roms++;
 }
 
-static const int ide_iobase[2] = { 0x1f0, 0x170 };
-static const int ide_iobase2[2] = { 0x3f6, 0x376 };
-static const int ide_irq[2] = { 14, 15 };
-
 #define NE2000_NB_MAX 6
 
 static const int ne2000_io[NE2000_NB_MAX] = { 0x300, 0x320, 0x340, 0x360,
@@ -737,7 +713,7 @@ static const int parallel_io[MAX_PARALLEL_PORTS] = { 0x378, 0x278, 0x3bc };
 static const int parallel_irq[MAX_PARALLEL_PORTS] = { 7, 7, 7 };
 
 #ifdef HAS_AUDIO
-static void audio_init (PCIBus *pci_bus, qemu_irq *pic)
+void pc_audio_init (PCIBus *pci_bus, qemu_irq *pic)
 {
     struct soundhw *c;
 
@@ -755,7 +731,7 @@ static void audio_init (PCIBus *pci_bus, qemu_irq *pic)
 }
 #endif
 
-static void pc_init_ne2k_isa(NICInfo *nd)
+void pc_init_ne2k_isa(NICInfo *nd)
 {
     static int nb_ne2k = 0;
 
@@ -774,7 +750,7 @@ int cpu_is_bsp(CPUState *env)
 
 /* set CMOS shutdown status register (index 0xF) as S3_resume(0xFE)
    BIOS will read it and start S3 resume at POST Entry */
-static void cmos_set_s3_resume(void *opaque, int irq, int level)
+void pc_cmos_set_s3_resume(void *opaque, int irq, int level)
 {
     RTCState *s = opaque;
 
@@ -783,7 +759,7 @@ static void cmos_set_s3_resume(void *opaque, int irq, int level)
     }
 }
 
-static void acpi_smi_interrupt(void *opaque, int irq, int level)
+void pc_acpi_smi_interrupt(void *opaque, int irq, int level)
 {
     CPUState *s = opaque;
 
@@ -811,7 +787,7 @@ static CPUState *pc_new_cpu(const char *cpu_model)
     return env;
 }
 
-static void pc_cpus_init(const char *cpu_model)
+void pc_cpus_init(const char *cpu_model)
 {
     int i;
 
@@ -829,17 +805,12 @@ static void pc_cpus_init(const char *cpu_model)
     }
 }
 
-static qemu_irq *pc_allocate_cpu_irq(void)
-{
-    return qemu_allocate_irqs(pic_irq_request, NULL, 1);
-}
-
-static void pc_memory_init(ram_addr_t ram_size,
-                           const char *kernel_filename,
-                           const char *kernel_cmdline,
-                           const char *initrd_filename,
-                           ram_addr_t *below_4g_mem_size_p,
-                           ram_addr_t *above_4g_mem_size_p)
+void pc_memory_init(ram_addr_t ram_size,
+                    const char *kernel_filename,
+                    const char *kernel_cmdline,
+                    const char *initrd_filename,
+                    ram_addr_t *below_4g_mem_size_p,
+                    ram_addr_t *above_4g_mem_size_p)
 {
     char *filename;
     int ret, linux_boot, i;
@@ -929,7 +900,12 @@ static void pc_memory_init(ram_addr_t ram_size,
     }
 }
 
-static void pc_vga_init(PCIBus *pci_bus)
+qemu_irq *pc_allocate_cpu_irq(void)
+{
+    return qemu_allocate_irqs(pic_irq_request, NULL, 1);
+}
+
+void pc_vga_init(PCIBus *pci_bus)
 {
     if (cirrus_vga_enabled) {
         if (pci_bus) {
@@ -951,9 +927,9 @@ static void pc_vga_init(PCIBus *pci_bus)
     }
 }
 
-static void pc_basic_device_init(qemu_irq *isa_irq,
-                                 FDCtrl **floppy_controller,
-                                 RTCState **rtc_state)
+void pc_basic_device_init(qemu_irq *isa_irq,
+                          FDCtrl **floppy_controller,
+                          RTCState **rtc_state)
 {
     int i;
     DriveInfo *fd[MAX_FD];
@@ -997,7 +973,7 @@ static void pc_basic_device_init(qemu_irq *isa_irq,
     *floppy_controller = fdctrl_init_isa(fd);
 }
 
-static void pc_pci_device_init(PCIBus *pci_bus)
+void pc_pci_device_init(PCIBus *pci_bus)
 {
     int max_bus;
     int bus;
@@ -1007,280 +983,3 @@ static void pc_pci_device_init(PCIBus *pci_bus)
         pci_create_simple(pci_bus, -1, "lsi53c895a");
     }
 }
-
-/* PC hardware initialisation */
-static void pc_init1(ram_addr_t ram_size,
-                     const char *boot_device,
-                     const char *kernel_filename,
-                     const char *kernel_cmdline,
-                     const char *initrd_filename,
-                     const char *cpu_model,
-                     int pci_enabled)
-{
-    int i;
-    ram_addr_t below_4g_mem_size, above_4g_mem_size;
-    PCIBus *pci_bus;
-    PCII440FXState *i440fx_state;
-    int piix3_devfn = -1;
-    qemu_irq *cpu_irq;
-    qemu_irq *isa_irq;
-    qemu_irq *i8259;
-    qemu_irq *cmos_s3;
-    qemu_irq *smi_irq;
-    IsaIrqState *isa_irq_state;
-    DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
-    FDCtrl *floppy_controller;
-    RTCState *rtc_state;
-
-    pc_cpus_init(cpu_model);
-
-    vmport_init();
-
-    /* allocate ram and load rom/bios */
-    pc_memory_init(ram_size, kernel_filename, kernel_cmdline, initrd_filename,
-                   &below_4g_mem_size, &above_4g_mem_size);
-
-    cpu_irq = pc_allocate_cpu_irq();
-    i8259 = i8259_init(cpu_irq[0]);
-    isa_irq_state = qemu_mallocz(sizeof(*isa_irq_state));
-    isa_irq_state->i8259 = i8259;
-    if (pci_enabled) {
-        isa_irq_state->ioapic = ioapic_init();
-    }
-    isa_irq = qemu_allocate_irqs(isa_irq_handler, isa_irq_state, 24);
-
-    if (pci_enabled) {
-        pci_bus = i440fx_init(&i440fx_state, &piix3_devfn, isa_irq, ram_size);
-    } else {
-        pci_bus = NULL;
-        isa_bus_new(NULL);
-    }
-    isa_bus_irqs(isa_irq);
-
-    pc_register_ferr_irq(isa_reserve_irq(13));
-
-    pc_vga_init(pci_enabled? pci_bus: NULL);
-
-    /* init basic PC hardware */
-    pc_basic_device_init(isa_irq, &floppy_controller, &rtc_state);
-
-    for(i = 0; i < nb_nics; i++) {
-        NICInfo *nd = &nd_table[i];
-
-        if (!pci_enabled || (nd->model && strcmp(nd->model, "ne2k_isa") == 0))
-            pc_init_ne2k_isa(nd);
-        else
-            pci_nic_init_nofail(nd, "e1000", NULL);
-    }
-
-    if (drive_get_max_bus(IF_IDE) >= MAX_IDE_BUS) {
-        fprintf(stderr, "qemu: too many IDE bus\n");
-        exit(1);
-    }
-
-    for(i = 0; i < MAX_IDE_BUS * MAX_IDE_DEVS; i++) {
-        hd[i] = drive_get(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
-    }
-
-    if (pci_enabled) {
-        pci_piix3_ide_init(pci_bus, hd, piix3_devfn + 1);
-    } else {
-        for(i = 0; i < MAX_IDE_BUS; i++) {
-            isa_ide_init(ide_iobase[i], ide_iobase2[i], ide_irq[i],
-	                 hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]);
-        }
-    }
-
-#ifdef HAS_AUDIO
-    audio_init(pci_enabled ? pci_bus : NULL, isa_irq);
-#endif
-
-    cmos_init(below_4g_mem_size, above_4g_mem_size, boot_device, hd,
-              floppy_controller, rtc_state);
-
-    if (pci_enabled && usb_enabled) {
-        usb_uhci_piix3_init(pci_bus, piix3_devfn + 2);
-    }
-
-    if (pci_enabled && acpi_enabled) {
-        uint8_t *eeprom_buf = qemu_mallocz(8 * 256); /* XXX: make this persistent */
-        i2c_bus *smbus;
-
-        cmos_s3 = qemu_allocate_irqs(cmos_set_s3_resume, rtc_state, 1);
-        smi_irq = qemu_allocate_irqs(acpi_smi_interrupt, first_cpu, 1);
-        /* TODO: Populate SPD eeprom data.  */
-        smbus = piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100,
-                              isa_reserve_irq(9), *cmos_s3, *smi_irq,
-                              kvm_enabled());
-        for (i = 0; i < 8; i++) {
-            DeviceState *eeprom;
-            eeprom = qdev_create((BusState *)smbus, "smbus-eeprom");
-            qdev_prop_set_uint8(eeprom, "address", 0x50 + i);
-            qdev_prop_set_ptr(eeprom, "data", eeprom_buf + (i * 256));
-            qdev_init_nofail(eeprom);
-        }
-        piix4_acpi_system_hot_add_init(pci_bus);
-    }
-
-    if (i440fx_state) {
-        i440fx_init_memory_mappings(i440fx_state);
-    }
-
-    if (pci_enabled) {
-        pc_pci_device_init(pci_bus);
-    }
-}
-
-static void pc_init_pci(ram_addr_t ram_size,
-                        const char *boot_device,
-                        const char *kernel_filename,
-                        const char *kernel_cmdline,
-                        const char *initrd_filename,
-                        const char *cpu_model)
-{
-    pc_init1(ram_size, boot_device,
-             kernel_filename, kernel_cmdline,
-             initrd_filename, cpu_model, 1);
-}
-
-static void pc_init_isa(ram_addr_t ram_size,
-                        const char *boot_device,
-                        const char *kernel_filename,
-                        const char *kernel_cmdline,
-                        const char *initrd_filename,
-                        const char *cpu_model)
-{
-    if (cpu_model == NULL)
-        cpu_model = "486";
-    pc_init1(ram_size, boot_device,
-             kernel_filename, kernel_cmdline,
-             initrd_filename, cpu_model, 0);
-}
-
-static QEMUMachine pc_machine = {
-    .name = "pc-0.13",
-    .alias = "pc",
-    .desc = "Standard PC",
-    .init = pc_init_pci,
-    .max_cpus = 255,
-    .is_default = 1,
-};
-
-static QEMUMachine pc_machine_v0_12 = {
-    .name = "pc-0.12",
-    .desc = "Standard PC",
-    .init = pc_init_pci,
-    .max_cpus = 255,
-    .compat_props = (GlobalProperty[]) {
-        {
-            .driver   = "virtio-serial-pci",
-            .property = "max_nr_ports",
-            .value    = stringify(1),
-        },{
-            .driver   = "virtio-serial-pci",
-            .property = "vectors",
-            .value    = stringify(0),
-        },
-        { /* end of list */ }
-    }
-};
-
-static QEMUMachine pc_machine_v0_11 = {
-    .name = "pc-0.11",
-    .desc = "Standard PC, qemu 0.11",
-    .init = pc_init_pci,
-    .max_cpus = 255,
-    .compat_props = (GlobalProperty[]) {
-        {
-            .driver   = "virtio-blk-pci",
-            .property = "vectors",
-            .value    = stringify(0),
-        },{
-            .driver   = "virtio-serial-pci",
-            .property = "max_nr_ports",
-            .value    = stringify(1),
-        },{
-            .driver   = "virtio-serial-pci",
-            .property = "vectors",
-            .value    = stringify(0),
-        },{
-            .driver   = "ide-drive",
-            .property = "ver",
-            .value    = "0.11",
-        },{
-            .driver   = "scsi-disk",
-            .property = "ver",
-            .value    = "0.11",
-        },{
-            .driver   = "PCI",
-            .property = "rombar",
-            .value    = stringify(0),
-        },
-        { /* end of list */ }
-    }
-};
-
-static QEMUMachine pc_machine_v0_10 = {
-    .name = "pc-0.10",
-    .desc = "Standard PC, qemu 0.10",
-    .init = pc_init_pci,
-    .max_cpus = 255,
-    .compat_props = (GlobalProperty[]) {
-        {
-            .driver   = "virtio-blk-pci",
-            .property = "class",
-            .value    = stringify(PCI_CLASS_STORAGE_OTHER),
-        },{
-            .driver   = "virtio-serial-pci",
-            .property = "class",
-            .value    = stringify(PCI_CLASS_DISPLAY_OTHER),
-        },{
-            .driver   = "virtio-serial-pci",
-            .property = "max_nr_ports",
-            .value    = stringify(1),
-        },{
-            .driver   = "virtio-serial-pci",
-            .property = "vectors",
-            .value    = stringify(0),
-        },{
-            .driver   = "virtio-net-pci",
-            .property = "vectors",
-            .value    = stringify(0),
-        },{
-            .driver   = "virtio-blk-pci",
-            .property = "vectors",
-            .value    = stringify(0),
-        },{
-            .driver   = "ide-drive",
-            .property = "ver",
-            .value    = "0.10",
-        },{
-            .driver   = "scsi-disk",
-            .property = "ver",
-            .value    = "0.10",
-        },{
-            .driver   = "PCI",
-            .property = "rombar",
-            .value    = stringify(0),
-        },
-        { /* end of list */ }
-    },
-};
-
-static QEMUMachine isapc_machine = {
-    .name = "isapc",
-    .desc = "ISA-only PC",
-    .init = pc_init_isa,
-    .max_cpus = 1,
-};
-
-static void pc_machine_init(void)
-{
-    qemu_register_machine(&pc_machine);
-    qemu_register_machine(&pc_machine_v0_12);
-    qemu_register_machine(&pc_machine_v0_11);
-    qemu_register_machine(&pc_machine_v0_10);
-    qemu_register_machine(&isapc_machine);
-}
-
-machine_init(pc_machine_init);
diff --git a/hw/pc.h b/hw/pc.h
index abf02de..8cfec6c 100644
--- a/hw/pc.h
+++ b/hw/pc.h
@@ -3,6 +3,8 @@
 
 #include "qemu-common.h"
 #include "ioport.h"
+#include "isa.h"
+#include "fdc.h"
 
 /* PC-style peripherals (also used by other machines).  */
 
@@ -36,6 +38,14 @@ uint32_t pic_intack_read(PicState2 *s);
 void pic_info(Monitor *mon);
 void irq_info(Monitor *mon);
 
+/* ISA */
+typedef struct isa_irq_state {
+    qemu_irq *i8259;
+    qemu_irq *ioapic;
+} IsaIrqState;
+
+void isa_irq_handler(void *opaque, int n, int level);
+
 /* i8254.c */
 
 #define PIT_FREQ 1193182
@@ -78,6 +88,29 @@ void rtc_set_date(RTCState *s, const struct tm *tm);
 extern int fd_bootchk;
 
 void pc_register_ferr_irq(qemu_irq irq);
+void pc_cmos_set_s3_resume(void *opaque, int irq, int level);
+void pc_acpi_smi_interrupt(void *opaque, int irq, int level);
+
+void pc_cpus_init(const char *cpu_model);
+void pc_memory_init(ram_addr_t ram_size,
+                    const char *kernel_filename,
+                    const char *kernel_cmdline,
+                    const char *initrd_filename,
+                    ram_addr_t *below_4g_mem_size_p,
+                    ram_addr_t *above_4g_mem_size_p);
+qemu_irq *pc_allocate_cpu_irq(void);
+void pc_vga_init(PCIBus *pci_bus);
+void pc_basic_device_init(qemu_irq *isa_irq,
+                          FDCtrl **floppy_controller,
+                          RTCState **rtc_state);
+void pc_init_ne2k_isa(NICInfo *nd);
+#ifdef HAS_AUDIO
+void pc_audio_init (PCIBus *pci_bus, qemu_irq *pic);
+#endif
+void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
+                  const char *boot_device, DriveInfo **hd_table,
+                  FDCtrl *floppy_controller, RTCState *s);
+void pc_pci_device_init(PCIBus *pci_bus);
 
 void ioport_set_a20(int enable);
 int ioport_get_a20(void);
diff --git a/hw/pc_piix.c b/hw/pc_piix.c
new file mode 100644
index 0000000..52d8591
--- /dev/null
+++ b/hw/pc_piix.c
@@ -0,0 +1,317 @@
+/*
+ * QEMU PC System Emulator
+ *
+ * Copyright (c) 2003-2004 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include "hw.h"
+#include "pc.h"
+#include "apic.h"
+#include "pci.h"
+#include "usb-uhci.h"
+#include "usb-ohci.h"
+#include "net.h"
+#include "boards.h"
+#include "ide.h"
+#include "kvm.h"
+
+#define MAX_IDE_BUS 2
+
+static const int ide_iobase[MAX_IDE_BUS] = { 0x1f0, 0x170 };
+static const int ide_iobase2[MAX_IDE_BUS] = { 0x3f6, 0x376 };
+static const int ide_irq[MAX_IDE_BUS] = { 14, 15 };
+
+/* PC hardware initialisation */
+static void pc_init1(ram_addr_t ram_size,
+                     const char *boot_device,
+                     const char *kernel_filename,
+                     const char *kernel_cmdline,
+                     const char *initrd_filename,
+                     const char *cpu_model,
+                     int pci_enabled)
+{
+    int i;
+    ram_addr_t below_4g_mem_size, above_4g_mem_size;
+    PCIBus *pci_bus;
+    PCII440FXState *i440fx_state;
+    int piix3_devfn = -1;
+    qemu_irq *cpu_irq;
+    qemu_irq *isa_irq;
+    qemu_irq *i8259;
+    qemu_irq *cmos_s3;
+    qemu_irq *smi_irq;
+    IsaIrqState *isa_irq_state;
+    DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
+    FDCtrl *floppy_controller;
+    RTCState *rtc_state;
+
+    pc_cpus_init(cpu_model);
+
+    vmport_init();
+
+    /* allocate ram and load rom/bios */
+    pc_memory_init(ram_size, kernel_filename, kernel_cmdline, initrd_filename,
+                   &below_4g_mem_size, &above_4g_mem_size);
+
+    cpu_irq = pc_allocate_cpu_irq();
+    i8259 = i8259_init(cpu_irq[0]);
+    isa_irq_state = qemu_mallocz(sizeof(*isa_irq_state));
+    isa_irq_state->i8259 = i8259;
+    if (pci_enabled) {
+        isa_irq_state->ioapic = ioapic_init();
+    }
+    isa_irq = qemu_allocate_irqs(isa_irq_handler, isa_irq_state, 24);
+
+    if (pci_enabled) {
+        pci_bus = i440fx_init(&i440fx_state, &piix3_devfn, isa_irq, ram_size);
+    } else {
+        pci_bus = NULL;
+        isa_bus_new(NULL);
+    }
+    isa_bus_irqs(isa_irq);
+
+    pc_register_ferr_irq(isa_reserve_irq(13));
+
+    pc_vga_init(pci_enabled? pci_bus: NULL);
+
+    /* init basic PC hardware */
+    pc_basic_device_init(isa_irq, &floppy_controller, &rtc_state);
+
+    for(i = 0; i < nb_nics; i++) {
+        NICInfo *nd = &nd_table[i];
+
+        if (!pci_enabled || (nd->model && strcmp(nd->model, "ne2k_isa") == 0))
+            pc_init_ne2k_isa(nd);
+        else
+            pci_nic_init_nofail(nd, "e1000", NULL);
+    }
+
+    if (drive_get_max_bus(IF_IDE) >= MAX_IDE_BUS) {
+        fprintf(stderr, "qemu: too many IDE bus\n");
+        exit(1);
+    }
+
+    for(i = 0; i < MAX_IDE_BUS * MAX_IDE_DEVS; i++) {
+        hd[i] = drive_get(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
+    }
+
+    if (pci_enabled) {
+        pci_piix3_ide_init(pci_bus, hd, piix3_devfn + 1);
+    } else {
+        for(i = 0; i < MAX_IDE_BUS; i++) {
+            isa_ide_init(ide_iobase[i], ide_iobase2[i], ide_irq[i],
+	                 hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]);
+        }
+    }
+
+#ifdef HAS_AUDIO
+    pc_audio_init(pci_enabled ? pci_bus : NULL, isa_irq);
+#endif
+
+    pc_cmos_init(below_4g_mem_size, above_4g_mem_size, boot_device, hd,
+                 floppy_controller, rtc_state);
+
+    if (pci_enabled && usb_enabled) {
+        usb_uhci_piix3_init(pci_bus, piix3_devfn + 2);
+    }
+
+    if (pci_enabled && acpi_enabled) {
+        uint8_t *eeprom_buf = qemu_mallocz(8 * 256); /* XXX: make this persistent */
+        i2c_bus *smbus;
+
+        cmos_s3 = qemu_allocate_irqs(pc_cmos_set_s3_resume, rtc_state, 1);
+        smi_irq = qemu_allocate_irqs(pc_acpi_smi_interrupt, first_cpu, 1);
+        /* TODO: Populate SPD eeprom data.  */
+        smbus = piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100,
+                              isa_reserve_irq(9), *cmos_s3, *smi_irq,
+                              kvm_enabled());
+        for (i = 0; i < 8; i++) {
+            DeviceState *eeprom;
+            eeprom = qdev_create((BusState *)smbus, "smbus-eeprom");
+            qdev_prop_set_uint8(eeprom, "address", 0x50 + i);
+            qdev_prop_set_ptr(eeprom, "data", eeprom_buf + (i * 256));
+            qdev_init_nofail(eeprom);
+        }
+        piix4_acpi_system_hot_add_init(pci_bus);
+    }
+
+    if (i440fx_state) {
+        i440fx_init_memory_mappings(i440fx_state);
+    }
+
+    if (pci_enabled) {
+        pc_pci_device_init(pci_bus);
+    }
+}
+
+static void pc_init_pci(ram_addr_t ram_size,
+                        const char *boot_device,
+                        const char *kernel_filename,
+                        const char *kernel_cmdline,
+                        const char *initrd_filename,
+                        const char *cpu_model)
+{
+    pc_init1(ram_size, boot_device,
+             kernel_filename, kernel_cmdline,
+             initrd_filename, cpu_model, 1);
+}
+
+static void pc_init_isa(ram_addr_t ram_size,
+                        const char *boot_device,
+                        const char *kernel_filename,
+                        const char *kernel_cmdline,
+                        const char *initrd_filename,
+                        const char *cpu_model)
+{
+    if (cpu_model == NULL)
+        cpu_model = "486";
+    pc_init1(ram_size, boot_device,
+             kernel_filename, kernel_cmdline,
+             initrd_filename, cpu_model, 0);
+}
+
+static QEMUMachine pc_machine = {
+    .name = "pc-0.13",
+    .alias = "pc",
+    .desc = "Standard PC",
+    .init = pc_init_pci,
+    .max_cpus = 255,
+    .is_default = 1,
+};
+
+static QEMUMachine pc_machine_v0_12 = {
+    .name = "pc-0.12",
+    .desc = "Standard PC",
+    .init = pc_init_pci,
+    .max_cpus = 255,
+    .compat_props = (GlobalProperty[]) {
+        {
+            .driver   = "virtio-serial-pci",
+            .property = "max_nr_ports",
+            .value    = stringify(1),
+        },{
+            .driver   = "virtio-serial-pci",
+            .property = "vectors",
+            .value    = stringify(0),
+        },
+        { /* end of list */ }
+    }
+};
+
+static QEMUMachine pc_machine_v0_11 = {
+    .name = "pc-0.11",
+    .desc = "Standard PC, qemu 0.11",
+    .init = pc_init_pci,
+    .max_cpus = 255,
+    .compat_props = (GlobalProperty[]) {
+        {
+            .driver   = "virtio-blk-pci",
+            .property = "vectors",
+            .value    = stringify(0),
+        },{
+            .driver   = "virtio-serial-pci",
+            .property = "max_nr_ports",
+            .value    = stringify(1),
+        },{
+            .driver   = "virtio-serial-pci",
+            .property = "vectors",
+            .value    = stringify(0),
+        },{
+            .driver   = "ide-drive",
+            .property = "ver",
+            .value    = "0.11",
+        },{
+            .driver   = "scsi-disk",
+            .property = "ver",
+            .value    = "0.11",
+        },{
+            .driver   = "PCI",
+            .property = "rombar",
+            .value    = stringify(0),
+        },
+        { /* end of list */ }
+    }
+};
+
+static QEMUMachine pc_machine_v0_10 = {
+    .name = "pc-0.10",
+    .desc = "Standard PC, qemu 0.10",
+    .init = pc_init_pci,
+    .max_cpus = 255,
+    .compat_props = (GlobalProperty[]) {
+        {
+            .driver   = "virtio-blk-pci",
+            .property = "class",
+            .value    = stringify(PCI_CLASS_STORAGE_OTHER),
+        },{
+            .driver   = "virtio-serial-pci",
+            .property = "class",
+            .value    = stringify(PCI_CLASS_DISPLAY_OTHER),
+        },{
+            .driver   = "virtio-serial-pci",
+            .property = "max_nr_ports",
+            .value    = stringify(1),
+        },{
+            .driver   = "virtio-serial-pci",
+            .property = "vectors",
+            .value    = stringify(0),
+        },{
+            .driver   = "virtio-net-pci",
+            .property = "vectors",
+            .value    = stringify(0),
+        },{
+            .driver   = "virtio-blk-pci",
+            .property = "vectors",
+            .value    = stringify(0),
+        },{
+            .driver   = "ide-drive",
+            .property = "ver",
+            .value    = "0.10",
+        },{
+            .driver   = "scsi-disk",
+            .property = "ver",
+            .value    = "0.10",
+        },{
+            .driver   = "PCI",
+            .property = "rombar",
+            .value    = stringify(0),
+        },
+        { /* end of list */ }
+    },
+};
+
+static QEMUMachine isapc_machine = {
+    .name = "isapc",
+    .desc = "ISA-only PC",
+    .init = pc_init_isa,
+    .max_cpus = 1,
+};
+
+static void pc_machine_init(void)
+{
+    qemu_register_machine(&pc_machine);
+    qemu_register_machine(&pc_machine_v0_12);
+    qemu_register_machine(&pc_machine_v0_11);
+    qemu_register_machine(&pc_machine_v0_10);
+    qemu_register_machine(&isapc_machine);
+}
+
+machine_init(pc_machine_init);
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [Qemu-devel] [PATCH 18/26] pc: move rtc declarations from pc.h into a dedicated header file.
  2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
                   ` (16 preceding siblings ...)
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 17/26] pc: split out piix specific part from pc.c into pc_piix.c Isaku Yamahata
@ 2010-05-14  7:29 ` Isaku Yamahata
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 19/26] rtc: make rtc_xxx accept/return ISADevice instead of RTCState Isaku Yamahata
                   ` (8 subsequent siblings)
  26 siblings, 0 replies; 29+ messages in thread
From: Isaku Yamahata @ 2010-05-14  7:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, yamahata, kraxel

Move rtc_xxx declarations from pc.h into mc146818rtc.h.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/mc146818rtc.h |   10 ++++++++++
 hw/pc.h          |    9 +--------
 2 files changed, 11 insertions(+), 8 deletions(-)
 create mode 100644 hw/mc146818rtc.h

diff --git a/hw/mc146818rtc.h b/hw/mc146818rtc.h
new file mode 100644
index 0000000..7211dae
--- /dev/null
+++ b/hw/mc146818rtc.h
@@ -0,0 +1,10 @@
+#ifndef MC146818RTC_H
+#define MC146818RTC_H
+
+typedef struct RTCState RTCState;
+
+RTCState *rtc_init(int base_year);
+void rtc_set_memory(RTCState *s, int addr, int val);
+void rtc_set_date(RTCState *s, const struct tm *tm);
+
+#endif /* !MC146818RTC_H */
diff --git a/hw/pc.h b/hw/pc.h
index 8cfec6c..e3cc0a5 100644
--- a/hw/pc.h
+++ b/hw/pc.h
@@ -5,6 +5,7 @@
 #include "ioport.h"
 #include "isa.h"
 #include "fdc.h"
+#include "mc146818rtc.h"
 
 /* PC-style peripherals (also used by other machines).  */
 
@@ -76,14 +77,6 @@ void i8042_mm_init(qemu_irq kbd_irq, qemu_irq mouse_irq,
                    target_phys_addr_t base, ram_addr_t size,
                    target_phys_addr_t mask);
 
-/* mc146818rtc.c */
-
-typedef struct RTCState RTCState;
-
-RTCState *rtc_init(int base_year);
-void rtc_set_memory(RTCState *s, int addr, int val);
-void rtc_set_date(RTCState *s, const struct tm *tm);
-
 /* pc.c */
 extern int fd_bootchk;
 
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [Qemu-devel] [PATCH 19/26] rtc: make rtc_xxx accept/return ISADevice instead of RTCState.
  2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
                   ` (17 preceding siblings ...)
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 18/26] pc: move rtc declarations from pc.h into a dedicated header file Isaku Yamahata
@ 2010-05-14  7:29 ` Isaku Yamahata
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 20/26] acpi_piix4: qdevfy Isaku Yamahata
                   ` (7 subsequent siblings)
  26 siblings, 0 replies; 29+ messages in thread
From: Isaku Yamahata @ 2010-05-14  7:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, yamahata, kraxel

To match rtc_xxx with qdev, make rtc_xxx accept and return ISADevice
instead of RTCState.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/mc146818rtc.c |   26 +++++++++++++++-----------
 hw/mc146818rtc.h |    8 ++++----
 hw/mips_jazz.c   |    1 +
 hw/mips_malta.c  |    3 ++-
 hw/mips_r4k.c    |    3 ++-
 hw/pc.c          |   11 ++++++-----
 hw/pc.h          |    5 ++---
 hw/pc_piix.c     |    2 +-
 hw/ppc_prep.c    |    1 +
 9 files changed, 34 insertions(+), 26 deletions(-)

diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c
index 89a423e..cd5e0d7 100644
--- a/hw/mc146818rtc.c
+++ b/hw/mc146818rtc.c
@@ -28,6 +28,7 @@
 #include "apic.h"
 #include "isa.h"
 #include "hpet_emul.h"
+#include "mc146818rtc.h"
 
 //#define DEBUG_CMOS
 
@@ -65,7 +66,7 @@
 #define REG_C_PF   0x40
 #define REG_C_AF   0x20
 
-struct RTCState {
+typedef struct RTCState {
     ISADevice dev;
     uint8_t cmos_data[128];
     uint8_t cmos_index;
@@ -85,7 +86,7 @@ struct RTCState {
     QEMUTimer *coalesced_timer;
     QEMUTimer *second_timer;
     QEMUTimer *second_timer2;
-};
+} RTCState;
 
 static void rtc_irq_raise(qemu_irq irq)
 {
@@ -492,14 +493,16 @@ static uint32_t cmos_ioport_read(void *opaque, uint32_t addr)
     }
 }
 
-void rtc_set_memory(RTCState *s, int addr, int val)
+void rtc_set_memory(ISADevice *dev, int addr, int val)
 {
+    RTCState *s = DO_UPCAST(RTCState, dev, dev);
     if (addr >= 0 && addr <= 127)
         s->cmos_data[addr] = val;
 }
 
-void rtc_set_date(RTCState *s, const struct tm *tm)
+void rtc_set_date(ISADevice *dev, const struct tm *tm)
 {
+    RTCState *s = DO_UPCAST(RTCState, dev, dev);
     s->current_tm = *tm;
     rtc_copy_date(s);
 }
@@ -508,18 +511,19 @@ void rtc_set_date(RTCState *s, const struct tm *tm)
 #define REG_IBM_CENTURY_BYTE        0x32
 #define REG_IBM_PS2_CENTURY_BYTE    0x37
 
-static void rtc_set_date_from_host(RTCState *s)
+static void rtc_set_date_from_host(ISADevice *dev)
 {
+    RTCState *s = DO_UPCAST(RTCState, dev, dev);
     struct tm tm;
     int val;
 
     /* set the CMOS date */
     qemu_get_timedate(&tm, 0);
-    rtc_set_date(s, &tm);
+    rtc_set_date(dev, &tm);
 
     val = rtc_to_bcd(s, (tm.tm_year / 100) + 19);
-    rtc_set_memory(s, REG_IBM_CENTURY_BYTE, val);
-    rtc_set_memory(s, REG_IBM_PS2_CENTURY_BYTE, val);
+    rtc_set_memory(dev, REG_IBM_CENTURY_BYTE, val);
+    rtc_set_memory(dev, REG_IBM_PS2_CENTURY_BYTE, val);
 }
 
 static int rtc_post_load(void *opaque, int version_id)
@@ -591,7 +595,7 @@ static int rtc_initfn(ISADevice *dev)
     s->cmos_data[RTC_REG_C] = 0x00;
     s->cmos_data[RTC_REG_D] = 0x80;
 
-    rtc_set_date_from_host(s);
+    rtc_set_date_from_host(dev);
 
     s->periodic_timer = qemu_new_timer(rtc_clock, rtc_periodic_timer, s);
 #ifdef TARGET_I386
@@ -614,14 +618,14 @@ static int rtc_initfn(ISADevice *dev)
     return 0;
 }
 
-RTCState *rtc_init(int base_year)
+ISADevice *rtc_init(int base_year)
 {
     ISADevice *dev;
 
     dev = isa_create("mc146818rtc");
     qdev_prop_set_int32(&dev->qdev, "base_year", base_year);
     qdev_init_nofail(&dev->qdev);
-    return DO_UPCAST(RTCState, dev, dev);
+    return dev;
 }
 
 static ISADeviceInfo mc146818rtc_info = {
diff --git a/hw/mc146818rtc.h b/hw/mc146818rtc.h
index 7211dae..6f46a68 100644
--- a/hw/mc146818rtc.h
+++ b/hw/mc146818rtc.h
@@ -1,10 +1,10 @@
 #ifndef MC146818RTC_H
 #define MC146818RTC_H
 
-typedef struct RTCState RTCState;
+#include "isa.h"
 
-RTCState *rtc_init(int base_year);
-void rtc_set_memory(RTCState *s, int addr, int val);
-void rtc_set_date(RTCState *s, const struct tm *tm);
+ISADevice *rtc_init(int base_year);
+void rtc_set_memory(ISADevice *dev, int addr, int val);
+void rtc_set_date(ISADevice *dev, const struct tm *tm);
 
 #endif /* !MC146818RTC_H */
diff --git a/hw/mips_jazz.c b/hw/mips_jazz.c
index 5609597..6e0ec8f 100644
--- a/hw/mips_jazz.c
+++ b/hw/mips_jazz.c
@@ -35,6 +35,7 @@
 #include "esp.h"
 #include "mips-bios.h"
 #include "loader.h"
+#include "mc146818rtc.h"
 
 enum jazz_model_e
 {
diff --git a/hw/mips_malta.c b/hw/mips_malta.c
index 586c1c3..792709b 100644
--- a/hw/mips_malta.c
+++ b/hw/mips_malta.c
@@ -44,6 +44,7 @@
 #include "ide.h"
 #include "loader.h"
 #include "elf.h"
+#include "mc146818rtc.h"
 
 //#define DEBUG_BOARD_INIT
 
@@ -776,7 +777,7 @@ void mips_malta_init (ram_addr_t ram_size,
     PCIBus *pci_bus;
     ISADevice *isa_dev;
     CPUState *env;
-    RTCState *rtc_state;
+    ISADevice *rtc_state;
     FDCtrl *floppy_controller;
     MaltaFPGAState *malta_fpga;
     qemu_irq *i8259;
diff --git a/hw/mips_r4k.c b/hw/mips_r4k.c
index 0d5e2a6..f1fcfcd 100644
--- a/hw/mips_r4k.c
+++ b/hw/mips_r4k.c
@@ -21,6 +21,7 @@
 #include "ide.h"
 #include "loader.h"
 #include "elf.h"
+#include "mc146818rtc.h"
 
 #define MAX_IDE_BUS 2
 
@@ -165,7 +166,7 @@ void mips_r4k_init (ram_addr_t ram_size,
     int bios_size;
     CPUState *env;
     ResetData *reset_info;
-    RTCState *rtc_state;
+    ISADevice *rtc_state;
     int i;
     qemu_irq *i8259;
     DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
diff --git a/hw/pc.c b/hw/pc.c
index 4f65049..20dc7fd 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -34,6 +34,7 @@
 #include "loader.h"
 #include "elf.h"
 #include "multiboot.h"
+#include "mc146818rtc.h"
 
 /* output Bochs bios info messages */
 //#define DEBUG_BIOS
@@ -192,7 +193,7 @@ static int cmos_get_fd_drive_type(int fd0)
 }
 
 static void cmos_init_hd(int type_ofs, int info_ofs, BlockDriverState *hd,
-                         RTCState *s)
+                         ISADevice *s)
 {
     int cylinders, heads, sectors;
     bdrv_get_geometry_hint(hd, &cylinders, &heads, &sectors);
@@ -225,7 +226,7 @@ static int boot_device2nibble(char boot_device)
     return 0;
 }
 
-static int set_boot_dev(RTCState *s, const char *boot_device, int fd_bootchk)
+static int set_boot_dev(ISADevice *s, const char *boot_device, int fd_bootchk)
 {
 #define PC_MAX_BOOT_DEVICES 3
     int nbds, bds[3] = { 0, };
@@ -257,7 +258,7 @@ static int pc_boot_set(void *opaque, const char *boot_device)
 /* hd_table must contain 4 block drivers */
 void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
                   const char *boot_device, DriveInfo **hd_table,
-                  FDCtrl *floppy_controller, RTCState *s)
+                  FDCtrl *floppy_controller, ISADevice *s)
 {
     int val;
     int fd0, fd1, nb;
@@ -752,7 +753,7 @@ int cpu_is_bsp(CPUState *env)
    BIOS will read it and start S3 resume at POST Entry */
 void pc_cmos_set_s3_resume(void *opaque, int irq, int level)
 {
-    RTCState *s = opaque;
+    ISADevice *s = opaque;
 
     if (level) {
         rtc_set_memory(s, 0xF, 0xFE);
@@ -929,7 +930,7 @@ void pc_vga_init(PCIBus *pci_bus)
 
 void pc_basic_device_init(qemu_irq *isa_irq,
                           FDCtrl **floppy_controller,
-                          RTCState **rtc_state)
+                          ISADevice **rtc_state)
 {
     int i;
     DriveInfo *fd[MAX_FD];
diff --git a/hw/pc.h b/hw/pc.h
index e3cc0a5..2e2f4e2 100644
--- a/hw/pc.h
+++ b/hw/pc.h
@@ -5,7 +5,6 @@
 #include "ioport.h"
 #include "isa.h"
 #include "fdc.h"
-#include "mc146818rtc.h"
 
 /* PC-style peripherals (also used by other machines).  */
 
@@ -95,14 +94,14 @@ qemu_irq *pc_allocate_cpu_irq(void);
 void pc_vga_init(PCIBus *pci_bus);
 void pc_basic_device_init(qemu_irq *isa_irq,
                           FDCtrl **floppy_controller,
-                          RTCState **rtc_state);
+                          ISADevice **rtc_state);
 void pc_init_ne2k_isa(NICInfo *nd);
 #ifdef HAS_AUDIO
 void pc_audio_init (PCIBus *pci_bus, qemu_irq *pic);
 #endif
 void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
                   const char *boot_device, DriveInfo **hd_table,
-                  FDCtrl *floppy_controller, RTCState *s);
+                  FDCtrl *floppy_controller, ISADevice *s);
 void pc_pci_device_init(PCIBus *pci_bus);
 
 void ioport_set_a20(int enable);
diff --git a/hw/pc_piix.c b/hw/pc_piix.c
index 52d8591..a0ed7ad 100644
--- a/hw/pc_piix.c
+++ b/hw/pc_piix.c
@@ -61,7 +61,7 @@ static void pc_init1(ram_addr_t ram_size,
     IsaIrqState *isa_irq_state;
     DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
     FDCtrl *floppy_controller;
-    RTCState *rtc_state;
+    ISADevice *rtc_state;
 
     pc_cpus_init(cpu_model);
 
diff --git a/hw/ppc_prep.c b/hw/ppc_prep.c
index a5e25b5..09a9881 100644
--- a/hw/ppc_prep.c
+++ b/hw/ppc_prep.c
@@ -36,6 +36,7 @@
 #include "qemu-log.h"
 #include "ide.h"
 #include "loader.h"
+#include "mc146818rtc.h"
 
 //#define HARD_DEBUG_PPC_IO
 //#define DEBUG_PPC_IO
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [Qemu-devel] [PATCH 20/26] acpi_piix4: qdevfy.
  2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
                   ` (18 preceding siblings ...)
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 19/26] rtc: make rtc_xxx accept/return ISADevice instead of RTCState Isaku Yamahata
@ 2010-05-14  7:29 ` Isaku Yamahata
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 21/26] pci hotplug: add argument to pci hot plug callback Isaku Yamahata
                   ` (6 subsequent siblings)
  26 siblings, 0 replies; 29+ messages in thread
From: Isaku Yamahata @ 2010-05-14  7:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, yamahata, kraxel

qdevfy acpi_piix4.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>

---
changes v10 -> v11:
- pass DeviceState of piix4-pm to pc_smbus_init().
  Now info qtree shows smbus.
---
 hw/acpi_piix4.c |   61 +++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 46 insertions(+), 15 deletions(-)

diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c
index 1292d2b..d4f4662 100644
--- a/hw/acpi_piix4.c
+++ b/hw/acpi_piix4.c
@@ -41,6 +41,7 @@ typedef struct PIIX4PMState {
     int64_t tmr_overflow_time;
 
     PMSMBus smb;
+    uint32_t smb_io_base;
 
     qemu_irq irq;
     qemu_irq cmos_s3;
@@ -319,16 +320,11 @@ static void piix4_powerdown(void *opaque, int irq, int power_failing)
     }
 }
 
-i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
-                       qemu_irq sci_irq, qemu_irq cmos_s3, qemu_irq smi_irq,
-                       int kvm_enabled)
+static int piix4_pm_initfn(PCIDevice *dev)
 {
-    PIIX4PMState *s;
+    PIIX4PMState *s = DO_UPCAST(PIIX4PMState, dev, dev);
     uint8_t *pci_conf;
 
-    s = (PIIX4PMState *)pci_register_device(bus,
-                                         "PM", sizeof(PIIX4PMState),
-                                         devfn, NULL, pm_write_config);
     pm_state = s;
     pci_conf = s->dev.config;
     pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_INTEL);
@@ -348,7 +344,6 @@ i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
 
     register_ioport_write(ACPI_DBG_IO_ADDR, 4, 4, acpi_dbg_writel, s);
 
-    s->kvm_enabled = kvm_enabled;
     if (s->kvm_enabled) {
         /* Mark SMM as already inited to prevent SMM from running.  KVM does not
          * support SMM mode. */
@@ -362,27 +357,63 @@ i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
     pci_conf[0x67] = (serial_hds[0] != NULL ? 0x08 : 0) |
 	(serial_hds[1] != NULL ? 0x90 : 0);
 
-    pci_conf[0x90] = smb_io_base | 1;
-    pci_conf[0x91] = smb_io_base >> 8;
+    pci_conf[0x90] = s->smb_io_base | 1;
+    pci_conf[0x91] = s->smb_io_base >> 8;
     pci_conf[0xd2] = 0x09;
-    register_ioport_write(smb_io_base, 64, 1, smb_ioport_writeb, &s->smb);
-    register_ioport_read(smb_io_base, 64, 1, smb_ioport_readb, &s->smb);
+    register_ioport_write(s->smb_io_base, 64, 1, smb_ioport_writeb, &s->smb);
+    register_ioport_read(s->smb_io_base, 64, 1, smb_ioport_readb, &s->smb);
 
     s->tmr_timer = qemu_new_timer(vm_clock, pm_tmr_timer, s);
 
     qemu_system_powerdown = *qemu_allocate_irqs(piix4_powerdown, s, 1);
 
-    vmstate_register(0, &vmstate_acpi, s);
+    pm_smbus_init(&s->dev.qdev, &s->smb);
+    qemu_register_reset(piix4_reset, s);
+
+    return 0;
+}
 
-    pm_smbus_init(NULL, &s->smb);
+i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
+                       qemu_irq sci_irq, qemu_irq cmos_s3, qemu_irq smi_irq,
+                       int kvm_enabled)
+{
+    PCIDevice *dev;
+    PIIX4PMState *s;
+
+    dev = pci_create(bus, devfn, "PIIX4_PM");
+    qdev_prop_set_uint32(&dev->qdev, "smb_io_base", smb_io_base);
+
+    s = DO_UPCAST(PIIX4PMState, dev, dev);
     s->irq = sci_irq;
     s->cmos_s3 = cmos_s3;
     s->smi_irq = smi_irq;
-    qemu_register_reset(piix4_reset, s);
+    s->kvm_enabled = kvm_enabled;
+
+    qdev_init_nofail(&dev->qdev);
 
     return s->smb.smbus;
 }
 
+static PCIDeviceInfo piix4_pm_info = {
+    .qdev.name          = "PIIX4_PM",
+    .qdev.desc          = "PM",
+    .qdev.size          = sizeof(PIIX4PMState),
+    .qdev.vmsd          = &vmstate_acpi,
+    .init               = piix4_pm_initfn,
+    .config_write       = pm_write_config,
+    .qdev.props         = (Property[]) {
+        DEFINE_PROP_UINT32("smb_io_base", PIIX4PMState, smb_io_base, 0),
+        DEFINE_PROP_END_OF_LIST(),
+    }
+};
+
+static void piix4_pm_register(void)
+{
+    pci_qdev_register(&piix4_pm_info);
+}
+
+device_init(piix4_pm_register);
+
 #define GPE_BASE 0xafe0
 #define PCI_BASE 0xae00
 #define PCI_EJ_BASE 0xae08
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [Qemu-devel] [PATCH 21/26] pci hotplug: add argument to pci hot plug callback.
  2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
                   ` (19 preceding siblings ...)
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 20/26] acpi_piix4: qdevfy Isaku Yamahata
@ 2010-05-14  7:29 ` Isaku Yamahata
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 22/26] pci hotadd, acpi_piix4: remove global variables Isaku Yamahata
                   ` (5 subsequent siblings)
  26 siblings, 0 replies; 29+ messages in thread
From: Isaku Yamahata @ 2010-05-14  7:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, yamahata, kraxel

Add argument, DeviceState*, to pci hot plug callback.
The argument will be used later to remove global variable.

Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>

---
changes v10 -> v11:
- change callback argument from void* to DeviceState*.
---
 hw/acpi_piix4.c |    6 +++---
 hw/pci.c        |    8 +++++---
 hw/pci.h        |    4 ++--
 3 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c
index d4f4662..c3e71e3 100644
--- a/hw/acpi_piix4.c
+++ b/hw/acpi_piix4.c
@@ -568,7 +568,7 @@ static void pciej_write(void *opaque, uint32_t addr, uint32_t val)
 #endif
 }
 
-static int piix4_device_hotplug(PCIDevice *dev, int state);
+static int piix4_device_hotplug(DeviceState *qdev, PCIDevice *dev, int state);
 
 void piix4_acpi_system_hot_add_init(PCIBus *bus)
 {
@@ -581,7 +581,7 @@ void piix4_acpi_system_hot_add_init(PCIBus *bus)
     register_ioport_write(PCI_EJ_BASE, 4, 4, pciej_write, bus);
     register_ioport_read(PCI_EJ_BASE, 4, 4,  pciej_read, bus);
 
-    pci_bus_hotplug(bus, piix4_device_hotplug);
+    pci_bus_hotplug(bus, piix4_device_hotplug, NULL);
 }
 
 static void enable_device(struct pci_status *p, struct gpe_regs *g, int slot)
@@ -596,7 +596,7 @@ static void disable_device(struct pci_status *p, struct gpe_regs *g, int slot)
     p->down |= (1 << slot);
 }
 
-static int piix4_device_hotplug(PCIDevice *dev, int state)
+static int piix4_device_hotplug(DeviceState *qdev, PCIDevice *dev, int state)
 {
     int slot = PCI_SLOT(dev->devfn);
 
diff --git a/hw/pci.c b/hw/pci.c
index f167436..679f067 100644
--- a/hw/pci.c
+++ b/hw/pci.c
@@ -42,6 +42,7 @@ struct PCIBus {
     pci_set_irq_fn set_irq;
     pci_map_irq_fn map_irq;
     pci_hotplug_fn hotplug;
+    DeviceState *hotplug_qdev;
     void *irq_opaque;
     PCIDevice *devices[256];
     PCIDevice *parent_dev;
@@ -233,10 +234,11 @@ void pci_bus_irqs(PCIBus *bus, pci_set_irq_fn set_irq, pci_map_irq_fn map_irq,
     bus->irq_count = qemu_mallocz(nirq * sizeof(bus->irq_count[0]));
 }
 
-void pci_bus_hotplug(PCIBus *bus, pci_hotplug_fn hotplug)
+void pci_bus_hotplug(PCIBus *bus, pci_hotplug_fn hotplug, DeviceState *qdev)
 {
     bus->qbus.allow_hotplug = 1;
     bus->hotplug = hotplug;
+    bus->hotplug_qdev = qdev;
 }
 
 void pci_bus_set_mem_base(PCIBus *bus, target_phys_addr_t base)
@@ -1661,7 +1663,7 @@ static int pci_qdev_init(DeviceState *qdev, DeviceInfo *base)
     pci_add_option_rom(pci_dev);
 
     if (qdev->hotplugged)
-        bus->hotplug(pci_dev, 1);
+        bus->hotplug(bus->hotplug_qdev, pci_dev, 1);
     return 0;
 }
 
@@ -1669,7 +1671,7 @@ static int pci_unplug_device(DeviceState *qdev)
 {
     PCIDevice *dev = DO_UPCAST(PCIDevice, qdev, qdev);
 
-    dev->bus->hotplug(dev, 0);
+    dev->bus->hotplug(dev->bus->hotplug_qdev, dev, 0);
     return 0;
 }
 
diff --git a/hw/pci.h b/hw/pci.h
index 625188c..f6e6c5f 100644
--- a/hw/pci.h
+++ b/hw/pci.h
@@ -209,13 +209,13 @@ int pci_device_load(PCIDevice *s, QEMUFile *f);
 
 typedef void (*pci_set_irq_fn)(void *opaque, int irq_num, int level);
 typedef int (*pci_map_irq_fn)(PCIDevice *pci_dev, int irq_num);
-typedef int (*pci_hotplug_fn)(PCIDevice *pci_dev, int state);
+typedef int (*pci_hotplug_fn)(DeviceState *qdev, PCIDevice *pci_dev, int state);
 void pci_bus_new_inplace(PCIBus *bus, DeviceState *parent,
                          const char *name, int devfn_min);
 PCIBus *pci_bus_new(DeviceState *parent, const char *name, int devfn_min);
 void pci_bus_irqs(PCIBus *bus, pci_set_irq_fn set_irq, pci_map_irq_fn map_irq,
                   void *irq_opaque, int nirq);
-void pci_bus_hotplug(PCIBus *bus, pci_hotplug_fn hotplug);
+void pci_bus_hotplug(PCIBus *bus, pci_hotplug_fn hotplug, DeviceState *dev);
 PCIBus *pci_register_bus(DeviceState *parent, const char *name,
                          pci_set_irq_fn set_irq, pci_map_irq_fn map_irq,
                          void *irq_opaque, int devfn_min, int nirq);
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [Qemu-devel] [PATCH 22/26] pci hotadd, acpi_piix4: remove global variables
  2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
                   ` (20 preceding siblings ...)
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 21/26] pci hotplug: add argument to pci hot plug callback Isaku Yamahata
@ 2010-05-14  7:29 ` Isaku Yamahata
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 23/26] pm_smbus: remove #ifdef DEBUG Isaku Yamahata
                   ` (4 subsequent siblings)
  26 siblings, 0 replies; 29+ messages in thread
From: Isaku Yamahata @ 2010-05-14  7:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, yamahata, kraxel

remove global variables, gpe and pci0_status by moving them
into PIIX4PMState.

Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>

---
Changes v12 -> v13:
- minor style clean up

Changes v10 -> v11:
- change callback argument of hotplug from void* to DeviceState*.
---
 hw/acpi_piix4.c |   89 +++++++++++++++++++++++++++++-------------------------
 hw/pc.h         |    1 -
 hw/pc_piix.c    |    1 -
 3 files changed, 48 insertions(+), 43 deletions(-)

diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c
index c3e71e3..bb3d094 100644
--- a/hw/acpi_piix4.c
+++ b/hw/acpi_piix4.c
@@ -29,6 +29,20 @@
 
 #define ACPI_DBG_IO_ADDR  0xb044
 
+#define GPE_BASE 0xafe0
+#define PCI_BASE 0xae00
+#define PCI_EJ_BASE 0xae08
+
+struct gpe_regs {
+    uint16_t sts; /* status */
+    uint16_t en;  /* enabled */
+};
+
+struct pci_status {
+    uint32_t up;
+    uint32_t down;
+};
+
 typedef struct PIIX4PMState {
     PCIDevice dev;
     uint16_t pmsts;
@@ -47,13 +61,17 @@ typedef struct PIIX4PMState {
     qemu_irq cmos_s3;
     qemu_irq smi_irq;
     int kvm_enabled;
+
+    /* for pci hotplug */
+    struct gpe_regs gpe;
+    struct pci_status pci0_status;
 } PIIX4PMState;
 
+static void piix4_acpi_system_hot_add_init(PCIBus *bus, PIIX4PMState *s);
+
 #define ACPI_ENABLE 0xf1
 #define ACPI_DISABLE 0xf0
 
-static PIIX4PMState *pm_state;
-
 static uint32_t get_pmtmr(PIIX4PMState *s)
 {
     uint32_t d;
@@ -325,7 +343,6 @@ static int piix4_pm_initfn(PCIDevice *dev)
     PIIX4PMState *s = DO_UPCAST(PIIX4PMState, dev, dev);
     uint8_t *pci_conf;
 
-    pm_state = s;
     pci_conf = s->dev.config;
     pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_INTEL);
     pci_config_set_device_id(pci_conf, PCI_DEVICE_ID_INTEL_82371AB_3);
@@ -369,6 +386,7 @@ static int piix4_pm_initfn(PCIDevice *dev)
 
     pm_smbus_init(&s->dev.qdev, &s->smb);
     qemu_register_reset(piix4_reset, s);
+    piix4_acpi_system_hot_add_init(dev->bus, s);
 
     return 0;
 }
@@ -414,23 +432,6 @@ static void piix4_pm_register(void)
 
 device_init(piix4_pm_register);
 
-#define GPE_BASE 0xafe0
-#define PCI_BASE 0xae00
-#define PCI_EJ_BASE 0xae08
-
-struct gpe_regs {
-    uint16_t sts; /* status */
-    uint16_t en;  /* enabled */
-};
-
-struct pci_status {
-    uint32_t up;
-    uint32_t down;
-};
-
-static struct gpe_regs gpe;
-static struct pci_status pci0_status;
-
 static uint32_t gpe_read_val(uint16_t val, uint32_t addr)
 {
     if (addr & 1)
@@ -570,45 +571,51 @@ static void pciej_write(void *opaque, uint32_t addr, uint32_t val)
 
 static int piix4_device_hotplug(DeviceState *qdev, PCIDevice *dev, int state);
 
-void piix4_acpi_system_hot_add_init(PCIBus *bus)
+static void piix4_acpi_system_hot_add_init(PCIBus *bus, PIIX4PMState *s)
 {
-    register_ioport_write(GPE_BASE, 4, 1, gpe_writeb, &gpe);
-    register_ioport_read(GPE_BASE, 4, 1,  gpe_readb, &gpe);
+    struct gpe_regs *gpe = &s->gpe;
+    struct pci_status *pci0_status = &s->pci0_status;
 
-    register_ioport_write(PCI_BASE, 8, 4, pcihotplug_write, &pci0_status);
-    register_ioport_read(PCI_BASE, 8, 4,  pcihotplug_read, &pci0_status);
+    register_ioport_write(GPE_BASE, 4, 1, gpe_writeb, gpe);
+    register_ioport_read(GPE_BASE, 4, 1,  gpe_readb, gpe);
+
+    register_ioport_write(PCI_BASE, 8, 4, pcihotplug_write, pci0_status);
+    register_ioport_read(PCI_BASE, 8, 4,  pcihotplug_read, pci0_status);
 
     register_ioport_write(PCI_EJ_BASE, 4, 4, pciej_write, bus);
     register_ioport_read(PCI_EJ_BASE, 4, 4,  pciej_read, bus);
 
-    pci_bus_hotplug(bus, piix4_device_hotplug, NULL);
+    pci_bus_hotplug(bus, piix4_device_hotplug, &s->dev.qdev);
 }
 
-static void enable_device(struct pci_status *p, struct gpe_regs *g, int slot)
+static void enable_device(PIIX4PMState *s, int slot)
 {
-    g->sts |= 2;
-    p->up |= (1 << slot);
+    s->gpe.sts |= 2;
+    s->pci0_status.up |= (1 << slot);
 }
 
-static void disable_device(struct pci_status *p, struct gpe_regs *g, int slot)
+static void disable_device(PIIX4PMState *s, int slot)
 {
-    g->sts |= 2;
-    p->down |= (1 << slot);
+    s->gpe.sts |= 2;
+    s->pci0_status.down |= (1 << slot);
 }
 
 static int piix4_device_hotplug(DeviceState *qdev, PCIDevice *dev, int state)
 {
     int slot = PCI_SLOT(dev->devfn);
+    PIIX4PMState *s = DO_UPCAST(PIIX4PMState, dev,
+                                DO_UPCAST(PCIDevice, qdev, qdev));
 
-    pci0_status.up = 0;
-    pci0_status.down = 0;
-    if (state)
-        enable_device(&pci0_status, &gpe, slot);
-    else
-        disable_device(&pci0_status, &gpe, slot);
-    if (gpe.en & 2) {
-        qemu_set_irq(pm_state->irq, 1);
-        qemu_set_irq(pm_state->irq, 0);
+    s->pci0_status.up = 0;
+    s->pci0_status.down = 0;
+    if (state) {
+        enable_device(s, slot);
+    } else {
+        disable_device(s, slot);
+    }
+    if (s->gpe.en & 2) {
+        qemu_set_irq(s->irq, 1);
+        qemu_set_irq(s->irq, 0);
     }
     return 0;
 }
diff --git a/hw/pc.h b/hw/pc.h
index 2e2f4e2..654b7b3 100644
--- a/hw/pc.h
+++ b/hw/pc.h
@@ -124,7 +124,6 @@ i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
                        qemu_irq sci_irq, qemu_irq cmos_s3, qemu_irq smi_irq,
                        int kvm_enabled);
 void piix4_smbus_register_device(SMBusDevice *dev, uint8_t addr);
-void piix4_acpi_system_hot_add_init(PCIBus *bus);
 
 /* hpet.c */
 extern int no_hpet;
diff --git a/hw/pc_piix.c b/hw/pc_piix.c
index a0ed7ad..70f563a 100644
--- a/hw/pc_piix.c
+++ b/hw/pc_piix.c
@@ -150,7 +150,6 @@ static void pc_init1(ram_addr_t ram_size,
             qdev_prop_set_ptr(eeprom, "data", eeprom_buf + (i * 256));
             qdev_init_nofail(eeprom);
         }
-        piix4_acpi_system_hot_add_init(pci_bus);
     }
 
     if (i440fx_state) {
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [Qemu-devel] [PATCH 23/26] pm_smbus: remove #ifdef DEBUG.
  2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
                   ` (21 preceding siblings ...)
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 22/26] pci hotadd, acpi_piix4: remove global variables Isaku Yamahata
@ 2010-05-14  7:29 ` Isaku Yamahata
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 24/26] acpi_piix4: " Isaku Yamahata
                   ` (3 subsequent siblings)
  26 siblings, 0 replies; 29+ messages in thread
From: Isaku Yamahata @ 2010-05-14  7:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, yamahata, kraxel

remove #ifdef DEBUG by using macro.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/pm_smbus.c |   21 ++++++++++++---------
 1 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/hw/pm_smbus.c b/hw/pm_smbus.c
index 6ef6b9e..9929d72 100644
--- a/hw/pm_smbus.c
+++ b/hw/pm_smbus.c
@@ -37,6 +37,15 @@
 #define SMBHSTDAT1      0x06
 #define SMBBLKDAT       0x07
 
+//#define DEBUG
+
+#ifdef DEBUG
+# define SMBUS_DPRINTF(format, ...)     printf(format, ## __VA_ARGS__)
+#else
+# define SMBUS_DPRINTF(format, ...)     do { } while (0)
+#endif
+
+
 static void smb_transaction(PMSMBus *s)
 {
     uint8_t prot = (s->smb_ctl >> 2) & 0x07;
@@ -45,9 +54,7 @@ static void smb_transaction(PMSMBus *s)
     uint8_t addr = s->smb_addr >> 1;
     i2c_bus *bus = s->smbus;
 
-#ifdef DEBUG
-    printf("SMBus trans addr=0x%02x prot=0x%02x\n", addr, prot);
-#endif
+    SMBUS_DPRINTF("SMBus trans addr=0x%02x prot=0x%02x\n", addr, prot);
     switch(prot) {
     case 0x0:
         smbus_quick_command(bus, addr, read);
@@ -96,9 +103,7 @@ void smb_ioport_writeb(void *opaque, uint32_t addr, uint32_t val)
 {
     PMSMBus *s = opaque;
     addr &= 0x3f;
-#ifdef DEBUG
-    printf("SMB writeb port=0x%04x val=0x%02x\n", addr, val);
-#endif
+    SMBUS_DPRINTF("SMB writeb port=0x%04x val=0x%02x\n", addr, val);
     switch(addr) {
     case SMBHSTSTS:
         s->smb_stat = 0;
@@ -166,9 +171,7 @@ uint32_t smb_ioport_readb(void *opaque, uint32_t addr)
         val = 0;
         break;
     }
-#ifdef DEBUG
-    printf("SMB readb port=0x%04x val=0x%02x\n", addr, val);
-#endif
+    SMBUS_DPRINTF("SMB readb port=0x%04x val=0x%02x\n", addr, val);
     return val;
 }
 
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [Qemu-devel] [PATCH 24/26] acpi_piix4: remove #ifdef DEBUG.
  2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
                   ` (22 preceding siblings ...)
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 23/26] pm_smbus: remove #ifdef DEBUG Isaku Yamahata
@ 2010-05-14  7:29 ` Isaku Yamahata
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 25/26] apm: " Isaku Yamahata
                   ` (2 subsequent siblings)
  26 siblings, 0 replies; 29+ messages in thread
From: Isaku Yamahata @ 2010-05-14  7:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, yamahata, kraxel

removed #ifdef DEBUG by using macro.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/acpi_piix4.c |   55 ++++++++++++++++++-------------------------------------
 1 files changed, 18 insertions(+), 37 deletions(-)

diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c
index bb3d094..fdef697 100644
--- a/hw/acpi_piix4.c
+++ b/hw/acpi_piix4.c
@@ -27,6 +27,12 @@
 
 //#define DEBUG
 
+#ifdef DEBUG
+# define PIIX4_DPRINTF(format, ...)     printf(format, ## __VA_ARGS__)
+#else
+# define PIIX4_DPRINTF(format, ...)     do { } while (0)
+#endif
+
 #define ACPI_DBG_IO_ADDR  0xb044
 
 #define GPE_BASE 0xafe0
@@ -172,9 +178,7 @@ static void pm_ioport_writew(void *opaque, uint32_t addr, uint32_t val)
     default:
         break;
     }
-#ifdef DEBUG
-    printf("PM writew port=0x%04x val=0x%04x\n", addr, val);
-#endif
+    PIIX4_DPRINTF("PM writew port=0x%04x val=0x%04x\n", addr, val);
 }
 
 static uint32_t pm_ioport_readw(void *opaque, uint32_t addr)
@@ -197,19 +201,14 @@ static uint32_t pm_ioport_readw(void *opaque, uint32_t addr)
         val = 0;
         break;
     }
-#ifdef DEBUG
-    printf("PM readw port=0x%04x val=0x%04x\n", addr, val);
-#endif
+    PIIX4_DPRINTF("PM readw port=0x%04x val=0x%04x\n", addr, val);
     return val;
 }
 
 static void pm_ioport_writel(void *opaque, uint32_t addr, uint32_t val)
 {
     //    PIIX4PMState *s = opaque;
-#ifdef DEBUG
-    addr &= 0x3f;
-    printf("PM writel port=0x%04x val=0x%08x\n", addr, val);
-#endif
+    PIIX4_DPRINTF("PM writel port=0x%04x val=0x%08x\n", addr & 0x3f, val);
 }
 
 static uint32_t pm_ioport_readl(void *opaque, uint32_t addr)
@@ -226,9 +225,7 @@ static uint32_t pm_ioport_readl(void *opaque, uint32_t addr)
         val = 0;
         break;
     }
-#ifdef DEBUG
-    printf("PM readl port=0x%04x val=0x%08x\n", addr, val);
-#endif
+    PIIX4_DPRINTF("PM readl port=0x%04x val=0x%08x\n", addr, val);
     return val;
 }
 
@@ -252,9 +249,7 @@ static void apm_ctrl_changed(uint32_t val, void *arg)
 
 static void acpi_dbg_writel(void *opaque, uint32_t addr, uint32_t val)
 {
-#if defined(DEBUG)
-    printf("ACPI: DBG: 0x%08x\n", val);
-#endif
+    PIIX4_DPRINTF("ACPI: DBG: 0x%08x\n", val);
 }
 
 static void pm_io_space_update(PIIX4PMState *s)
@@ -266,9 +261,7 @@ static void pm_io_space_update(PIIX4PMState *s)
         pm_io_base &= 0xffc0;
 
         /* XXX: need to improve memory and ioport allocation */
-#if defined(DEBUG)
-        printf("PM: mapping to 0x%x\n", pm_io_base);
-#endif
+        PIIX4_DPRINTF("PM: mapping to 0x%x\n", pm_io_base);
         register_ioport_write(pm_io_base, 64, 2, pm_ioport_writew, s);
         register_ioport_read(pm_io_base, 64, 2, pm_ioport_readw, s);
         register_ioport_write(pm_io_base, 64, 4, pm_ioport_writel, s);
@@ -456,9 +449,7 @@ static uint32_t gpe_readb(void *opaque, uint32_t addr)
             break;
     }
 
-#if defined(DEBUG)
-    printf("gpe read %x == %x\n", addr, val);
-#endif
+    PIIX4_DPRINTF("gpe read %x == %x\n", addr, val);
     return val;
 }
 
@@ -498,9 +489,7 @@ static void gpe_writeb(void *opaque, uint32_t addr, uint32_t val)
             break;
    }
 
-#if defined(DEBUG)
-    printf("gpe write %x <== %d\n", addr, val);
-#endif
+    PIIX4_DPRINTF("gpe write %x <== %d\n", addr, val);
 }
 
 static uint32_t pcihotplug_read(void *opaque, uint32_t addr)
@@ -518,9 +507,7 @@ static uint32_t pcihotplug_read(void *opaque, uint32_t addr)
             break;
     }
 
-#if defined(DEBUG)
-    printf("pcihotplug read %x == %x\n", addr, val);
-#endif
+    PIIX4_DPRINTF("pcihotplug read %x == %x\n", addr, val);
     return val;
 }
 
@@ -536,16 +523,12 @@ static void pcihotplug_write(void *opaque, uint32_t addr, uint32_t val)
             break;
    }
 
-#if defined(DEBUG)
-    printf("pcihotplug write %x <== %d\n", addr, val);
-#endif
+    PIIX4_DPRINTF("pcihotplug write %x <== %d\n", addr, val);
 }
 
 static uint32_t pciej_read(void *opaque, uint32_t addr)
 {
-#if defined(DEBUG)
-    printf("pciej read %x\n", addr);
-#endif
+    PIIX4_DPRINTF("pciej read %x\n", addr);
     return 0;
 }
 
@@ -564,9 +547,7 @@ static void pciej_write(void *opaque, uint32_t addr, uint32_t val)
     }
 
 
-#if defined(DEBUG)
-    printf("pciej write %x <== %d\n", addr, val);
-#endif
+    PIIX4_DPRINTF("pciej write %x <== %d\n", addr, val);
 }
 
 static int piix4_device_hotplug(DeviceState *qdev, PCIDevice *dev, int state);
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [Qemu-devel] [PATCH 25/26] apm: remove #ifdef DEBUG.
  2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
                   ` (23 preceding siblings ...)
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 24/26] acpi_piix4: " Isaku Yamahata
@ 2010-05-14  7:29 ` Isaku Yamahata
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 26/26] mc146818rtc: remove #ifdef DEBUG_CMOS Isaku Yamahata
  2010-05-15 17:02 ` [Qemu-devel] Re: [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Blue Swirl
  26 siblings, 0 replies; 29+ messages in thread
From: Isaku Yamahata @ 2010-05-14  7:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, yamahata, kraxel

remove #ifdef DEBUG by using macro.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/apm.c |   14 ++++++++------
 1 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/hw/apm.c b/hw/apm.c
index d20db3d..3cbde43 100644
--- a/hw/apm.c
+++ b/hw/apm.c
@@ -23,6 +23,12 @@
 
 //#define DEBUG
 
+#ifdef DEBUG
+# define APM_DPRINTF(format, ...)       printf(format, ## __VA_ARGS__)
+#else
+# define APM_DPRINTF(format, ...)       do { } while (0)
+#endif
+
 /* fixed I/O location */
 #define APM_CNT_IOPORT  0xb2
 #define APM_STS_IOPORT  0xb3
@@ -31,9 +37,7 @@ static void apm_ioport_writeb(void *opaque, uint32_t addr, uint32_t val)
 {
     APMState *apm = opaque;
     addr &= 1;
-#ifdef DEBUG
-    printf("apm_ioport_writeb addr=0x%x val=0x%02x\n", addr, val);
-#endif
+    APM_DPRINTF("apm_ioport_writeb addr=0x%x val=0x%02x\n", addr, val);
     if (addr == 0) {
         apm->apmc = val;
 
@@ -56,9 +60,7 @@ static uint32_t apm_ioport_readb(void *opaque, uint32_t addr)
     } else {
         val = apm->apms;
     }
-#ifdef DEBUG
-    printf("apm_ioport_readb addr=0x%x val=0x%02x\n", addr, val);
-#endif
+    APM_DPRINTF("apm_ioport_readb addr=0x%x val=0x%02x\n", addr, val);
     return val;
 }
 
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [Qemu-devel] [PATCH 26/26] mc146818rtc: remove #ifdef DEBUG_CMOS.
  2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
                   ` (24 preceding siblings ...)
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 25/26] apm: " Isaku Yamahata
@ 2010-05-14  7:29 ` Isaku Yamahata
  2010-05-15 17:02 ` [Qemu-devel] Re: [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Blue Swirl
  26 siblings, 0 replies; 29+ messages in thread
From: Isaku Yamahata @ 2010-05-14  7:29 UTC (permalink / raw)
  To: qemu-devel; +Cc: blauwirbel, yamahata, kraxel

remove #ifdef DEBUG_CMOS by using macro.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/mc146818rtc.c |   18 ++++++++++--------
 1 files changed, 10 insertions(+), 8 deletions(-)

diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c
index cd5e0d7..bf648e5 100644
--- a/hw/mc146818rtc.c
+++ b/hw/mc146818rtc.c
@@ -32,6 +32,12 @@
 
 //#define DEBUG_CMOS
 
+#ifdef DEBUG_CMOS
+# define CMOS_DPRINTF(format, ...)      printf(format, ## __VA_ARGS__)
+#else
+# define CMOS_DPRINTF(format, ...)      do { } while (0)
+#endif
+
 #define RTC_REINJECT_ON_ACK_COUNT 20
 
 #define RTC_SECONDS             0
@@ -211,10 +217,8 @@ static void cmos_ioport_write(void *opaque, uint32_t addr, uint32_t data)
     if ((addr & 1) == 0) {
         s->cmos_index = data & 0x7f;
     } else {
-#ifdef DEBUG_CMOS
-        printf("cmos: write index=0x%02x val=0x%02x\n",
-               s->cmos_index, data);
-#endif
+        CMOS_DPRINTF("cmos: write index=0x%02x val=0x%02x\n",
+                     s->cmos_index, data);
         switch(s->cmos_index) {
         case RTC_SECONDS_ALARM:
         case RTC_MINUTES_ALARM:
@@ -485,10 +489,8 @@ static uint32_t cmos_ioport_read(void *opaque, uint32_t addr)
             ret = s->cmos_data[s->cmos_index];
             break;
         }
-#ifdef DEBUG_CMOS
-        printf("cmos: read index=0x%02x val=0x%02x\n",
-               s->cmos_index, ret);
-#endif
+        CMOS_DPRINTF("cmos: read index=0x%02x val=0x%02x\n",
+                     s->cmos_index, ret);
         return ret;
     }
 }
-- 
1.6.6.1

^ permalink raw reply related	[flat|nested] 29+ messages in thread

* [Qemu-devel] Re: [PATCH 00/26] split out piix specific part from pc emulator and some clean ups
  2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
                   ` (25 preceding siblings ...)
  2010-05-14  7:29 ` [Qemu-devel] [PATCH 26/26] mc146818rtc: remove #ifdef DEBUG_CMOS Isaku Yamahata
@ 2010-05-15 17:02 ` Blue Swirl
  2010-05-17 11:18   ` Markus Armbruster
  26 siblings, 1 reply; 29+ messages in thread
From: Blue Swirl @ 2010-05-15 17:02 UTC (permalink / raw)
  To: Isaku Yamahata; +Cc: qemu-devel, kraxel

Thanks, applied all.

On 5/14/10, Isaku Yamahata <yamahata@valinux.co.jp> wrote:
> patch series description:
>  This patch series is for spliting out piix specific part from pc emulator
>  to make it easier to implement other pc chipset emulator.
>
>  I observed that make was confused not to rebuild files sometimes due to
>  splitting up a file into files. It results in duplicated/undefined symbols.
>  In that case, 'make clean;make' will fix it.
>
>
>  Blue, your patches were combied into 21/26, and 22/26. Please check it.
>  Your patches to acpi.c had some issues. I fixed them in this patch series.
>
>  1/2 acpi: remove static pm_state:
>   The first argument, dev, of piix4_device_hotplug() is not
>   PIIX4PMState device, but hot plugged device.
>   So the container_of() doesn't make sense.
>  2/2 acpi: remove static gpe and pci0_status variables
>   The call back argument to pge_readb(), gpe_writeb() is struct gpe_regs.
>   Not PIIX4PMState.
>   The callback argument pcihotplug_read(), pcihotplug_write() is
>   struct pci_status. Not PIIX4PMState.
>   Those argument type is void*, so compiler didn't catch it.
>
>  thanks,
>
>  Changes from V12:
>  - 2/26 acpi: split out apm register emulation from acpi.c
>   The patch originally convert CMOS S3 code to qemu_irq. However
>   the conversion is already done by Blue Swirl. So the patch was simplified.
>  - 22/26 pci hotadd, acpi_piix4: remove global variables
>   Minor style fix according to Blue's patch.
>  - rebased to 5acd0646b6033d40ef5d0ae06338cc354108f640
>
>  Changes from V11:
>  - s/pc_smbus/pm_smbus/g, s/pc_apm/apm/g and so on
>   because it isn't pc specifc. mips also uses it.
>  - No logic changes.
>
>  Changes from V10:
>  - pass DeviceState* to pc_smbus_init(), now info qtree shows smbus.
>  - change pci hotplug argument from void * to DeviceState*.
>
>  Changes from V9:
>  - rebased 502e64fe23f19c086d42f6178cdda19e58996080
>  - use qemu_irq to remove global variables, rtc_state
>  - make rtc_xxx functions accept/return ISADevice and related clean ups
>  - pci hot plug clean up
>  - removed #ifdef DEBUG patches.
>
>
>  Changes from V8:
>  - make rtc_xxx functions accept/return ISADevice.
>  - move up ioapic initalization patch.
>  - fixed up copyright notice.
>
>  Changes from V7:
>  - rebased to fe0d61231eb6be6a83c54f4a2795f924ee963f8f
>
>  Changes from v6:
>  - rebased to 731c54f86988d3f28268f184fabfe9b2a32fb5d3
>
>  Changes from v5:
>  - rebased 0.11.0-rc0
>  - changed qemu_system_powerdown_register() to call
>   qemu_system_shutdown_request() if qemu_system_shutdown() is called before
>   registering.
>
>  Changes from v4:
>  - fix version number.
>  - rebased anthony's staging tree whose latest change set is
>   62969268f876c547ee64da6d60e0f363e0f1df75
>
>  Changes from v3:
>  - move qemu_system_powerdown() in vl.c and more generic
>   following the comment by Marcelo Tosatti <mtosatti@redhat.com>
>   acpi.c: make qemu_system_powerdown() piix independent.
>  - define cmos_set_s3_resume_init() and cmos_set_s3_resume() in pc.c
>   even if TARGET_I386 isn't defined following th ecommit by
>   Paolo Bonzini <bonzini@gnu.org>
>   pc.c: remove a global variable, RTCState *rtc_state.
>  - minor compilation fixes
>
>  Changes from v2:
>  - clean up pc_pci_device_init() not to use unnecessary braces.
>
>  Changes from v1:
>  - make patches full bisectable
>  - typo s/allocte/allocate/
>  - some minor fixes
>  - dropped a merged patch
>
>  Isaku Yamahata (26):
>   acpi: split out piix4 smbus routines from acpi.c into pm_smbus.c
>   acpi: split out apm register emulation from acpi.c
>   acpi: add acpi constants from linux header files and use them.
>   acpi: split acpi.c into the common part and the piix4 part.
>   pc: initialize ioapic before use.
>   pc, i440fx: Make smm enable/disable function i440fx independent.
>   pc: make an unnecessary global variable, pit, local.
>   pc: remove a global variable, floppy_controller.
>   pc: remove global variable rtc_state by using qemu_irq.
>   pc: introduce a function to allocate cpu irq.
>   pc: make pc_init1() not refer ferr_irq directly.
>   pc: split out cpu initialization from pc_init1() into pc_cpus_init().
>   pc: split out memory allocation from pc_init1() into pc_memory_init()
>   pc: split out vga initialization from pc_init1() into pc_vga_init().
>   pc: split out basic device init from pc_init1() into
>     pc_basic_device_init()
>   pc: split out pci device init from pc_init1() into
>     pc_pci_device_init()
>   pc: split out piix specific part from pc.c into pc_piix.c
>   pc: move rtc declarations from pc.h into a dedicated header file.
>   rtc: make rtc_xxx accept/return ISADevice instead of RTCState.
>   acpi_piix4: qdevfy.
>   pci hotplug: add argument to pci hot plug callback.
>   pci hotadd, acpi_piix4: remove global variables
>   pm_smbus: remove #ifdef DEBUG.
>   acpi_piix4: remove #ifdef DEBUG.
>   apm: remove #ifdef DEBUG.
>   mc146818rtc: remove #ifdef DEBUG_CMOS.
>
>   Makefile.target  |    2 +
>   hw/acpi.c        |  743 +-----------------------------------------------------
>   hw/acpi.h        |   78 ++++++
>   hw/acpi_piix4.c  |  602 +++++++++++++++++++++++++++++++++++++++++++
>   hw/apm.c         |   87 +++++++
>   hw/apm.h         |   22 ++
>   hw/fdc.h         |    5 +
>   hw/mc146818rtc.c |   44 ++--
>   hw/mc146818rtc.h |   10 +
>   hw/mips_jazz.c   |    1 +
>   hw/mips_malta.c  |    3 +-
>   hw/mips_r4k.c    |    3 +-
>   hw/pc.c          |  423 +++++++------------------------
>   hw/pc.h          |   48 +++-
>   hw/pc_piix.c     |  316 +++++++++++++++++++++++
>   hw/pci.c         |    8 +-
>   hw/pci.h         |    4 +-
>   hw/piix_pci.c    |    5 +-
>   hw/pm_smbus.c    |  181 +++++++++++++
>   hw/pm_smbus.h    |   21 ++
>   hw/ppc_prep.c    |    1 +
>   21 files changed, 1500 insertions(+), 1107 deletions(-)
>   create mode 100644 hw/acpi.h
>   create mode 100644 hw/acpi_piix4.c
>   create mode 100644 hw/apm.c
>   create mode 100644 hw/apm.h
>   create mode 100644 hw/mc146818rtc.h
>   create mode 100644 hw/pc_piix.c
>   create mode 100644 hw/pm_smbus.c
>   create mode 100644 hw/pm_smbus.h
>
>

^ permalink raw reply	[flat|nested] 29+ messages in thread

* Re: [Qemu-devel] Re: [PATCH 00/26] split out piix specific part from pc emulator and some clean ups
  2010-05-15 17:02 ` [Qemu-devel] Re: [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Blue Swirl
@ 2010-05-17 11:18   ` Markus Armbruster
  0 siblings, 0 replies; 29+ messages in thread
From: Markus Armbruster @ 2010-05-17 11:18 UTC (permalink / raw)
  To: Blue Swirl; +Cc: Isaku Yamahata, qemu-devel, kraxel

Blue Swirl <blauwirbel@gmail.com> writes:

> Thanks, applied all.

Thanks indeed!  13 versions and I-don't-remember-how-many months, must
have taxed your patience.

^ permalink raw reply	[flat|nested] 29+ messages in thread

end of thread, other threads:[~2010-05-17 11:26 UTC | newest]

Thread overview: 29+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-05-14  7:28 [Qemu-devel] [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Isaku Yamahata
2010-05-14  7:28 ` [Qemu-devel] [PATCH 01/26] acpi: split out piix4 smbus routines from acpi.c into pm_smbus.c Isaku Yamahata
2010-05-14  7:29 ` [Qemu-devel] [PATCH 02/26] acpi: split out apm register emulation from acpi.c Isaku Yamahata
2010-05-14  7:29 ` [Qemu-devel] [PATCH 03/26] acpi: add acpi constants from linux header files and use them Isaku Yamahata
2010-05-14  7:29 ` [Qemu-devel] [PATCH 04/26] acpi: split acpi.c into the common part and the piix4 part Isaku Yamahata
2010-05-14  7:29 ` [Qemu-devel] [PATCH 05/26] pc: initialize ioapic before use Isaku Yamahata
2010-05-14  7:29 ` [Qemu-devel] [PATCH 06/26] pc, i440fx: Make smm enable/disable function i440fx independent Isaku Yamahata
2010-05-14  7:29 ` [Qemu-devel] [PATCH 07/26] pc: make an unnecessary global variable, pit, local Isaku Yamahata
2010-05-14  7:29 ` [Qemu-devel] [PATCH 08/26] pc: remove a global variable, floppy_controller Isaku Yamahata
2010-05-14  7:29 ` [Qemu-devel] [PATCH 09/26] pc: remove global variable rtc_state by using qemu_irq Isaku Yamahata
2010-05-14  7:29 ` [Qemu-devel] [PATCH 10/26] pc: introduce a function to allocate cpu irq Isaku Yamahata
2010-05-14  7:29 ` [Qemu-devel] [PATCH 11/26] pc: make pc_init1() not refer ferr_irq directly Isaku Yamahata
2010-05-14  7:29 ` [Qemu-devel] [PATCH 12/26] pc: split out cpu initialization from pc_init1() into pc_cpus_init() Isaku Yamahata
2010-05-14  7:29 ` [Qemu-devel] [PATCH 13/26] pc: split out memory allocation from pc_init1() into pc_memory_init() Isaku Yamahata
2010-05-14  7:29 ` [Qemu-devel] [PATCH 14/26] pc: split out vga initialization from pc_init1() into pc_vga_init() Isaku Yamahata
2010-05-14  7:29 ` [Qemu-devel] [PATCH 15/26] pc: split out basic device init from pc_init1() into pc_basic_device_init() Isaku Yamahata
2010-05-14  7:29 ` [Qemu-devel] [PATCH 16/26] pc: split out pci device init from pc_init1() into pc_pci_device_init() Isaku Yamahata
2010-05-14  7:29 ` [Qemu-devel] [PATCH 17/26] pc: split out piix specific part from pc.c into pc_piix.c Isaku Yamahata
2010-05-14  7:29 ` [Qemu-devel] [PATCH 18/26] pc: move rtc declarations from pc.h into a dedicated header file Isaku Yamahata
2010-05-14  7:29 ` [Qemu-devel] [PATCH 19/26] rtc: make rtc_xxx accept/return ISADevice instead of RTCState Isaku Yamahata
2010-05-14  7:29 ` [Qemu-devel] [PATCH 20/26] acpi_piix4: qdevfy Isaku Yamahata
2010-05-14  7:29 ` [Qemu-devel] [PATCH 21/26] pci hotplug: add argument to pci hot plug callback Isaku Yamahata
2010-05-14  7:29 ` [Qemu-devel] [PATCH 22/26] pci hotadd, acpi_piix4: remove global variables Isaku Yamahata
2010-05-14  7:29 ` [Qemu-devel] [PATCH 23/26] pm_smbus: remove #ifdef DEBUG Isaku Yamahata
2010-05-14  7:29 ` [Qemu-devel] [PATCH 24/26] acpi_piix4: " Isaku Yamahata
2010-05-14  7:29 ` [Qemu-devel] [PATCH 25/26] apm: " Isaku Yamahata
2010-05-14  7:29 ` [Qemu-devel] [PATCH 26/26] mc146818rtc: remove #ifdef DEBUG_CMOS Isaku Yamahata
2010-05-15 17:02 ` [Qemu-devel] Re: [PATCH 00/26] split out piix specific part from pc emulator and some clean ups Blue Swirl
2010-05-17 11:18   ` Markus Armbruster

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).