]> git.proxmox.com Git - qemu.git/commitdiff
Merge remote branch 'qemu-kvm/uq/master' into staging
authorAnthony Liguori <aliguori@us.ibm.com>
Wed, 16 Feb 2011 14:47:07 +0000 (08:47 -0600)
committerAnthony Liguori <aliguori@us.ibm.com>
Wed, 16 Feb 2011 14:47:07 +0000 (08:47 -0600)
cpus.c
hw/apic.c
hw/mainstone.c
hw/mainstone.h [deleted file]
hw/mst_fpga.c
slirp/mbuf.c
target-ppc/translate_init.c

diff --git a/cpus.c b/cpus.c
index 468544cc3ab47353a3900ccb121615f7abbc9bc6..0f339459a59700e49faa3b4453279e19dfc2441c 100644 (file)
--- a/cpus.c
+++ b/cpus.c
@@ -691,8 +691,10 @@ int qemu_init_main_loop(void)
         return ret;
     }
 
-    qemu_cond_init(&qemu_pause_cond);
+    qemu_cond_init(&qemu_cpu_cond);
     qemu_cond_init(&qemu_system_cond);
+    qemu_cond_init(&qemu_pause_cond);
+    qemu_cond_init(&qemu_work_cond);
     qemu_mutex_init(&qemu_fair_mutex);
     qemu_mutex_init(&qemu_global_mutex);
     qemu_mutex_lock(&qemu_global_mutex);
index 2f8376a307670c795079f9bb6305ca3d44a3517c..218d1bb6da060ee34b87fc6811cf585f469c1722 100644 (file)
--- a/hw/apic.c
+++ b/hw/apic.c
@@ -372,19 +372,36 @@ static int apic_get_arb_pri(APICState *s)
     return 0;
 }
 
-/* signal the CPU if an irq is pending */
-static void apic_update_irq(APICState *s)
+
+/*
+ * <0 - low prio interrupt,
+ * 0  - no interrupt,
+ * >0 - interrupt number
+ */
+static int apic_irq_pending(APICState *s)
 {
     int irrv, ppr;
-    if (!(s->spurious_vec & APIC_SV_ENABLE))
-        return;
     irrv = get_highest_priority_int(s->irr);
-    if (irrv < 0)
-        return;
+    if (irrv < 0) {
+        return 0;
+    }
     ppr = apic_get_ppr(s);
-    if (ppr && (irrv & 0xf0) <= (ppr & 0xf0))
+    if (ppr && (irrv & 0xf0) <= (ppr & 0xf0)) {
+        return -1;
+    }
+
+    return irrv;
+}
+
+/* signal the CPU if an irq is pending */
+static void apic_update_irq(APICState *s)
+{
+    if (!(s->spurious_vec & APIC_SV_ENABLE)) {
         return;
-    cpu_interrupt(s->cpu_env, CPU_INTERRUPT_HARD);
+    }
+    if (apic_irq_pending(s) > 0) {
+        cpu_interrupt(s->cpu_env, CPU_INTERRUPT_HARD);
+    }
 }
 
 void apic_reset_irq_delivered(void)
@@ -590,12 +607,13 @@ int apic_get_interrupt(DeviceState *d)
     if (!(s->spurious_vec & APIC_SV_ENABLE))
         return -1;
 
-    /* XXX: spurious IRQ handling */
-    intno = get_highest_priority_int(s->irr);
-    if (intno < 0)
+    intno = apic_irq_pending(s);
+
+    if (intno == 0) {
         return -1;
-    if (s->tpr && intno <= s->tpr)
+    } else if (intno < 0) {
         return s->spurious_vec & 0xff;
+    }
     reset_bit(s->irr, intno);
     set_bit(s->isr, intno);
     apic_update_irq(s);
index 18d1415e4de5b6b50e824a5fee06d8fe3fba0073..aec8d34b4f259c37ec8df3f11f4e7fcd7354347d 100644 (file)
 #include "net.h"
 #include "devices.h"
 #include "boards.h"
-#include "mainstone.h"
 #include "sysemu.h"
 #include "flash.h"
 #include "blockdev.h"
+#include "sysbus.h"
+
+/* Device addresses */
+#define MST_FPGA_PHYS  0x08000000
+#define MST_ETH_PHYS   0x10000300
+#define MST_FLASH_0            0x00000000
+#define MST_FLASH_1            0x04000000
+
+/* IRQ definitions */
+#define MMC_IRQ       0
+#define USIM_IRQ      1
+#define USBC_IRQ      2
+#define ETHERNET_IRQ  3
+#define AC97_IRQ      4
+#define PEN_IRQ       5
+#define MSINS_IRQ     6
+#define EXBRD_IRQ     7
+#define S0_CD_IRQ     9
+#define S0_STSCHG_IRQ 10
+#define S0_IRQ        11
+#define S1_CD_IRQ     13
+#define S1_STSCHG_IRQ 14
+#define S1_IRQ        15
 
 static struct keymap map[0xE0] = {
     [0 ... 0xDF] = { -1, -1 },
@@ -77,7 +99,7 @@ static void mainstone_common_init(ram_addr_t ram_size,
     uint32_t sector_len = 256 * 1024;
     target_phys_addr_t mainstone_flash_base[] = { MST_FLASH_0, MST_FLASH_1 };
     PXA2xxState *cpu;
-    qemu_irq *mst_irq;
+    DeviceState *mst_irq;
     DriveInfo *dinfo;
     int i;
     int be;
@@ -117,16 +139,18 @@ static void mainstone_common_init(ram_addr_t ram_size,
         }
     }
 
-    mst_irq = mst_irq_init(MST_FPGA_PHYS, cpu->pic[PXA2XX_PIC_GPIO_0]);
+    mst_irq = sysbus_create_simple("mainstone-fpga", MST_FPGA_PHYS,
+                    cpu->pic[PXA2XX_PIC_GPIO_0]);
 
     /* setup keypad */
     printf("map addr %p\n", &map);
     pxa27x_register_keypad(cpu->kp, map, 0xe0);
 
     /* MMC/SD host */
-    pxa2xx_mmci_handlers(cpu->mmc, NULL, mst_irq[MMC_IRQ]);
+    pxa2xx_mmci_handlers(cpu->mmc, NULL, qdev_get_gpio_in(mst_irq, MMC_IRQ));
 
-    smc91c111_init(&nd_table[0], MST_ETH_PHYS, mst_irq[ETHERNET_IRQ]);
+    smc91c111_init(&nd_table[0], MST_ETH_PHYS,
+                    qdev_get_gpio_in(mst_irq, ETHERNET_IRQ));
 
     mainstone_binfo.kernel_filename = kernel_filename;
     mainstone_binfo.kernel_cmdline = kernel_cmdline;
diff --git a/hw/mainstone.h b/hw/mainstone.h
deleted file mode 100644 (file)
index 35329f1..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * PXA270-based Intel Mainstone platforms.
- *
- * Copyright (c) 2007 by Armin Kuster <akuster@kama-aina.net> or
- *                                    <akuster@mvista.com>
- *
- * This code is licensed under the GNU GPL v2.
- */
-
-#ifndef __MAINSTONE_H__
-#define __MAINSTONE_H__
-
-/* Device addresses */
-#define MST_FPGA_PHYS  0x08000000
-#define MST_ETH_PHYS   0x10000300
-#define MST_FLASH_0            0x00000000
-#define MST_FLASH_1            0x04000000
-
-/* IRQ definitions */
-#define MMC_IRQ       0
-#define USIM_IRQ      1
-#define USBC_IRQ      2
-#define ETHERNET_IRQ  3
-#define AC97_IRQ      4
-#define PEN_IRQ       5
-#define MSINS_IRQ     6
-#define EXBRD_IRQ     7
-#define S0_CD_IRQ     9
-#define S0_STSCHG_IRQ 10
-#define S0_IRQ        11
-#define S1_CD_IRQ     13
-#define S1_STSCHG_IRQ 14
-#define S1_IRQ        15
-
-extern qemu_irq
-*mst_irq_init(uint32_t base, qemu_irq irq);
-
-#endif /* __MAINSTONE_H__ */
index 93c65143db6d2e97fce4b39377894e414a983590..afed2acd44bb620c29f3981ed0004dbac59b8097 100644 (file)
@@ -8,7 +8,7 @@
  * This code is licensed under the GNU GPL v2.
  */
 #include "hw.h"
-#include "mainstone.h"
+#include "sysbus.h"
 
 /* Mainstone FPGA for extern irqs */
 #define FPGA_GPIO_PIN  0
@@ -27,8 +27,9 @@
 #define MST_PCMCIA1            0xe4
 
 typedef struct mst_irq_state{
+       SysBusDevice busdev;
+
        qemu_irq parent;
-       qemu_irq *pins;
 
        uint32_t prev_level;
        uint32_t leddat1;
@@ -45,34 +46,22 @@ typedef struct mst_irq_state{
        uint32_t pcmcia1;
 }mst_irq_state;
 
-static void
-mst_fpga_update_gpio(mst_irq_state *s)
-{
-       uint32_t level, diff;
-       int bit;
-       level = s->prev_level ^ s->intsetclr;
-
-       for (diff = s->prev_level ^ level; diff; diff ^= 1 << bit) {
-               bit = ffs(diff) - 1;
-               qemu_set_irq(s->pins[bit], (level >> bit) & 1 );
-       }
-       s->prev_level = level;
-}
-
 static void
 mst_fpga_set_irq(void *opaque, int irq, int level)
 {
        mst_irq_state *s = (mst_irq_state *)opaque;
+       uint32_t oldint = s->intsetclr;
 
        if (level)
                s->prev_level |= 1u << irq;
        else
                s->prev_level &= ~(1u << irq);
 
-       if(s->intmskena & (1u << irq)) {
-               s->intsetclr = 1u << irq;
-               qemu_set_irq(s->parent, level);
-       }
+       if ((s->intmskena & (1u << irq)) && level)
+               s->intsetclr |= 1u << irq;
+
+       if (oldint != (s->intsetclr & s->intmskena))
+               qemu_set_irq(s->parent, s->intsetclr & s->intmskena);
 }
 
 
@@ -146,10 +135,11 @@ mst_fpga_writeb(void *opaque, target_phys_addr_t addr, uint32_t value)
                break;
        case MST_INTMSKENA:     /* Mask interupt */
                s->intmskena = (value & 0xFEEFF);
-               mst_fpga_update_gpio(s);
+               qemu_set_irq(s->parent, s->intsetclr & s->intmskena);
                break;
        case MST_INTSETCLR:     /* clear or set interrupt */
                s->intsetclr = (value & 0xFEEFF);
+               qemu_set_irq(s->parent, s->intsetclr);
                break;
        case MST_PCMCIA0:
                s->pcmcia0 = value;
@@ -174,66 +164,67 @@ static CPUWriteMemoryFunc * const mst_fpga_writefn[] = {
        mst_fpga_writeb,
 };
 
-static void
-mst_fpga_save(QEMUFile *f, void *opaque)
-{
-       struct mst_irq_state *s = (mst_irq_state *) opaque;
-
-       qemu_put_be32s(f, &s->prev_level);
-       qemu_put_be32s(f, &s->leddat1);
-       qemu_put_be32s(f, &s->leddat2);
-       qemu_put_be32s(f, &s->ledctrl);
-       qemu_put_be32s(f, &s->gpswr);
-       qemu_put_be32s(f, &s->mscwr1);
-       qemu_put_be32s(f, &s->mscwr2);
-       qemu_put_be32s(f, &s->mscwr3);
-       qemu_put_be32s(f, &s->mscrd);
-       qemu_put_be32s(f, &s->intmskena);
-       qemu_put_be32s(f, &s->intsetclr);
-       qemu_put_be32s(f, &s->pcmcia0);
-       qemu_put_be32s(f, &s->pcmcia1);
-}
 
-static int
-mst_fpga_load(QEMUFile *f, void *opaque, int version_id)
+static int mst_fpga_post_load(void *opaque, int version_id)
 {
        mst_irq_state *s = (mst_irq_state *) opaque;
 
-       qemu_get_be32s(f, &s->prev_level);
-       qemu_get_be32s(f, &s->leddat1);
-       qemu_get_be32s(f, &s->leddat2);
-       qemu_get_be32s(f, &s->ledctrl);
-       qemu_get_be32s(f, &s->gpswr);
-       qemu_get_be32s(f, &s->mscwr1);
-       qemu_get_be32s(f, &s->mscwr2);
-       qemu_get_be32s(f, &s->mscwr3);
-       qemu_get_be32s(f, &s->mscrd);
-       qemu_get_be32s(f, &s->intmskena);
-       qemu_get_be32s(f, &s->intsetclr);
-       qemu_get_be32s(f, &s->pcmcia0);
-       qemu_get_be32s(f, &s->pcmcia1);
+       qemu_set_irq(s->parent, s->intsetclr & s->intmskena);
        return 0;
 }
 
-qemu_irq *mst_irq_init(uint32_t base, qemu_irq irq)
+static int mst_fpga_init(SysBusDevice *dev)
 {
        mst_irq_state *s;
        int iomemtype;
-       qemu_irq *qi;
 
-       s = (mst_irq_state  *)
-               qemu_mallocz(sizeof(mst_irq_state));
+       s = FROM_SYSBUS(mst_irq_state, dev);
 
-       s->parent = irq;
+       sysbus_init_irq(dev, &s->parent);
 
        /* alloc the external 16 irqs */
-       qi  = qemu_allocate_irqs(mst_fpga_set_irq, s, MST_NUM_IRQS);
-       s->pins = qi;
+       qdev_init_gpio_in(&dev->qdev, mst_fpga_set_irq, MST_NUM_IRQS);
 
        iomemtype = cpu_register_io_memory(mst_fpga_readfn,
                mst_fpga_writefn, s, DEVICE_NATIVE_ENDIAN);
-       cpu_register_physical_memory(base, 0x00100000, iomemtype);
-       register_savevm(NULL, "mainstone_fpga", 0, 0, mst_fpga_save,
-                        mst_fpga_load, s);
-       return qi;
+       sysbus_init_mmio(dev, 0x00100000, iomemtype);
+       return 0;
+}
+
+static VMStateDescription vmstate_mst_fpga_regs = {
+       .name = "mainstone_fpga",
+       .version_id = 0,
+       .minimum_version_id = 0,
+       .minimum_version_id_old = 0,
+       .post_load = mst_fpga_post_load,
+       .fields = (VMStateField []) {
+               VMSTATE_UINT32(prev_level, mst_irq_state),
+               VMSTATE_UINT32(leddat1, mst_irq_state),
+               VMSTATE_UINT32(leddat2, mst_irq_state),
+               VMSTATE_UINT32(ledctrl, mst_irq_state),
+               VMSTATE_UINT32(gpswr, mst_irq_state),
+               VMSTATE_UINT32(mscwr1, mst_irq_state),
+               VMSTATE_UINT32(mscwr2, mst_irq_state),
+               VMSTATE_UINT32(mscwr3, mst_irq_state),
+               VMSTATE_UINT32(mscrd, mst_irq_state),
+               VMSTATE_UINT32(intmskena, mst_irq_state),
+               VMSTATE_UINT32(intsetclr, mst_irq_state),
+               VMSTATE_UINT32(pcmcia0, mst_irq_state),
+               VMSTATE_UINT32(pcmcia1, mst_irq_state),
+               VMSTATE_END_OF_LIST(),
+       },
+};
+
+static SysBusDeviceInfo mst_fpga_info = {
+       .init = mst_fpga_init,
+       .qdev.name = "mainstone-fpga",
+       .qdev.desc = "Mainstone II FPGA",
+       .qdev.size = sizeof(mst_irq_state),
+       .qdev.vmsd = &vmstate_mst_fpga_regs,
+};
+
+static void mst_fpga_register(void)
+{
+       sysbus_register_withprop(&mst_fpga_info);
 }
+device_init(mst_fpga_register);
index 87508ba013189e4af90b10bc0188f433111af447..ce2eb843f565dd2c7c53cc024111d892e73ad67b 100644 (file)
@@ -23,7 +23,7 @@
  * Find a nice value for msize
  * XXX if_maxlinkhdr already in mtu
  */
-#define SLIRP_MSIZE (IF_MTU + IF_MAXLINKHDR + sizeof(struct m_hdr ) + 6)
+#define SLIRP_MSIZE (IF_MTU + IF_MAXLINKHDR + offsetof(struct mbuf, m_dat) + 6)
 
 void
 m_init(Slirp *slirp)
@@ -65,7 +65,7 @@ m_get(Slirp *slirp)
        m->m_flags = (flags | M_USEDLIST);
 
        /* Initialise it */
-       m->m_size = SLIRP_MSIZE - sizeof(struct m_hdr);
+       m->m_size = SLIRP_MSIZE - offsetof(struct mbuf, m_dat);
        m->m_data = m->m_dat;
        m->m_len = 0;
         m->m_nextpkt = NULL;
index dfcd94980f85eba9bd07093914af2920ba05befb..7c08b1cb0904c2708fa5476ce8394887d23d29fb 100644 (file)
@@ -154,12 +154,26 @@ static void spr_read_ureg (void *opaque, int gprn, int sprn)
 #if !defined(CONFIG_USER_ONLY)
 static void spr_read_decr (void *opaque, int gprn, int sprn)
 {
+    if (use_icount) {
+        gen_io_start();
+    }
     gen_helper_load_decr(cpu_gpr[gprn]);
+    if (use_icount) {
+        gen_io_end();
+        gen_stop_exception(opaque);
+    }
 }
 
 static void spr_write_decr (void *opaque, int sprn, int gprn)
 {
+    if (use_icount) {
+        gen_io_start();
+    }
     gen_helper_store_decr(cpu_gpr[gprn]);
+    if (use_icount) {
+        gen_io_end();
+        gen_stop_exception(opaque);
+    }
 }
 #endif
 
@@ -167,12 +181,26 @@ static void spr_write_decr (void *opaque, int sprn, int gprn)
 /* Time base */
 static void spr_read_tbl (void *opaque, int gprn, int sprn)
 {
+    if (use_icount) {
+        gen_io_start();
+    }
     gen_helper_load_tbl(cpu_gpr[gprn]);
+    if (use_icount) {
+        gen_io_end();
+        gen_stop_exception(opaque);
+    }
 }
 
 static void spr_read_tbu (void *opaque, int gprn, int sprn)
 {
+    if (use_icount) {
+        gen_io_start();
+    }
     gen_helper_load_tbu(cpu_gpr[gprn]);
+    if (use_icount) {
+        gen_io_end();
+        gen_stop_exception(opaque);
+    }
 }
 
 __attribute__ (( unused ))
@@ -190,12 +218,26 @@ static void spr_read_atbu (void *opaque, int gprn, int sprn)
 #if !defined(CONFIG_USER_ONLY)
 static void spr_write_tbl (void *opaque, int sprn, int gprn)
 {
+    if (use_icount) {
+        gen_io_start();
+    }
     gen_helper_store_tbl(cpu_gpr[gprn]);
+    if (use_icount) {
+        gen_io_end();
+        gen_stop_exception(opaque);
+    }
 }
 
 static void spr_write_tbu (void *opaque, int sprn, int gprn)
 {
+    if (use_icount) {
+        gen_io_start();
+    }
     gen_helper_store_tbu(cpu_gpr[gprn]);
+    if (use_icount) {
+        gen_io_end();
+        gen_stop_exception(opaque);
+    }
 }
 
 __attribute__ (( unused ))