[qemu patches] Update patches upto changeset 14986:1ddaf2650633.

Signed-off-by: Christian Limpach <Christian.Limpach@xensource.com>
This commit is contained in:
Christian Limpach committed 2007-05-03 15:39:45 +01:00
1 parent 0d03dd60a1
commit 9d604d2ead
68 files changed
+3765 -1306

No files matched your search

+6 -7
View File
@@ -1,7 +1,7 @@
Index: ioemu/hw/piix4acpi.c
===================================================================
--- ioemu.orig/hw/piix4acpi.c 2006-08-17 19:50:05.060576667 +0100
+++ ioemu/hw/piix4acpi.c 2006-08-17 19:50:07.563300039 +0100
--- ioemu.orig/hw/piix4acpi.c 2007-05-02 15:59:27.000000000 +0100
+++ ioemu/hw/piix4acpi.c 2007-05-02 16:02:29.000000000 +0100
@@ -45,6 +45,10 @@
#define GBL_RLS (1 << 2)
#define SLP_EN (1 << 13)
@@ -13,23 +13,22 @@ Index: ioemu/hw/piix4acpi.c
typedef struct AcpiDeviceState AcpiDeviceState;
AcpiDeviceState *acpi_device_table;
@@ -190,7 +194,14 @@
s->pm1_control = (val<<8)||(s->pm1_control);
@@ -81,7 +85,13 @@
s->pm1_control = (s->pm1_control & 0xff) | (val << 8);
/* printf("acpiPm1ControlP1_writeb \n addr %x val:%x\n", addr, val); */
-}
+ // Check for power off request
+
+ val <<= 8;
+ if (((val & SLP_EN) != 0) &&
+ ((val & SLP_TYP_MASK) == SLP_VAL)) {
+ s->pm1_timer=0x0; //clear ACPI timer
+ qemu_system_shutdown_request();
+ }
+}
static uint32_t acpiPm1ControlP1_readb(void *opaque, uint32_t addr)
{
@@ -257,7 +268,14 @@
@@ -105,7 +115,14 @@
s->pm1_control = val;
/* printf("acpiPm1Control_writew \n addr %x val:%x\n", addr, val); */
+39 -249
View File
@@ -1,7 +1,7 @@
Index: ioemu/Makefile.target
===================================================================
--- ioemu.orig/Makefile.target 2006-12-08 02:00:40.000000000 +0000
+++ ioemu/Makefile.target 2006-12-08 02:00:40.000000000 +0000
--- ioemu.orig/Makefile.target 2007-05-03 15:06:42.000000000 +0100
+++ ioemu/Makefile.target 2007-05-03 15:07:21.000000000 +0100
@@ -358,6 +358,7 @@
VL_OBJS+= fdc.o mc146818rtc.o serial.o pc.o
VL_OBJS+= cirrus_vga.o mixeng.o parallel.o acpi.o piix_pci.o
@@ -12,11 +12,11 @@ Index: ioemu/Makefile.target
ifeq ($(TARGET_BASE_ARCH), ppc)
Index: ioemu/hw/pc.c
===================================================================
--- ioemu.orig/hw/pc.c 2006-12-08 02:00:40.000000000 +0000
+++ ioemu/hw/pc.c 2006-12-08 02:00:40.000000000 +0000
@@ -874,13 +874,19 @@
--- ioemu.orig/hw/pc.c 2007-05-03 15:06:42.000000000 +0100
+++ ioemu/hw/pc.c 2007-05-03 15:07:21.000000000 +0100
@@ -873,13 +873,19 @@
cmos_init(ram_size, boot_device, bs_table, timeoffset);
cmos_init(ram_size, boot_device, bs_table);
+ /* using PIIX4 acpi model */
+ if (pci_enabled && acpi_enabled)
@@ -35,7 +35,7 @@ Index: ioemu/hw/pc.c
#if 0
/* ??? Need to figure out some way for the user to
@@ -903,8 +909,10 @@
@@ -902,8 +908,10 @@
/* XXX: should be done in the Bochs BIOS */
if (pci_enabled) {
pci_bios_init();
@@ -49,8 +49,8 @@ Index: ioemu/hw/pc.c
Index: ioemu/hw/piix4acpi.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ ioemu/hw/piix4acpi.c 2006-12-08 02:00:40.000000000 +0000
@@ -0,0 +1,396 @@
+++ ioemu/hw/piix4acpi.c 2007-05-03 15:07:31.000000000 +0100
@@ -0,0 +1,186 @@
+/*
+ * PIIX4 ACPI controller emulation
+ *
@@ -101,23 +101,11 @@ Index: ioemu/hw/piix4acpi.c
+typedef struct AcpiDeviceState AcpiDeviceState;
+AcpiDeviceState *acpi_device_table;
+
+/* Bits of PM1a register define here */
+typedef struct PM1Event_BLK {
+ uint16_t pm1_status; /* pm1a_EVT_BLK */
+ uint16_t pm1_enable; /* pm1a_EVT_BLK+2 */
+}PM1Event_BLK;
+
+typedef struct PCIAcpiState {
+ PCIDevice dev;
+ uint16_t irq;
+ uint16_t pm1_status; /* pm1a_EVT_BLK */
+ uint16_t pm1_enable; /* pm1a_EVT_BLK+2 */
+ uint16_t pm1_control; /* pm1a_ECNT_BLK */
+ uint32_t pm1_timer; /* pmtmr_BLK */
+} PCIAcpiState;
+
+static PCIAcpiState *acpi_state;
+
+static inline void acpi_set_irq(PCIAcpiState *s)
+{
+/* no real SCI event need for now, so comment the following line out */
@@ -125,108 +113,11 @@ Index: ioemu/hw/piix4acpi.c
+ printf("acpi_set_irq: s->irq %x \n",s->irq);
+}
+
+static void acpi_reset(PCIAcpiState *s)
+{
+ uint8_t *pci_conf;
+ pci_conf = s->dev.config;
+
+ pci_conf[0x42] = 0x00;
+ pci_conf[0x43] = 0x00;
+ s->irq = 9;
+ s->pm1_status = 0;
+ s->pm1_enable = 0x00; /* TMROF_EN should cleared */
+ s->pm1_control = SCI_EN; /* SCI_EN */
+ s->pm1_timer = 0;
+}
+
+/*byte access */
+static void acpiPm1Status_writeb(void *opaque, uint32_t addr, uint32_t val)
+{
+ PCIAcpiState *s = opaque;
+
+ if ((val&TMROF_STS)==TMROF_STS)
+ s->pm1_status = s->pm1_status&!TMROF_STS;
+
+ if ((val&GBL_STS)==GBL_STS)
+ s->pm1_status = s->pm1_status&!GBL_STS;
+
+/* printf("acpiPm1Status_writeb \n addr %x val:%x pm1_status:%x \n", addr, val,s->pm1_status); */
+}
+
+static uint32_t acpiPm1Status_readb(void *opaque, uint32_t addr)
+{
+ PCIAcpiState *s = opaque;
+ uint32_t val;
+
+ val = s->pm1_status;
+/* printf("acpiPm1Status_readb \n addr %x val:%x\n", addr, val); */
+
+ return val;
+}
+
+static void acpiPm1StatusP1_writeb(void *opaque, uint32_t addr, uint32_t val)
+{
+ PCIAcpiState *s = opaque;
+
+ s->pm1_status = (val<<8)||(s->pm1_status);
+/* printf("acpiPm1StatusP1_writeb \n addr %x val:%x\n", addr, val); */
+}
+
+static uint32_t acpiPm1StatusP1_readb(void *opaque, uint32_t addr)
+{
+ PCIAcpiState *s = opaque;
+ uint32_t val;
+
+ val = (s->pm1_status)>>8;
+ printf("acpiPm1StatusP1_readb \n addr %x val:%x\n", addr, val);
+
+ return val;
+}
+
+static void acpiPm1Enable_writeb(void *opaque, uint32_t addr, uint32_t val)
+{
+ PCIAcpiState *s = opaque;
+
+ s->pm1_enable = val;
+/* printf("acpiPm1Enable_writeb \n addr %x val:%x\n", addr, val); */
+}
+
+static uint32_t acpiPm1Enable_readb(void *opaque, uint32_t addr)
+{
+ PCIAcpiState *s = opaque;
+ uint32_t val;
+
+ val = (s->pm1_enable)||0x1;
+/* printf("acpiPm1Enable_readb \n addr %x val:%x\n", addr, val); */
+
+ return val;
+}
+
+static void acpiPm1EnableP1_writeb(void *opaque, uint32_t addr, uint32_t val)
+{
+ PCIAcpiState *s = opaque;
+
+ s->pm1_enable = (val<<8)||(s->pm1_enable);
+/* printf("acpiPm1EnableP1_writeb \n addr %x val:%x\n", addr, val); */
+
+}
+
+static uint32_t acpiPm1EnableP1_readb(void *opaque, uint32_t addr)
+{
+ PCIAcpiState *s = opaque;
+ uint32_t val;
+
+ val = (s->pm1_enable)>>8;
+/* printf("acpiPm1EnableP1_readb \n addr %x val:%x\n", addr, val); */
+
+ return val;
+}
+
+static void acpiPm1Control_writeb(void *opaque, uint32_t addr, uint32_t val)
+{
+ PCIAcpiState *s = opaque;
+
+ s->pm1_control = val;
+ s->pm1_control = (s->pm1_control & 0xff00) | (val & 0xff);
+/* printf("acpiPm1Control_writeb \n addr %x val:%x\n", addr, val); */
+
+}
@@ -236,7 +127,8 @@ Index: ioemu/hw/piix4acpi.c
+ PCIAcpiState *s = opaque;
+ uint32_t val;
+
+ val = s->pm1_control;
+ /* Mask out the write-only bits */
+ val = s->pm1_control & ~(GBL_RLS|SLP_EN) & 0xff;
+/* printf("acpiPm1Control_readb \n addr %x val:%x\n", addr, val); */
+
+ return val;
@@ -246,7 +138,7 @@ Index: ioemu/hw/piix4acpi.c
+{
+ PCIAcpiState *s = opaque;
+
+ s->pm1_control = (val<<8)||(s->pm1_control);
+ s->pm1_control = (s->pm1_control & 0xff) | (val << 8);
+/* printf("acpiPm1ControlP1_writeb \n addr %x val:%x\n", addr, val); */
+
+}
@@ -256,7 +148,8 @@ Index: ioemu/hw/piix4acpi.c
+ PCIAcpiState *s = opaque;
+ uint32_t val;
+
+ val = (s->pm1_control)>>8;
+ /* Mask out the write-only bits */
+ val = (s->pm1_control & ~(GBL_RLS|SLP_EN)) >> 8;
+/* printf("acpiPm1ControlP1_readb \n addr %x val:%x\n", addr, val); */
+
+ return val;
@@ -265,50 +158,6 @@ Index: ioemu/hw/piix4acpi.c
+
+/* word access */
+
+static void acpiPm1Status_writew(void *opaque, uint32_t addr, uint32_t val)
+{
+ PCIAcpiState *s = opaque;
+
+ if ((val&TMROF_STS)==TMROF_STS)
+ s->pm1_status = s->pm1_status&!TMROF_STS;
+
+ if ((val&GBL_STS)==GBL_STS)
+ s->pm1_status = s->pm1_status&!GBL_STS;
+
+/* printf("acpiPm1Status_writew \n addr %x val:%x pm1_status:%x \n", addr, val,s->pm1_status); */
+}
+
+static uint32_t acpiPm1Status_readw(void *opaque, uint32_t addr)
+{
+ PCIAcpiState *s = opaque;
+ uint32_t val;
+
+ val = s->pm1_status;
+/* printf("acpiPm1Status_readw \n addr %x val:%x\n", addr, val); */
+
+ return val;
+}
+
+static void acpiPm1Enable_writew(void *opaque, uint32_t addr, uint32_t val)
+{
+ PCIAcpiState *s = opaque;
+
+ s->pm1_enable = val;
+/* printf("acpiPm1Enable_writew \n addr %x val:%x\n", addr, val); */
+
+}
+
+static uint32_t acpiPm1Enable_readw(void *opaque, uint32_t addr)
+{
+ PCIAcpiState *s = opaque;
+ uint32_t val;
+
+ val = s->pm1_enable;
+/* printf("acpiPm1Enable_readw \n addr %x val:%x\n", addr, val); */
+
+ return val;
+}
+
+static void acpiPm1Control_writew(void *opaque, uint32_t addr, uint32_t val)
+{
+ PCIAcpiState *s = opaque;
@@ -323,50 +172,13 @@ Index: ioemu/hw/piix4acpi.c
+ PCIAcpiState *s = opaque;
+ uint32_t val;
+
+ val = s->pm1_control;
+ /* Mask out the write-only bits */
+ val = s->pm1_control & ~(GBL_RLS|SLP_EN);
+/* printf("acpiPm1Control_readw \n addr %x val:%x\n", addr, val); */
+
+ return val;
+}
+
+/* dword access */
+
+static void acpiPm1Event_writel(void *opaque, uint32_t addr, uint32_t val)
+{
+ PCIAcpiState *s = opaque;
+
+ s->pm1_status = val;
+ s->pm1_enable = val>>16;
+/* printf("acpiPm1Event_writel \n addr %x val:%x \n", addr, val); */
+
+}
+
+static void acpiPm1Event_readl(void *opaque, uint32_t addr)
+{
+ PCIAcpiState *s = opaque;
+ uint32_t val;
+
+ val=s->pm1_status|(s->pm1_enable<<16);
+/* printf("acpiPm1Event_readl \n addr %x val:%x\n", addr, val); */
+}
+
+static void acpiPm1Timer_writel(void *opaque, uint32_t addr, uint32_t val)
+{
+ PCIAcpiState *s = opaque;
+
+ s->pm1_timer = val;
+/* printf("acpiPm1Timer_writel \n addr %x val:%x\n", addr, val); */
+}
+
+static uint32_t acpiPm1Timer_readl(void *opaque, uint32_t addr)
+{
+ PCIAcpiState *s = opaque;
+ uint32_t val;
+
+ val = s->pm1_timer;
+/* printf("acpiPm1Timer_readl \n addr %x val:%x\n", addr, val); */
+ return val;
+}
+
+static void acpi_map(PCIDevice *pci_dev, int region_num,
+ uint32_t addr, uint32_t size, int type)
@@ -376,39 +188,15 @@ Index: ioemu/hw/piix4acpi.c
+ printf("register acpi io \n");
+
+ /* Byte access */
+ register_ioport_write(addr, 1, 1, acpiPm1Status_writeb, d);
+ register_ioport_read(addr, 1, 1, acpiPm1Status_readb, d);
+ register_ioport_write(addr+1, 1, 1, acpiPm1StatusP1_writeb, d);
+ register_ioport_read(addr+1, 1, 1, acpiPm1StatusP1_readb, d);
+
+ register_ioport_write(addr + 2, 1, 1, acpiPm1Enable_writeb, d);
+ register_ioport_read(addr + 2, 1, 1, acpiPm1Enable_readb, d);
+ register_ioport_write(addr + 2 +1, 1, 1, acpiPm1EnableP1_writeb, d);
+ register_ioport_read(addr + 2 +1, 1, 1, acpiPm1EnableP1_readb, d);
+
+ register_ioport_write(addr + 4, 1, 1, acpiPm1Control_writeb, d);
+ register_ioport_read(addr + 4, 1, 1, acpiPm1Control_readb, d);
+ register_ioport_write(addr + 4 + 1, 1, 1, acpiPm1ControlP1_writeb, d);
+ register_ioport_read(addr + 4 +1, 1, 1, acpiPm1ControlP1_readb, d);
+ register_ioport_read(addr + 4 +1, 1, 1, acpiPm1ControlP1_readb, d);
+
+ /* Word access */
+ register_ioport_write(addr, 2, 2, acpiPm1Status_writew, d);
+ register_ioport_read(addr, 2, 2, acpiPm1Status_readw, d);
+
+ register_ioport_write(addr + 2, 2, 2, acpiPm1Enable_writew, d);
+ register_ioport_read(addr + 2, 2, 2, acpiPm1Enable_readw, d);
+
+ register_ioport_write(addr + 4, 2, 2, acpiPm1Control_writew, d);
+ register_ioport_read(addr + 4, 2, 2, acpiPm1Control_readw, d);
+
+ /* DWord access */
+ register_ioport_write(addr, 4, 4, acpiPm1Event_writel, d);
+ register_ioport_read(addr, 4, 4, acpiPm1Event_readl, d);
+
+ register_ioport_write(addr + 8, 4, 4, acpiPm1Timer_writel, d);
+ register_ioport_read(addr + 8, 4, 4, acpiPm1Timer_readl, d);
+}
+
+
+/* PIIX4 acpi pci configuration space, func 2 */
+void pci_piix4_acpi_init(PCIBus *bus, int devfn)
@@ -421,7 +209,6 @@ Index: ioemu/hw/piix4acpi.c
+ bus, "PIIX4 ACPI", sizeof(PCIAcpiState),
+ devfn, NULL, NULL);
+
+ acpi_state = d;
+ pci_conf = d->dev.config;
+ pci_conf[0x00] = 0x86; /* Intel */
+ pci_conf[0x01] = 0x80;
@@ -444,14 +231,17 @@ Index: ioemu/hw/piix4acpi.c
+ */
+ pci_conf[0x40] = 0x41; /* Special device-specific BAR at 0x40 */
+ pci_conf[0x41] = 0x1f;
+ pci_conf[0x42] = 0x00;
+ pci_conf[0x43] = 0x00;
+ d->pm1_control = SCI_EN;
+
+ acpi_map(d, 0, 0x1f40, 0x10, PCI_ADDRESS_SPACE_IO);
+ acpi_reset(d);
+}
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-12-08 02:00:40.000000000 +0000
+++ ioemu/vl.c 2006-12-08 02:00:40.000000000 +0000
@@ -156,7 +156,7 @@
--- ioemu.orig/vl.c 2007-05-03 15:06:42.000000000 +0100
+++ ioemu/vl.c 2007-05-03 15:07:21.000000000 +0100
@@ -157,7 +157,7 @@
#else
#define MAX_CPUS 1
#endif
@@ -460,33 +250,33 @@ Index: ioemu/vl.c
int fd_bootchk = 1;
extern int vcpus;
@@ -5341,6 +5341,7 @@
@@ -5415,6 +5415,7 @@
#endif
"-loadvm file start right away with a saved state (loadvm in monitor)\n"
"-vnc display start a VNC server on display\n"
"-timeoffset time offset (in seconds) from local time\n"
+ "-acpi disable or enable ACPI of HVM domain \n"
"\n"
"During emulation, the following keys are useful:\n"
"ctrl-alt-f toggle full screen\n"
@@ -5426,6 +5427,7 @@
@@ -5499,6 +5500,7 @@
QEMU_OPTION_d,
QEMU_OPTION_vcpus,
QEMU_OPTION_timeoffset,
+ QEMU_OPTION_acpi,
};
typedef struct QEMUOption {
@@ -5509,6 +5511,7 @@
@@ -5581,6 +5583,7 @@
{ "d", HAS_ARG, QEMU_OPTION_d },
{ "vcpus", 1, QEMU_OPTION_vcpus },
{ "timeoffset", HAS_ARG, QEMU_OPTION_timeoffset },
+ { "acpi", 0, QEMU_OPTION_acpi },
{ NULL },
};
@@ -6240,6 +6243,9 @@
case QEMU_OPTION_timeoffset:
timeoffset = strtol(optarg, NULL, 0);
@@ -6322,6 +6325,9 @@
vcpus = atoi(optarg);
fprintf(logfile, "qemu: the number of cpus is %d\n", vcpus);
break;
+ case QEMU_OPTION_acpi:
+ acpi_enabled = 1;
@@ -496,8 +286,8 @@ Index: ioemu/vl.c
}
Index: ioemu/vl.h
===================================================================
--- ioemu.orig/vl.h 2006-12-08 02:00:40.000000000 +0000
+++ ioemu/vl.h 2006-12-08 02:00:40.000000000 +0000
--- ioemu.orig/vl.h 2007-05-03 15:06:42.000000000 +0100
+++ ioemu/vl.h 2007-05-03 15:07:21.000000000 +0100
@@ -168,6 +168,7 @@
extern int kqemu_allowed;
extern int win2k_install_hack;
@@ -506,7 +296,7 @@ Index: ioemu/vl.h
extern int smp_cpus;
/* XXX: make it dynamic */
@@ -923,6 +924,9 @@
@@ -924,6 +925,9 @@
void piix4_pm_init(PCIBus *bus, int devfn);
void acpi_bios_init(void);
@@ -518,8 +308,8 @@ Index: ioemu/vl.h
extern QEMUMachine isapc_machine;
Index: ioemu/hw/piix_pci.c
===================================================================
--- ioemu.orig/hw/piix_pci.c 2006-12-08 02:00:39.000000000 +0000
+++ ioemu/hw/piix_pci.c 2006-12-08 02:00:40.000000000 +0000
--- ioemu.orig/hw/piix_pci.c 2007-05-03 15:06:42.000000000 +0100
+++ ioemu/hw/piix_pci.c 2007-05-03 15:07:13.000000000 +0100
@@ -241,7 +241,7 @@
static uint32_t pci_bios_io_addr;
static uint32_t pci_bios_mem_addr;
+6 -128
View File
@@ -1,8 +1,8 @@
Index: ioemu/hw/piix4acpi.c
===================================================================
--- ioemu.orig/hw/piix4acpi.c 2006-12-08 01:35:52.000000000 +0000
+++ ioemu/hw/piix4acpi.c 2006-12-08 01:35:59.000000000 +0000
@@ -24,31 +24,30 @@
--- ioemu.orig/hw/piix4acpi.c 2007-05-02 15:59:22.000000000 +0100
+++ ioemu/hw/piix4acpi.c 2007-05-02 15:59:27.000000000 +0100
@@ -24,26 +24,26 @@
*/
#include "vl.h"
@@ -41,20 +41,10 @@ Index: ioemu/hw/piix4acpi.c
typedef struct AcpiDeviceState AcpiDeviceState;
AcpiDeviceState *acpi_device_table;
-/* Bits of PM1a register define here */
typedef struct PM1Event_BLK {
uint16_t pm1_status; /* pm1a_EVT_BLK */
uint16_t pm1_enable; /* pm1a_EVT_BLK+2 */
@@ -61,17 +60,11 @@
uint16_t pm1_enable; /* pm1a_EVT_BLK+2 */
@@ -53,13 +53,6 @@
uint16_t pm1_control; /* pm1a_ECNT_BLK */
uint32_t pm1_timer; /* pmtmr_BLK */
+ uint64_t old_vmck_ticks; /* using vm_clock counter */
} PCIAcpiState;
static PCIAcpiState *acpi_state;
-static inline void acpi_set_irq(PCIAcpiState *s)
-{
-/* no real SCI event need for now, so comment the following line out */
@@ -62,92 +52,10 @@ Index: ioemu/hw/piix4acpi.c
- printf("acpi_set_irq: s->irq %x \n",s->irq);
-}
-
static void acpi_reset(PCIAcpiState *s)
{
uint8_t *pci_conf;
@@ -84,6 +77,7 @@
s->pm1_enable = 0x00; /* TMROF_EN should cleared */
s->pm1_control = SCI_EN; /* SCI_EN */
s->pm1_timer = 0;
+ s->old_vmck_ticks = qemu_get_clock(vm_clock);
}
/*byte access */
@@ -95,8 +89,8 @@
s->pm1_status = s->pm1_status&!TMROF_STS;
if ((val&GBL_STS)==GBL_STS)
- s->pm1_status = s->pm1_status&!GBL_STS;
-
+ s->pm1_status = s->pm1_status&!GBL_STS;
+
/* printf("acpiPm1Status_writeb \n addr %x val:%x pm1_status:%x \n", addr, val,s->pm1_status); */
}
@@ -115,7 +109,7 @@
static void acpiPm1Control_writeb(void *opaque, uint32_t addr, uint32_t val)
{
PCIAcpiState *s = opaque;
- s->pm1_status = (val<<8)||(s->pm1_status);
+ s->pm1_status = (val<<8)||(s->pm1_status);
/* printf("acpiPm1StatusP1_writeb \n addr %x val:%x\n", addr, val); */
}
@@ -220,7 +214,7 @@
s->pm1_status = s->pm1_status&!TMROF_STS;
if ((val&GBL_STS)==GBL_STS)
- s->pm1_status = s->pm1_status&!GBL_STS;
+ s->pm1_status = s->pm1_status&!GBL_STS;
/* printf("acpiPm1Status_writew \n addr %x val:%x pm1_status:%x \n", addr, val,s->pm1_status); */
}
@@ -288,13 +282,15 @@
}
-static void acpiPm1Event_readl(void *opaque, uint32_t addr)
+static uint32_t acpiPm1Event_readl(void *opaque, uint32_t addr)
{
PCIAcpiState *s = opaque;
uint32_t val;
- val=s->pm1_status|(s->pm1_enable<<16);
+ val = s->pm1_status|(s->pm1_enable<<16);
/* printf("acpiPm1Event_readl \n addr %x val:%x\n", addr, val); */
+
+ return val;
}
static void acpiPm1Timer_writel(void *opaque, uint32_t addr, uint32_t val)
@@ -302,17 +298,21 @@
PCIAcpiState *s = opaque;
s->pm1_timer = val;
-/* printf("acpiPm1Timer_writel \n addr %x val:%x\n", addr, val); */
+ s->old_vmck_ticks = qemu_get_clock(vm_clock) +
+ muldiv64(val, FREQUENCE_PMTIMER, ticks_per_sec);
}
static uint32_t acpiPm1Timer_readl(void *opaque, uint32_t addr)
{
PCIAcpiState *s = opaque;
- uint32_t val;
+ int64_t current_vmck_ticks = qemu_get_clock(vm_clock);
+ int64_t vmck_ticks_delta = current_vmck_ticks - s->old_vmck_ticks;
- val = s->pm1_timer;
-/* printf("acpiPm1Timer_readl \n addr %x val:%x\n", addr, val); */
- return val;
+ if (s->old_vmck_ticks)
+ s->pm1_timer += muldiv64(vmck_ticks_delta, FREQUENCE_PMTIMER,
+ ticks_per_sec);
+ s->old_vmck_ticks = current_vmck_ticks;
+ return s->pm1_timer;
}
static void acpi_map(PCIDevice *pci_dev, int region_num,
@@ -320,7 +320,7 @@
@@ -132,7 +125,7 @@
{
PCIAcpiState *d = (PCIAcpiState *)pci_dev;
@@ -155,34 +63,4 @@ Index: ioemu/hw/piix4acpi.c
+ printf("register acpi io\n");
/* Byte access */
register_ioport_write(addr, 1, 1, acpiPm1Status_writeb, d);
@@ -336,14 +336,14 @@
register_ioport_write(addr + 4, 1, 1, acpiPm1Control_writeb, d);
register_ioport_read(addr + 4, 1, 1, acpiPm1Control_readb, d);
register_ioport_write(addr + 4 + 1, 1, 1, acpiPm1ControlP1_writeb, d);
- register_ioport_read(addr + 4 +1, 1, 1, acpiPm1ControlP1_readb, d);
+ register_ioport_read(addr + 4 +1, 1, 1, acpiPm1ControlP1_readb, d);
/* Word access */
register_ioport_write(addr, 2, 2, acpiPm1Status_writew, d);
register_ioport_read(addr, 2, 2, acpiPm1Status_readw, d);
register_ioport_write(addr + 2, 2, 2, acpiPm1Enable_writew, d);
- register_ioport_read(addr + 2, 2, 2, acpiPm1Enable_readw, d);
+ register_ioport_read(addr + 2, 2, 2, acpiPm1Enable_readw, d);
register_ioport_write(addr + 4, 2, 2, acpiPm1Control_writew, d);
register_ioport_read(addr + 4, 2, 2, acpiPm1Control_readw, d);
@@ -351,11 +351,10 @@
/* DWord access */
register_ioport_write(addr, 4, 4, acpiPm1Event_writel, d);
register_ioport_read(addr, 4, 4, acpiPm1Event_readl, d);
-
+
register_ioport_write(addr + 8, 4, 4, acpiPm1Timer_writel, d);
register_ioport_read(addr + 8, 4, 4, acpiPm1Timer_readl, d);
}
-
/* PIIX4 acpi pci configuration space, func 2 */
void pci_piix4_acpi_init(PCIBus *bus, int devfn)
+9 -8
View File
@@ -1,7 +1,7 @@
Index: ioemu/monitor.c
===================================================================
--- ioemu.orig/monitor.c 2006-12-08 01:26:07.000000000 +0000
+++ ioemu/monitor.c 2006-12-08 01:26:08.000000000 +0000
--- ioemu.orig/monitor.c 2007-05-03 14:54:59.000000000 +0100
+++ ioemu/monitor.c 2007-05-03 14:55:01.000000000 +0100
@@ -308,6 +308,7 @@
static void do_quit(void)
@@ -12,13 +12,14 @@ Index: ioemu/monitor.c
Index: ioemu/target-i386-dm/helper2.c
===================================================================
--- ioemu.orig/target-i386-dm/helper2.c 2006-12-08 01:26:08.000000000 +0000
+++ ioemu/target-i386-dm/helper2.c 2006-12-08 01:26:08.000000000 +0000
@@ -507,5 +507,25 @@
--- ioemu.orig/target-i386-dm/helper2.c 2007-05-03 14:55:00.000000000 +0100
+++ ioemu/target-i386-dm/helper2.c 2007-05-03 14:55:01.000000000 +0100
@@ -549,5 +549,26 @@
/* Wait up to 10 msec. */
main_loop_wait(10);
}
+ destroy_hvm_domain();
+
return 0;
}
+
@@ -42,8 +43,8 @@ Index: ioemu/target-i386-dm/helper2.c
+}
Index: ioemu/vl.h
===================================================================
--- ioemu.orig/vl.h 2006-12-08 01:26:08.000000000 +0000
+++ ioemu/vl.h 2006-12-08 01:26:08.000000000 +0000
--- ioemu.orig/vl.h 2007-05-03 14:55:00.000000000 +0100
+++ ioemu/vl.h 2007-05-03 14:55:01.000000000 +0100
@@ -1190,4 +1190,7 @@
void kqemu_record_dump(void);
+23 -20
View File
@@ -1,17 +1,14 @@
Index: ioemu/target-i386-dm/helper2.c
===================================================================
--- ioemu.orig/target-i386-dm/helper2.c 2006-12-08 01:26:06.000000000 +0000
+++ ioemu/target-i386-dm/helper2.c 2006-12-08 01:26:08.000000000 +0000
@@ -127,6 +127,25 @@
--- ioemu.orig/target-i386-dm/helper2.c 2007-05-03 14:54:46.000000000 +0100
+++ ioemu/target-i386-dm/helper2.c 2007-05-03 14:55:00.000000000 +0100
@@ -127,6 +127,22 @@
/* called from main_cpu_reset */
void cpu_reset(CPUX86State *env)
{
+ int xcHandle;
+ int sts;
+
+ /* pause domain first, to avoid repeated reboot request*/
+ xc_domain_pause(xc_handle, domid);
+
+ xcHandle = xc_interface_open();
+ if (xcHandle < 0)
+ fprintf(logfile, "Cannot acquire xenctrl handle\n");
@@ -28,22 +25,28 @@ Index: ioemu/target-i386-dm/helper2.c
}
void cpu_x86_close(CPUX86State *env)
@@ -479,6 +498,10 @@
if (vm_running) {
if (shutdown_requested)
break;
+ if (reset_requested) {
+ qemu_system_reset();
+ reset_requested = 0;
+ }
}
@@ -529,14 +545,9 @@
qemu_set_fd_handler(evtchn_fd, cpu_handle_ioreq, NULL, env);
- while (1) {
- if (vm_running) {
- if (shutdown_requested)
- break;
- }
-
+ while (!(vm_running && suspend_requested))
/* Wait up to 10 msec. */
main_loop_wait(10);
- }
+
return 0;
}
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-12-08 01:26:08.000000000 +0000
+++ ioemu/vl.c 2006-12-08 01:26:08.000000000 +0000
@@ -4948,7 +4948,7 @@
--- ioemu.orig/vl.c 2007-05-03 14:55:00.000000000 +0100
+++ ioemu/vl.c 2007-05-03 14:55:00.000000000 +0100
@@ -4957,7 +4957,7 @@
} QEMUResetEntry;
static QEMUResetEntry *first_reset_entry;
@@ -54,8 +57,8 @@ Index: ioemu/vl.c
Index: ioemu/vl.h
===================================================================
--- ioemu.orig/vl.h 2006-12-08 01:26:07.000000000 +0000
+++ ioemu/vl.h 2006-12-08 01:26:08.000000000 +0000
--- ioemu.orig/vl.h 2007-05-03 14:55:00.000000000 +0100
+++ ioemu/vl.h 2007-05-03 14:55:00.000000000 +0100
@@ -131,6 +131,7 @@
void qemu_register_reset(QEMUResetHandler *func, void *opaque);
+108 -29
View File
@@ -1,7 +1,7 @@
Index: ioemu/hw/mc146818rtc.c
===================================================================
--- ioemu.orig/hw/mc146818rtc.c 2006-12-20 15:21:33.000000000 +0000
+++ ioemu/hw/mc146818rtc.c 2006-12-20 15:21:50.000000000 +0000
--- ioemu.orig/hw/mc146818rtc.c 2007-05-03 15:38:35.000000000 +0100
+++ ioemu/hw/mc146818rtc.c 2007-05-03 15:38:45.000000000 +0100
@@ -178,10 +178,27 @@
}
}
@@ -46,8 +46,8 @@ Index: ioemu/hw/mc146818rtc.c
static void rtc_copy_date(RTCState *s)
Index: ioemu/hw/pc.c
===================================================================
--- ioemu.orig/hw/pc.c 2006-12-20 15:21:49.000000000 +0000
+++ ioemu/hw/pc.c 2006-12-20 15:21:50.000000000 +0000
--- ioemu.orig/hw/pc.c 2007-05-03 15:38:44.000000000 +0100
+++ ioemu/hw/pc.c 2007-05-03 15:38:45.000000000 +0100
@@ -159,7 +159,7 @@
}
@@ -81,9 +81,9 @@ Index: ioemu/hw/pc.c
- cmos_init(ram_size, boot_device, bs_table);
+ cmos_init(ram_size, boot_device, bs_table, timeoffset);
if (pci_enabled && usb_enabled) {
usb_uhci_init(pci_bus, piix3_devfn + 2);
@@ -912,12 +913,13 @@
/* using PIIX4 acpi model */
if (pci_enabled && acpi_enabled)
@@ -920,12 +921,13 @@
int snapshot,
const char *kernel_filename,
const char *kernel_cmdline,
@@ -99,7 +99,7 @@ Index: ioemu/hw/pc.c
}
static void pc_init_isa(uint64_t ram_size, int vga_ram_size, int boot_device,
@@ -925,12 +927,13 @@
@@ -933,12 +935,13 @@
int snapshot,
const char *kernel_filename,
const char *kernel_cmdline,
@@ -117,9 +117,9 @@ Index: ioemu/hw/pc.c
QEMUMachine pc_machine = {
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-12-20 15:21:49.000000000 +0000
+++ ioemu/vl.c 2006-12-20 15:21:50.000000000 +0000
@@ -163,6 +163,8 @@
--- ioemu.orig/vl.c 2007-05-03 15:38:45.000000000 +0100
+++ ioemu/vl.c 2007-05-03 15:38:45.000000000 +0100
@@ -167,6 +167,8 @@
int xc_handle;
@@ -128,41 +128,51 @@ Index: ioemu/vl.c
char domain_name[1024] = { 'H','V', 'M', 'X', 'E', 'N', '-'};
extern int domid;
@@ -5338,6 +5340,7 @@
#endif
"-loadvm file start right away with a saved state (loadvm in monitor)\n"
"-vnc display start a VNC server on display\n"
@@ -5435,6 +5437,7 @@
"-vncviewer start a vncviewer process for this domain\n"
"-vncunused bind the VNC server to an unused port\n"
"-vnclisten bind the VNC server to this address\n"
+ "-timeoffset time offset (in seconds) from local time\n"
"-acpi disable or enable ACPI of HVM domain \n"
"\n"
"During emulation, the following keys are useful:\n"
"ctrl-alt-f toggle full screen\n"
@@ -5422,6 +5425,7 @@
@@ -5522,6 +5525,7 @@
QEMU_OPTION_d,
QEMU_OPTION_vcpus,
+ QEMU_OPTION_timeoffset,
};
typedef struct QEMUOption {
@@ -5504,6 +5508,7 @@
QEMU_OPTION_acpi,
QEMU_OPTION_vncviewer,
QEMU_OPTION_vncunused,
@@ -5613,6 +5617,7 @@
{ "d", HAS_ARG, QEMU_OPTION_d },
{ "vcpus", 1, QEMU_OPTION_vcpus },
+ { "timeoffset", HAS_ARG, QEMU_OPTION_timeoffset },
{ "acpi", 0, QEMU_OPTION_acpi },
{ NULL },
};
@@ -6232,6 +6237,9 @@
@@ -6377,6 +6382,9 @@
vcpus = atoi(optarg);
fprintf(logfile, "qemu: the number of cpus is %d\n", vcpus);
break;
+ case QEMU_OPTION_timeoffset:
+ timeoffset = strtol(optarg, NULL, 0);
+ break;
}
}
case QEMU_OPTION_acpi:
acpi_enabled = 1;
break;
@@ -6531,6 +6539,9 @@
}
@@ -6484,7 +6492,8 @@
free(page_array);
#endif
+
+ timeoffset_get();
+
#else /* !CONFIG_DM */
phys_ram_base = qemu_vmalloc(phys_ram_size);
@@ -6662,7 +6673,8 @@
machine->init(ram_size, vga_ram_size, boot_device,
ds, fd_filename, snapshot,
@@ -174,9 +184,9 @@ Index: ioemu/vl.c
if (usb_enabled) {
Index: ioemu/vl.h
===================================================================
--- ioemu.orig/vl.h 2006-12-20 15:21:49.000000000 +0000
+++ ioemu/vl.h 2006-12-20 15:21:50.000000000 +0000
@@ -576,7 +576,7 @@
--- ioemu.orig/vl.h 2007-05-03 15:38:45.000000000 +0100
+++ ioemu/vl.h 2007-05-03 15:38:45.000000000 +0100
@@ -581,7 +581,7 @@
int boot_device,
DisplayState *ds, const char **fd_filename, int snapshot,
const char *kernel_filename, const char *kernel_cmdline,
@@ -185,3 +195,72 @@ Index: ioemu/vl.h
typedef struct QEMUMachine {
const char *name;
@@ -1216,6 +1216,10 @@
int xenstore_vm_write(int domid, char *key, char *val);
char *xenstore_vm_read(int domid, char *key, int *len);
+/* helper2.c */
+extern long time_offset;
+void timeoffset_get(void);
+
void kqemu_record_dump(void);
extern char domain_name[];
Index: ioemu/target-i386-dm/helper2.c
===================================================================
--- ioemu.orig/target-i386-dm/helper2.c 2007-05-03 15:38:44.000000000 +0100
+++ ioemu/target-i386-dm/helper2.c 2007-05-03 15:38:45.000000000 +0100
@@ -74,6 +74,8 @@
int xc_handle;
+long time_offset = 0;
+
shared_iopage_t *shared_page = NULL;
/* the evtchn fd for polling */
@@ -447,6 +449,34 @@
req->data = tmp1;
}
+void timeoffset_get()
+{
+ char *p;
+
+ p = xenstore_vm_read(domid, "rtc/timeoffset", NULL);
+ if (!p)
+ return;
+
+ if (sscanf(p, "%ld", &time_offset) == 1)
+ fprintf(logfile, "Time offset set %ld\n", time_offset);
+ else
+ time_offset = 0;
+
+ xc_domain_set_time_offset(xc_handle, domid, time_offset);
+
+ free(p);
+}
+
+void cpu_ioreq_timeoffset(CPUState *env, ioreq_t *req)
+{
+ char b[64];
+
+ time_offset += (ulong)req->data;
+
+ sprintf(b, "%ld", time_offset);
+ xenstore_vm_write(domid, "rtc/timeoffset", b);
+}
+
void cpu_ioreq_xchg(CPUState *env, ioreq_t *req)
{
unsigned long tmp1;
@@ -497,6 +527,9 @@
case IOREQ_TYPE_XCHG:
cpu_ioreq_xchg(env, req);
break;
+ case IOREQ_TYPE_TIMEOFFSET:
+ cpu_ioreq_timeoffset(env, req);
+ break;
default:
hw_error("Invalid ioreq type 0x%x\n", req->type);
}
+8 -8
View File
@@ -1,7 +1,7 @@
Index: ioemu/Makefile.target
===================================================================
--- ioemu.orig/Makefile.target 2006-12-08 01:41:12.000000000 +0000
+++ ioemu/Makefile.target 2006-12-08 01:41:12.000000000 +0000
--- ioemu.orig/Makefile.target 2007-05-03 10:07:52.000000000 +0100
+++ ioemu/Makefile.target 2007-05-03 10:07:53.000000000 +0100
@@ -355,7 +355,7 @@
ifeq ($(TARGET_BASE_ARCH), i386)
# Hardware support
@@ -13,8 +13,8 @@ Index: ioemu/Makefile.target
DEFINES += -DHAS_AUDIO
Index: ioemu/hw/pc.c
===================================================================
--- ioemu.orig/hw/pc.c 2006-12-08 01:41:12.000000000 +0000
+++ ioemu/hw/pc.c 2006-12-08 01:41:12.000000000 +0000
--- ioemu.orig/hw/pc.c 2007-05-03 10:07:52.000000000 +0100
+++ ioemu/hw/pc.c 2007-05-03 10:07:53.000000000 +0100
@@ -38,7 +38,9 @@
static fdctrl_t *floppy_controller;
@@ -38,9 +38,9 @@ Index: ioemu/hw/pc.c
pic_set_alt_irq_func(isa_pic, ioapic_set_irq, ioapic);
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-12-08 01:41:12.000000000 +0000
+++ ioemu/vl.c 2006-12-08 01:41:12.000000000 +0000
@@ -5570,6 +5570,7 @@
--- ioemu.orig/vl.c 2007-05-03 10:07:53.000000000 +0100
+++ ioemu/vl.c 2007-05-03 10:07:53.000000000 +0100
@@ -5622,6 +5622,7 @@
#ifdef HAS_AUDIO
struct soundhw soundhw[] = {
@@ -48,7 +48,7 @@ Index: ioemu/vl.c
#ifdef TARGET_I386
{
"pcspk",
@@ -5579,6 +5580,7 @@
@@ -5631,6 +5632,7 @@
{ .init_isa = pcspk_audio_init }
},
#endif
+5 -3
View File
@@ -5,9 +5,11 @@
[HVM] Enable DMA mode for CD-ROM IDE ATAPI interface.
Signed-off-by: Winston Wang <winston.l.wang@intel.com
--- ioemu/hw/ide.c Wed Oct 18 18:37:18 2006 +0100
+++ ioemu/hw/ide.c Wed Oct 18 18:41:47 2006 +0100
@@ -557,9 +557,9 @@ static void ide_atapi_identify(IDEState
Index: ioemu/hw/ide.c
===================================================================
--- ioemu.orig/hw/ide.c 2007-05-03 15:07:16.000000000 +0100
+++ ioemu/hw/ide.c 2007-05-03 15:07:16.000000000 +0100
@@ -713,9 +713,9 @@
padstr((uint8_t *)(p + 23), QEMU_VERSION, 8); /* firmware version */
padstr((uint8_t *)(p + 27), "QEMU CD-ROM", 40); /* model */
put_le16(p + 48, 1); /* dword I/O (XXX: should not be set on CDROM) */
+8 -8
View File
@@ -33,9 +33,9 @@ Signed-off-by: Keir Fraser <keir@xensource.com>
Index: ioemu/hw/ide.c
===================================================================
--- ioemu.orig/hw/ide.c 2006-12-08 18:21:36.000000000 +0000
+++ ioemu/hw/ide.c 2006-12-08 18:23:18.000000000 +0000
@@ -680,7 +680,7 @@
--- ioemu.orig/hw/ide.c 2007-05-03 15:07:16.000000000 +0100
+++ ioemu/hw/ide.c 2007-05-03 15:07:17.000000000 +0100
@@ -838,7 +838,7 @@
static void ide_sector_read(IDEState *s)
{
int64_t sector_num;
@@ -44,7 +44,7 @@ Index: ioemu/hw/ide.c
s->status = READY_STAT | SEEK_STAT;
s->error = 0; /* not needed by IDE spec, but needed by Windows */
@@ -695,7 +695,11 @@
@@ -853,7 +853,11 @@
#endif
if (n > s->req_nb_sectors)
n = s->req_nb_sectors;
@@ -57,7 +57,7 @@ Index: ioemu/hw/ide.c
ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_read);
ide_set_irq(s);
ide_set_sector(s, sector_num + n);
@@ -721,7 +725,11 @@
@@ -879,7 +883,11 @@
if (n > MAX_MULT_SECTORS)
n = MAX_MULT_SECTORS;
sector_num = ide_get_sector(s);
@@ -70,7 +70,7 @@ Index: ioemu/hw/ide.c
s->io_buffer_index = 0;
s->io_buffer_size = n * 512;
len = s->io_buffer_size;
@@ -767,7 +775,7 @@
@@ -925,7 +933,7 @@
static void ide_sector_write(IDEState *s)
{
int64_t sector_num;
@@ -79,7 +79,7 @@ Index: ioemu/hw/ide.c
s->status = READY_STAT | SEEK_STAT;
sector_num = ide_get_sector(s);
@@ -777,7 +785,11 @@
@@ -935,7 +943,11 @@
n = s->nsector;
if (n > s->req_nb_sectors)
n = s->req_nb_sectors;
@@ -92,7 +92,7 @@ Index: ioemu/hw/ide.c
s->nsector -= n;
if (s->nsector == 0) {
/* no more sector to write */
@@ -823,8 +835,13 @@
@@ -981,8 +993,13 @@
if (len == 0) {
n = s->io_buffer_size >> 9;
sector_num = ide_get_sector(s);
+89 -21
View File
@@ -1,7 +1,7 @@
Index: ioemu/hw/ide.c
===================================================================
--- ioemu.orig/hw/ide.c 2006-08-17 19:37:36.267534285 +0100
+++ ioemu/hw/ide.c 2006-08-17 19:49:57.830375828 +0100
--- ioemu.orig/hw/ide.c 2007-05-03 15:03:18.000000000 +0100
+++ ioemu/hw/ide.c 2007-05-03 15:06:48.000000000 +0100
@@ -22,6 +22,7 @@
* THE SOFTWARE.
*/
@@ -10,7 +10,7 @@ Index: ioemu/hw/ide.c
/* debug IDE devices */
//#define DEBUG_IDE
@@ -390,6 +391,48 @@
@@ -390,6 +391,89 @@
int type; /* see IDE_TYPE_xxx */
} PCIIDEState;
@@ -18,17 +18,41 @@ Index: ioemu/hw/ide.c
+
+#ifdef DMA_MULTI_THREAD
+
+static pthread_t ide_dma_thread;
+static int file_pipes[2];
+
+static void ide_dma_loop(BMDMAState *bm);
+static void dma_thread_loop(BMDMAState *bm);
+
+extern int suspend_requested;
+static void *dma_thread_func(void* opaque)
+{
+ BMDMAState* req;
+ fd_set fds;
+ int rv, nfds = file_pipes[0] + 1;
+ struct timeval tm;
+
+ while (read(file_pipes[0], &req, sizeof(req))) {
+ dma_thread_loop(req);
+ while (1) {
+
+ /* Wait at most a second for the pipe to become readable */
+ FD_ZERO(&fds);
+ FD_SET(file_pipes[0], &fds);
+ tm.tv_sec = 1;
+ tm.tv_usec = 0;
+ rv = select(nfds, &fds, NULL, NULL, &tm);
+
+ if (rv != 0) {
+ if (read(file_pipes[0], &req, sizeof(req)) == 0)
+ return NULL;
+ dma_thread_loop(req);
+ } else {
+ if (suspend_requested) {
+ /* Need to tidy up the DMA thread so that we don't end up
+ * finishing operations after the domain's ioreqs are
+ * drained and its state saved */
+ return NULL;
+ }
+ }
+ }
+
+ return NULL;
@@ -36,30 +60,47 @@ Index: ioemu/hw/ide.c
+
+static void dma_create_thread(void)
+{
+ pthread_t tid;
+ int rt;
+ pthread_attr_t a;
+
+ if (pipe(file_pipes) != 0) {
+ fprintf(stderr, "create pipe failed\n");
+ exit(1);
+ }
+
+ if ((rt = pthread_create(&tid, NULL, dma_thread_func, NULL))) {
+ if ((rt = pthread_attr_init(&a))
+ || (rt = pthread_attr_setdetachstate(&a, PTHREAD_CREATE_JOINABLE))) {
+ fprintf(stderr, "Oops, dma thread attr setup failed, errno=%d\n", rt);
+ exit(1);
+ }
+
+ if ((rt = pthread_create(&ide_dma_thread, &a, dma_thread_func, NULL))) {
+ fprintf(stderr, "Oops, dma thread creation failed, errno=%d\n", rt);
+ exit(1);
+ }
+}
+
+ if ((rt = pthread_detach(tid))) {
+ fprintf(stderr, "Oops, dma thread detachment failed, errno=%d\n", rt);
+ exit(1);
+void ide_stop_dma_thread(void)
+{
+ int rc;
+ /* Make sure the IDE DMA thread is stopped */
+ if ( (rc = pthread_join(ide_dma_thread, NULL)) != 0 )
+ {
+ fprintf(stderr, "Oops, error collecting IDE DMA thread (%s)\n",
+ strerror(rc));
+ }
+}
+
+#else
+void ide_stop_dma_thread(void)
+{
+}
+#endif /* DMA_MULTI_THREAD */
+
static void ide_dma_start(IDEState *s, IDEDMAFunc *dma_cb);
static void padstr(char *str, const char *src, int len)
@@ -695,7 +738,9 @@
@@ -695,7 +779,9 @@
}
if (s->io_buffer_index >= s->io_buffer_size && s->nsector == 0) {
s->status = READY_STAT | SEEK_STAT;
@@ -69,7 +110,7 @@ Index: ioemu/hw/ide.c
#ifdef DEBUG_IDE_ATAPI
printf("dma status=0x%x\n", s->status);
#endif
@@ -795,7 +840,11 @@
@@ -795,7 +881,11 @@
qemu_get_clock(vm_clock) + (ticks_per_sec / 1000));
} else
#endif
@@ -81,7 +122,7 @@ Index: ioemu/hw/ide.c
return 0;
}
if (n > MAX_MULT_SECTORS)
@@ -1046,7 +1095,9 @@
@@ -1046,7 +1136,9 @@
if (s->packet_transfer_size <= 0) {
s->status = READY_STAT;
s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
@@ -91,7 +132,7 @@ Index: ioemu/hw/ide.c
#ifdef DEBUG_IDE_ATAPI
printf("dma status=0x%x\n", s->status);
#endif
@@ -2103,9 +2154,30 @@
@@ -2103,9 +2195,30 @@
}
}
@@ -122,7 +163,7 @@ Index: ioemu/hw/ide.c
{
struct {
uint32_t addr;
@@ -2141,10 +2213,7 @@
@@ -2141,10 +2254,7 @@
}
/* end of transfer */
the_end:
@@ -134,7 +175,7 @@ Index: ioemu/hw/ide.c
}
static void ide_dma_start(IDEState *s, IDEDMAFunc *dma_cb)
@@ -2370,6 +2439,9 @@
@@ -2370,6 +2480,9 @@
cmd646_set_irq, d, 0);
ide_init2(&d->ide_if[2], hd_table[2], hd_table[3],
cmd646_set_irq, d, 1);
@@ -143,14 +184,41 @@ Index: ioemu/hw/ide.c
+#endif /* DMA_MULTI_THREAD */
}
/* hd_table must contain 4 block drivers */
@@ -2405,6 +2477,9 @@
pic_set_irq_new, isa_pic, 15);
ide_init_ioport(&d->ide_if[0], 0x1f0, 0x3f6);
ide_init_ioport(&d->ide_if[2], 0x170, 0x376);
static void pci_ide_save(QEMUFile* f, void *opaque)
@@ -2522,6 +2635,10 @@
register_savevm("ide_pci", 0, 1, generic_pci_save, generic_pci_load, d);
register_savevm("ide", 0, 1, pci_ide_save, pci_ide_load, d);
+
+#ifdef DMA_MULTI_THREAD
+ dma_create_thread();
+#endif //DMA_MULTI_THREAD
}
/***********************************************************/
Index: ioemu/target-i386-dm/helper2.c
===================================================================
--- ioemu.orig/target-i386-dm/helper2.c 2007-05-03 15:03:18.000000000 +0100
+++ ioemu/target-i386-dm/helper2.c 2007-05-03 15:06:41.000000000 +0100
@@ -556,6 +556,9 @@
handle_buffered_io(env);
main_loop_wait(1); /* For the select() on events */
+ /* Stop the IDE thread */
+ ide_stop_dma_thread();
+
/* Save the device state */
sprintf(qemu_file, "/tmp/xen.qemu-dm.%d", domid);
if (qemu_savevm(qemu_file) < 0)
Index: ioemu/vl.h
===================================================================
--- ioemu.orig/vl.h 2007-05-03 15:03:18.000000000 +0100
+++ ioemu/vl.h 2007-05-03 15:06:42.000000000 +0100
@@ -797,6 +797,7 @@
void pci_piix3_ide_init(PCIBus *bus, BlockDriverState **hd_table, int devfn);
int pmac_ide_init (BlockDriverState **hd_table,
SetIRQFunc *set_irq, void *irq_opaque, int irq);
+void ide_stop_dma_thread(void);
/* cdrom.c */
int cdrom_read_toc(int nb_sectors, uint8_t *buf, int msf, int start_track);
+215
View File
@@ -0,0 +1,215 @@
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2007-05-03 15:07:15.000000000 +0100
+++ ioemu/vl.c 2007-05-03 15:07:15.000000000 +0100
@@ -5924,6 +5924,7 @@
unsigned long ioreq_pfn;
extern void *shared_page;
extern void *buffered_io_page;
+ extern void *buffered_pio_page;
unsigned long nr_pages;
char qemu_dm_logfilename[64];
@@ -6530,6 +6531,10 @@
PROT_READ|PROT_WRITE,
BUFFER_IO_PAGE_START >> PAGE_SHIFT);
+ buffered_pio_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
+ PROT_READ|PROT_WRITE,
+ BUFFER_PIO_PAGE_START >> PAGE_SHIFT);
+
for (i = 0; i < nr_pages; i++)
page_array[i] = i;
Index: ioemu/hw/ide.c
===================================================================
--- ioemu.orig/hw/ide.c 2007-05-03 15:07:15.000000000 +0100
+++ ioemu/hw/ide.c 2007-05-03 15:07:15.000000000 +0100
@@ -474,6 +474,121 @@
}
#endif /* DMA_MULTI_THREAD */
+#if defined(__ia64__)
+#include <xen/hvm/ioreq.h>
+
+struct buffered_piopage *buffered_pio_page;
+
+static inline struct pio_buffer *
+piobuf_by_addr(uint32_t addr)
+{
+ if (addr == 0x1F0)
+ return &buffered_pio_page->pio[PIO_BUFFER_IDE_PRIMARY];
+ if (addr == 0x170)
+ return &buffered_pio_page->pio[PIO_BUFFER_IDE_SECONDARY];
+ return NULL;
+}
+
+static void
+buffered_pio_init(void)
+{
+ struct pio_buffer *p1, *p2;
+ uint32_t off1, off2;
+
+ if (!buffered_pio_page)
+ return;
+
+ p1 = &buffered_pio_page->pio[PIO_BUFFER_IDE_PRIMARY];
+ p2 = &buffered_pio_page->pio[PIO_BUFFER_IDE_SECONDARY];
+ off1 = offsetof(struct buffered_piopage, buffer);
+ off2 = (off1 + TARGET_PAGE_SIZE)/2;
+
+ p1->buf_size = off2 - off1;
+ p1->page_offset = off1;
+
+ p2->buf_size = TARGET_PAGE_SIZE - off2;
+ p2->page_offset = off2;
+}
+
+static inline void
+buffered_pio_flush(struct pio_buffer *piobuf)
+{
+ IDEState *s = piobuf->opaque;
+ uint32_t pointer = piobuf->pointer;
+
+ if (s != NULL && pointer > 0) {
+ uint8_t *buf = (uint8_t *)buffered_pio_page + piobuf->page_offset;
+ memcpy(s->data_ptr, buf, pointer);
+ s->data_ptr += pointer;
+ }
+}
+
+static inline void
+buffered_pio_reset(IDEState *s)
+{
+ struct pio_buffer *piobuf;
+
+ if ((unsigned)s->drive_serial - 1 < 2) /* 1,2 */
+ piobuf = &buffered_pio_page->pio[PIO_BUFFER_IDE_PRIMARY];
+ else if ((unsigned)s->drive_serial - 3 < 2) /* 3,4 */
+ piobuf = &buffered_pio_page->pio[PIO_BUFFER_IDE_SECONDARY];
+ else
+ return;
+ buffered_pio_flush(piobuf);
+ piobuf->pointer = 0;
+ piobuf->data_end = 0;
+ piobuf->opaque = NULL;
+}
+
+static inline void
+buffered_pio_write(IDEState *s, uint32_t addr, int size)
+{
+ struct pio_buffer *piobuf = piobuf_by_addr(addr);
+ int data_end;
+
+ if (!piobuf)
+ return;
+ buffered_pio_flush(piobuf);
+ data_end = s->data_end - s->data_ptr - size;
+ if (data_end <= 0)
+ data_end = 0;
+ else if (data_end > piobuf->buf_size)
+ data_end = piobuf->buf_size;
+ piobuf->pointer = 0;
+ piobuf->data_end = data_end;
+ piobuf->opaque = s;
+}
+
+static inline void
+buffered_pio_read(IDEState *s, uint32_t addr, int size)
+{
+ struct pio_buffer *piobuf = piobuf_by_addr(addr);
+ int data_end;
+
+ if (!piobuf)
+ return;
+ s->data_ptr += piobuf->pointer;
+ data_end = s->data_end - s->data_ptr - size;
+ if (data_end <= 0) {
+ data_end = 0;
+ } else {
+ uint8_t *buf = (uint8_t *)buffered_pio_page + piobuf->page_offset;
+ if (data_end > piobuf->buf_size)
+ data_end = piobuf->buf_size;
+ memcpy(buf, s->data_ptr + size, data_end);
+ }
+ piobuf->pointer = 0;
+ piobuf->data_end = data_end;
+ piobuf->opaque = NULL;
+}
+
+#else /* !__ia64__ */
+#define buffered_pio_init() do {} while (0)
+#define buffered_pio_reset(I) do {} while (0)
+#define buffered_pio_write(I,A,S) do {} while (0)
+#define buffered_pio_read(I,A,S) do {} while (0)
+#endif
+
static void ide_dma_start(IDEState *s, IDEDMAFunc *dma_cb);
static void padstr(char *str, const char *src, int len)
@@ -658,6 +773,7 @@
s->data_ptr = buf;
s->data_end = buf + size;
s->status |= DRQ_STAT;
+ buffered_pio_reset(s);
}
static void ide_transfer_stop(IDEState *s)
@@ -666,6 +782,7 @@
s->data_ptr = s->io_buffer;
s->data_end = s->io_buffer;
s->status &= ~DRQ_STAT;
+ buffered_pio_reset(s);
}
static int64_t ide_get_sector(IDEState *s)
@@ -1578,6 +1695,7 @@
ide_if[0].select = (val & ~0x10) | 0xa0;
ide_if[1].select = (val | 0x10) | 0xa0;
/* select drive */
+ buffered_pio_reset(ide_if->cur_drive);
unit = (val >> 4) & 1;
s = ide_if + unit;
ide_if->cur_drive = s;
@@ -1936,6 +2054,7 @@
IDEState *s = ((IDEState *)opaque)->cur_drive;
uint8_t *p;
+ buffered_pio_write(s, addr, 2);
p = s->data_ptr;
*(uint16_t *)p = le16_to_cpu(val);
p += 2;
@@ -1949,6 +2068,8 @@
IDEState *s = ((IDEState *)opaque)->cur_drive;
uint8_t *p;
int ret;
+
+ buffered_pio_read(s, addr, 2);
p = s->data_ptr;
ret = cpu_to_le16(*(uint16_t *)p);
p += 2;
@@ -1963,6 +2084,7 @@
IDEState *s = ((IDEState *)opaque)->cur_drive;
uint8_t *p;
+ buffered_pio_write(s, addr, 4);
p = s->data_ptr;
*(uint32_t *)p = le32_to_cpu(val);
p += 4;
@@ -1977,6 +2099,7 @@
uint8_t *p;
int ret;
+ buffered_pio_read(s, addr, 4);
p = s->data_ptr;
ret = cpu_to_le32(*(uint32_t *)p);
p += 4;
@@ -2634,6 +2757,8 @@
ide_init_ioport(&d->ide_if[0], 0x1f0, 0x3f6);
ide_init_ioport(&d->ide_if[2], 0x170, 0x376);
+ buffered_pio_init();
+
register_savevm("ide_pci", 0, 1, generic_pci_save, generic_pci_load, d);
register_savevm("ide", 0, 1, pci_ide_save, pci_ide_load, d);
+23 -27
View File
@@ -1,7 +1,7 @@
Index: ioemu/hw/iommu.c
===================================================================
--- ioemu.orig/hw/iommu.c 2006-12-20 15:04:54.000000000 +0000
+++ ioemu/hw/iommu.c 2006-12-20 15:04:54.000000000 +0000
--- ioemu.orig/hw/iommu.c 2007-05-03 09:56:32.000000000 +0100
+++ ioemu/hw/iommu.c 2007-05-03 10:05:51.000000000 +0100
@@ -82,7 +82,11 @@
#define IOPTE_VALID 0x00000002 /* IOPTE is valid */
#define IOPTE_WAZ 0x00000001 /* Write as zeros */
@@ -16,8 +16,8 @@ Index: ioemu/hw/iommu.c
Index: ioemu/cpu-all.h
===================================================================
--- ioemu.orig/cpu-all.h 2006-12-20 15:04:54.000000000 +0000
+++ ioemu/cpu-all.h 2006-12-20 15:04:54.000000000 +0000
--- ioemu.orig/cpu-all.h 2007-05-03 09:56:32.000000000 +0100
+++ ioemu/cpu-all.h 2007-05-03 10:05:51.000000000 +0100
@@ -835,6 +835,31 @@
:"=m" (*(volatile long *)addr)
:"dIr" (nr));
@@ -52,17 +52,13 @@ Index: ioemu/cpu-all.h
/* memory API */
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-12-20 15:04:54.000000000 +0000
+++ ioemu/vl.c 2006-12-20 15:12:00.000000000 +0000
@@ -6137,6 +6137,15 @@
--- ioemu.orig/vl.c 2007-05-03 10:04:06.000000000 +0100
+++ ioemu/vl.c 2007-05-03 10:25:23.000000000 +0100
@@ -6142,6 +6142,11 @@
exit(1);
}
+#if defined (__ia64__)
+ /* ram_size passed from xend has added on GFW memory,
+ so we must subtract it here */
+ ram_size -= 16 * MEM_M;
+
+ if (ram_size > MMIO_START)
+ ram_size += 1 * MEM_G; /* skip 3G-4G MMIO, LEGACY_IO_SPACE etc. */
+#endif
@@ -70,20 +66,20 @@ Index: ioemu/vl.c
/* init the memory */
phys_ram_size = ram_size + vga_ram_size + bios_size;
@@ -6161,6 +6170,7 @@
exit(-1);
}
+#if defined(__i386__) || defined(__x86_64__)
for ( i = 0; i < tmp_nr_pages; i++)
page_array[i] = i;
@@ -6185,6 +6195,36 @@
@@ -6182,6 +6187,44 @@
free(page_array);
+#elif defined(__ia64__)
+
+
+ nr_pages = ram_size/PAGE_SIZE;
+
+ page_array = (xen_pfn_t *)malloc(nr_pages * sizeof(xen_pfn_t));
+ if (page_array == NULL) {
+ fprintf(logfile, "malloc returned error %d\n", errno);
+ exit(-1);
+ }
+
+ shared_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
+ PROT_READ|PROT_WRITE,
+ IO_PAGE_START >> PAGE_SHIFT);
@@ -92,7 +88,7 @@ Index: ioemu/vl.c
+ PROT_READ|PROT_WRITE,
+ BUFFER_IO_PAGE_START >> PAGE_SHIFT);
+
+ for (i = 0; i < tmp_nr_pages; i++)
+ for (i = 0; i < nr_pages; i++)
+ page_array[i] = i;
+
+ /* VTI will not use memory between 3G~4G, so we just pass a legal pfn
@@ -117,8 +113,8 @@ Index: ioemu/vl.c
phys_ram_base = qemu_vmalloc(phys_ram_size);
Index: ioemu/exec-all.h
===================================================================
--- ioemu.orig/exec-all.h 2006-12-20 15:04:54.000000000 +0000
+++ ioemu/exec-all.h 2006-12-20 15:04:54.000000000 +0000
--- ioemu.orig/exec-all.h 2007-05-03 09:56:32.000000000 +0100
+++ ioemu/exec-all.h 2007-05-03 10:05:51.000000000 +0100
@@ -462,12 +462,13 @@
}
#endif
@@ -138,8 +134,8 @@ Index: ioemu/exec-all.h
Index: ioemu/target-i386-dm/cpu.h
===================================================================
--- ioemu.orig/target-i386-dm/cpu.h 2006-12-20 15:04:54.000000000 +0000
+++ ioemu/target-i386-dm/cpu.h 2006-12-20 15:10:13.000000000 +0000
--- ioemu.orig/target-i386-dm/cpu.h 2007-05-03 09:56:32.000000000 +0100
+++ ioemu/target-i386-dm/cpu.h 2007-05-03 10:25:13.000000000 +0100
@@ -78,7 +78,11 @@
/* helper2.c */
int main_loop(void);
@@ -155,7 +151,7 @@ Index: ioemu/target-i386-dm/cpu.h
Index: ioemu/ia64_intrinsic.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ ioemu/ia64_intrinsic.h 2006-12-20 15:04:54.000000000 +0000
+++ ioemu/ia64_intrinsic.h 2007-05-03 10:05:51.000000000 +0100
@@ -0,0 +1,276 @@
+#ifndef IA64_INTRINSIC_H
+#define IA64_INTRINSIC_H
+225
View File
@@ -0,0 +1,225 @@
Index: ioemu/hw/cirrus_vga.c
===================================================================
--- ioemu.orig/hw/cirrus_vga.c 2007-05-03 15:03:18.000000000 +0100
+++ ioemu/hw/cirrus_vga.c 2007-05-03 15:08:02.000000000 +0100
@@ -3011,11 +3011,42 @@
cirrus_mmio_writel,
};
+void cirrus_stop_acc(CirrusVGAState *s)
+{
+ if (s->map_addr){
+ int error;
+ s->map_addr = 0;
+ error = unset_vram_mapping(s->cirrus_lfb_addr,
+ s->cirrus_lfb_end, s->vram_ptr);
+ fprintf(stderr, "cirrus_stop_acc:unset_vram_mapping.\n");
+ }
+}
+
+void cirrus_restart_acc(CirrusVGAState *s)
+{
+ if (s->cirrus_lfb_addr && s->cirrus_lfb_end) {
+ void *vram_pointer, *old_vram;
+ fprintf(stderr, "cirrus_vga_load:re-enable vga acc.lfb_addr=0x%lx, lfb_end=0x%lx.\n",
+ s->cirrus_lfb_addr, s->cirrus_lfb_end);
+ vram_pointer = set_vram_mapping(s->cirrus_lfb_addr ,s->cirrus_lfb_end);
+ if (!vram_pointer){
+ fprintf(stderr, "cirrus_vga_load:NULL vram_pointer\n");
+ } else {
+ old_vram = vga_update_vram((VGAState *)s, vram_pointer,
+ VGA_RAM_SIZE);
+ qemu_free(old_vram);
+ s->map_addr = s->cirrus_lfb_addr;
+ s->map_end = s->cirrus_lfb_end;
+ }
+ }
+}
+
/* load/save state */
static void cirrus_vga_save(QEMUFile *f, void *opaque)
{
CirrusVGAState *s = opaque;
+ uint8_t vga_acc;
qemu_put_be32s(f, &s->latch);
qemu_put_8s(f, &s->sr_index);
@@ -3050,11 +3081,20 @@
qemu_put_be32s(f, &s->hw_cursor_y);
/* XXX: we do not save the bitblt state - we assume we do not save
the state when the blitter is active */
+
+ vga_acc = (!!s->map_addr);
+ qemu_put_8s(f, &vga_acc);
+ qemu_put_be64s(f, (uint64_t*)&s->cirrus_lfb_addr);
+ qemu_put_be64s(f, (uint64_t*)&s->cirrus_lfb_end);
+ qemu_put_buffer(f, s->vram_ptr, VGA_RAM_SIZE);
+ if (vga_acc)
+ cirrus_stop_acc(s);
}
static int cirrus_vga_load(QEMUFile *f, void *opaque, int version_id)
{
CirrusVGAState *s = opaque;
+ uint8_t vga_acc = 0;
if (version_id != 1)
return -EINVAL;
@@ -3093,6 +3133,14 @@
qemu_get_be32s(f, &s->hw_cursor_x);
qemu_get_be32s(f, &s->hw_cursor_y);
+ qemu_get_8s(f, &vga_acc);
+ qemu_get_be64s(f, (uint64_t*)&s->cirrus_lfb_addr);
+ qemu_get_be64s(f, (uint64_t*)&s->cirrus_lfb_end);
+ qemu_get_buffer(f, s->vram_ptr, VGA_RAM_SIZE);
+ if (vga_acc){
+ cirrus_restart_acc(s);
+ }
+
/* force refresh */
s->graphic_mode = -1;
cirrus_update_bank_ptr(s, 0);
@@ -3298,6 +3346,8 @@
ds, vga_ram_base, vga_ram_offset, vga_ram_size);
cirrus_init_common(s, device_id, 1);
+ register_savevm("cirrus_vga_pci", 0, 1, generic_pci_save, generic_pci_load, d);
+
/* setup memory space */
/* memory #0 LFB */
/* memory #1 memory-mapped I/O */
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2007-05-03 15:03:18.000000000 +0100
+++ ioemu/vl.c 2007-05-03 15:08:04.000000000 +0100
@@ -4470,6 +4470,11 @@
qemu_fseek(f, cur_pos + record_len, SEEK_SET);
}
fclose(f);
+
+ /* del tmp file */
+ if (unlink(filename) == -1)
+ fprintf(stderr, "delete tmp qemu state file failed.\n");
+
ret = 0;
the_end:
if (saved_vm_running)
@@ -5056,6 +5061,7 @@
static QEMUResetEntry *first_reset_entry;
int reset_requested;
int shutdown_requested;
+int suspend_requested;
static int powerdown_requested;
void qemu_register_reset(QEMUResetHandler *func, void *opaque)
@@ -5816,6 +5822,15 @@
return 0;
}
+void suspend(int sig)
+{
+ fprintf(logfile, "suspend sig handler called with requested=%d!\n",
+ suspend_requested);
+ if (sig != SIGUSR1)
+ fprintf(logfile, "suspend signal dismatch, get sig=%d!\n", sig);
+ suspend_requested = 1;
+}
+
int main(int argc, char **argv)
{
#ifdef CONFIG_GDBSTUB
@@ -6581,6 +6596,26 @@
vm_start();
}
}
+
+ /* register signal for the suspend request when save */
+ {
+ struct sigaction act;
+ sigset_t set;
+ act.sa_handler = suspend;
+ act.sa_flags = SA_RESTART;
+ sigemptyset(&act.sa_mask);
+
+ sigaction(SIGUSR1, &act, NULL);
+
+ /* control panel mask some signals when spawn qemu, need unmask here*/
+ sigemptyset(&set);
+ sigaddset(&set, SIGUSR1);
+ sigaddset(&set, SIGTERM);
+ if (sigprocmask(SIG_UNBLOCK, &set, NULL) == -1)
+ fprintf(stderr, "unblock signal fail, possible issue for HVM save!\n");
+
+ }
+
main_loop();
quit_timers();
return 0;
Index: ioemu/hw/pci.c
===================================================================
--- ioemu.orig/hw/pci.c 2007-05-03 15:03:12.000000000 +0100
+++ ioemu/hw/pci.c 2007-05-03 15:08:02.000000000 +0100
@@ -40,6 +40,8 @@
static int pci_irq_index;
static PCIBus *first_bus;
+static void pci_update_mappings(PCIDevice *d);
+
PCIBus *pci_register_bus(pci_set_irq_fn set_irq, void *pic, int devfn_min)
{
PCIBus *bus;
@@ -71,6 +73,7 @@
return -EINVAL;
qemu_get_buffer(f, s->config, 256);
+ pci_update_mappings(s);
return 0;
}
Index: ioemu/hw/ide.c
===================================================================
--- ioemu.orig/hw/ide.c 2007-05-03 15:03:12.000000000 +0100
+++ ioemu/hw/ide.c 2007-05-03 15:08:04.000000000 +0100
@@ -2405,6 +2405,8 @@
pic_set_irq_new, isa_pic, 15);
ide_init_ioport(&d->ide_if[0], 0x1f0, 0x3f6);
ide_init_ioport(&d->ide_if[2], 0x170, 0x376);
+
+ register_savevm("ide_pci", 0, 1, generic_pci_save, generic_pci_load, d);
}
/***********************************************************/
Index: ioemu/target-i386-dm/helper2.c
===================================================================
--- ioemu.orig/target-i386-dm/helper2.c 2007-05-03 15:03:18.000000000 +0100
+++ ioemu/target-i386-dm/helper2.c 2007-05-03 15:09:10.000000000 +0100
@@ -540,8 +540,10 @@
{
extern int vm_running;
extern int shutdown_requested;
+ extern int suspend_requested;
CPUState *env = cpu_single_env;
int evtchn_fd = xc_evtchn_fd(xce_handle);
+ char qemu_file[20];
qemu_set_fd_handler(evtchn_fd, cpu_handle_ioreq, NULL, env);
@@ -549,7 +551,15 @@
/* Wait up to 10 msec. */
main_loop_wait(10);
- destroy_hvm_domain();
+ fprintf(logfile, "device model received suspend signal!\n");
+
+ /* Pull all outstanding ioreqs through the system */
+ main_loop_wait(1); /* For the select() on events */
+
+ /* Save the device state */
+ sprintf(qemu_file, "/tmp/xen.qemu-dm.%d", domid);
+ if (qemu_savevm(qemu_file) < 0)
+ fprintf(stderr, "qemu save fail.\n");
return 0;
}
@@ -0,0 +1,34 @@
Index: ioemu/hw/piix4acpi.c
===================================================================
--- ioemu.orig/hw/piix4acpi.c 2007-05-03 15:07:43.000000000 +0100
+++ ioemu/hw/piix4acpi.c 2007-05-03 15:07:43.000000000 +0100
@@ -57,6 +57,20 @@
uint16_t pm1_control; /* pm1a_ECNT_BLK */
} PCIAcpiState;
+static void piix4acpi_save(QEMUFile *f, void *opaque)
+{
+ PCIAcpiState *s = opaque;
+ qemu_put_be16s(f, &s->pm1_control);
+}
+
+static int piix4acpi_load(QEMUFile *f, void *opaque, int version_id)
+{
+ PCIAcpiState *s = opaque;
+ if (version_id > 1)
+ return -EINVAL;
+ qemu_get_be16s(f, &s->pm1_control);
+}
+
static void acpiPm1Control_writeb(void *opaque, uint32_t addr, uint32_t val)
{
PCIAcpiState *s = opaque;
@@ -193,4 +207,8 @@
d->pm1_control = SCI_EN;
acpi_map(d, 0, 0x1f40, 0x10, PCI_ADDRESS_SPACE_IO);
+
+ register_savevm("piix4acpi", 0, 1, piix4acpi_save, piix4acpi_load, d);
+ register_savevm("piix4acpi_pci", 0, 1, generic_pci_save, generic_pci_load,
+ &d->dev);
}
+133
View File
@@ -0,0 +1,133 @@
Index: ioemu/hw/ide.c
===================================================================
--- ioemu.orig/hw/ide.c 2007-05-02 14:12:00.000000000 +0100
+++ ioemu/hw/ide.c 2007-05-02 14:12:40.000000000 +0100
@@ -2372,6 +2372,120 @@
cmd646_set_irq, d, 1);
}
+static void pci_ide_save(QEMUFile* f, void *opaque)
+{
+ PCIIDEState *d = opaque;
+ int i;
+
+ for(i = 0; i < 2; i++) {
+ BMDMAState *bm = &d->bmdma[i];
+ qemu_put_8s(f, &bm->cmd);
+ qemu_put_8s(f, &bm->status);
+ qemu_put_be32s(f, &bm->addr);
+ /* XXX: if a transfer is pending, we do not save it yet */
+ }
+
+ /* per IDE interface data */
+ for(i = 0; i < 2; i++) {
+ IDEState *s = &d->ide_if[i * 2];
+ uint8_t drive1_selected;
+ qemu_put_8s(f, &s->cmd);
+ drive1_selected = (s->cur_drive != s);
+ qemu_put_8s(f, &drive1_selected);
+ }
+
+ /* per IDE drive data */
+ for(i = 0; i < 4; i++) {
+ IDEState *s = &d->ide_if[i];
+ qemu_put_be32s(f, &s->mult_sectors);
+ qemu_put_be32s(f, &s->identify_set);
+ if (s->identify_set) {
+ qemu_put_buffer(f, (const uint8_t *)s->identify_data, 512);
+ }
+ qemu_put_8s(f, &s->write_cache);
+ qemu_put_8s(f, &s->feature);
+ qemu_put_8s(f, &s->error);
+ qemu_put_be32s(f, &s->nsector);
+ qemu_put_8s(f, &s->sector);
+ qemu_put_8s(f, &s->lcyl);
+ qemu_put_8s(f, &s->hcyl);
+ qemu_put_8s(f, &s->hob_feature);
+ qemu_put_8s(f, &s->hob_nsector);
+ qemu_put_8s(f, &s->hob_sector);
+ qemu_put_8s(f, &s->hob_lcyl);
+ qemu_put_8s(f, &s->hob_hcyl);
+ qemu_put_8s(f, &s->select);
+ qemu_put_8s(f, &s->status);
+ qemu_put_8s(f, &s->lba48);
+
+ qemu_put_8s(f, &s->sense_key);
+ qemu_put_8s(f, &s->asc);
+ /* XXX: if a transfer is pending, we do not save it yet */
+ }
+}
+
+static int pci_ide_load(QEMUFile* f, void *opaque, int version_id)
+{
+ PCIIDEState *d = opaque;
+ int ret, i;
+
+ if (version_id != 1)
+ return -EINVAL;
+
+ for(i = 0; i < 2; i++) {
+ BMDMAState *bm = &d->bmdma[i];
+ qemu_get_8s(f, &bm->cmd);
+ qemu_get_8s(f, &bm->status);
+ qemu_get_be32s(f, &bm->addr);
+ /* XXX: if a transfer is pending, we do not save it yet */
+ }
+
+ /* per IDE interface data */
+ for(i = 0; i < 2; i++) {
+ IDEState *s = &d->ide_if[i * 2];
+ uint8_t drive1_selected;
+ qemu_get_8s(f, &s->cmd);
+ qemu_get_8s(f, &drive1_selected);
+ s->cur_drive = &d->ide_if[i * 2 + (drive1_selected != 0)];
+ }
+
+ /* per IDE drive data */
+ for(i = 0; i < 4; i++) {
+ IDEState *s = &d->ide_if[i];
+ qemu_get_be32s(f, &s->mult_sectors);
+ qemu_get_be32s(f, &s->identify_set);
+ if (s->identify_set) {
+ qemu_get_buffer(f, (uint8_t *)s->identify_data, 512);
+ }
+ qemu_get_8s(f, &s->write_cache);
+ qemu_get_8s(f, &s->feature);
+ qemu_get_8s(f, &s->error);
+ qemu_get_be32s(f, &s->nsector);
+ qemu_get_8s(f, &s->sector);
+ qemu_get_8s(f, &s->lcyl);
+ qemu_get_8s(f, &s->hcyl);
+ qemu_get_8s(f, &s->hob_feature);
+ qemu_get_8s(f, &s->hob_nsector);
+ qemu_get_8s(f, &s->hob_sector);
+ qemu_get_8s(f, &s->hob_lcyl);
+ qemu_get_8s(f, &s->hob_hcyl);
+ qemu_get_8s(f, &s->select);
+ qemu_get_8s(f, &s->status);
+ qemu_get_8s(f, &s->lba48);
+
+ qemu_get_8s(f, &s->sense_key);
+ qemu_get_8s(f, &s->asc);
+ /* XXX: if a transfer is pending, we do not save it yet */
+ if (s->status & (DRQ_STAT|BUSY_STAT)) {
+ /* Tell the guest that its transfer has gone away */
+ ide_abort_command(s);
+ ide_set_irq(s);
+ }
+ }
+ return 0;
+}
+
+
/* hd_table must contain 4 block drivers */
/* NOTE: for the PIIX3, the IRQs and IOports are hardcoded */
void pci_piix3_ide_init(PCIBus *bus, BlockDriverState **hd_table, int devfn)
@@ -2407,6 +2521,7 @@
ide_init_ioport(&d->ide_if[2], 0x170, 0x376);
register_savevm("ide_pci", 0, 1, generic_pci_save, generic_pci_load, d);
+ register_savevm("ide", 0, 1, pci_ide_save, pci_ide_load, d);
}
/***********************************************************/
@@ -0,0 +1,190 @@
Index: ioemu/xenstore.c
===================================================================
--- ioemu.orig/xenstore.c 2007-05-03 10:42:11.000000000 +0100
+++ ioemu/xenstore.c 2007-05-03 14:17:13.000000000 +0100
@@ -11,6 +11,11 @@
#include "vl.h"
#include "block_int.h"
#include <unistd.h>
+#include <sys/ipc.h>
+#include <sys/shm.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
static struct xs_handle *xsh = NULL;
static char *media_filename[MAX_DISKS];
@@ -173,6 +178,13 @@
}
}
+ /* Set a watch for log-dirty requests from the migration tools */
+ if (pasprintf(&buf, "%s/logdirty/next-active", path) != -1) {
+ xs_watch(xsh, buf, "logdirty");
+ fprintf(logfile, "Watching %s\n", buf);
+ }
+
+
out:
free(type);
free(params);
@@ -191,6 +203,112 @@
return -1;
}
+unsigned long *logdirty_bitmap = NULL;
+unsigned long logdirty_bitmap_size;
+extern int vga_ram_size, bios_size;
+
+void xenstore_process_logdirty_event(void)
+{
+ char *act;
+ static char *active_path = NULL;
+ static char *next_active_path = NULL;
+ static char *seg = NULL;
+ unsigned int len;
+ int i;
+
+ fprintf(logfile, "Triggered log-dirty buffer switch\n");
+
+ if (!seg) {
+ char *path, *p, *key_ascii, key_terminated[17] = {0,};
+ key_t key;
+ int shmid;
+
+ /* Find and map the shared memory segment for log-dirty bitmaps */
+ if (!(path = xs_get_domain_path(xsh, domid))) {
+ fprintf(logfile, "Log-dirty: can't get domain path in store\n");
+ exit(1);
+ }
+ if (!(path = realloc(path, strlen(path)
+ + strlen("/logdirty/next-active") + 1))) {
+ fprintf(logfile, "Log-dirty: out of memory\n");
+ exit(1);
+ }
+ strcat(path, "/logdirty/");
+ p = path + strlen(path);
+ strcpy(p, "key");
+
+ key_ascii = xs_read(xsh, XBT_NULL, path, &len);
+ if (!key_ascii) {
+ /* No key yet: wait for the next watch */
+ free(path);
+ return;
+ }
+ strncpy(key_terminated, key_ascii, 16);
+ free(key_ascii);
+ key = (key_t) strtoull(key_terminated, NULL, 16);
+
+ /* Figure out how bit the log-dirty bitmaps are */
+ logdirty_bitmap_size = xc_memory_op(xc_handle,
+ XENMEM_maximum_gpfn, &domid) + 1;
+ logdirty_bitmap_size = ((logdirty_bitmap_size + HOST_LONG_BITS - 1)
+ / HOST_LONG_BITS); /* longs */
+ logdirty_bitmap_size *= sizeof (unsigned long); /* bytes */
+
+ /* Map the shared-memory segment */
+ if ((shmid = shmget(key,
+ 2 * logdirty_bitmap_size,
+ S_IRUSR|S_IWUSR)) == -1
+ || (seg = shmat(shmid, NULL, 0)) == (void *)-1) {
+ fprintf(logfile, "Log-dirty: can't map segment %16.16llx (%s)\n",
+ (unsigned long long) key, strerror(errno));
+ exit(1);
+ }
+
+ fprintf(logfile, "Log-dirty: mapped segment at %p\n", seg);
+
+ /* Double-check that the bitmaps are the size we expect */
+ if (logdirty_bitmap_size != *(uint32_t *)seg) {
+ fprintf(logfile, "Log-dirty: got %u, calc %lu\n",
+ *(uint32_t *)seg, logdirty_bitmap_size);
+ return;
+ }
+
+ /* Remember the paths for the next-active and active entries */
+ strcpy(p, "active");
+ if (!(active_path = strdup(path))) {
+ fprintf(logfile, "Log-dirty: out of memory\n");
+ exit(1);
+ }
+ strcpy(p, "next-active");
+ if (!(next_active_path = strdup(path))) {
+ fprintf(logfile, "Log-dirty: out of memory\n");
+ exit(1);
+ }
+ free(path);
+ }
+
+ /* Read the required active buffer from the store */
+ act = xs_read(xsh, XBT_NULL, next_active_path, &len);
+ if (!act) {
+ fprintf(logfile, "Log-dirty: can't read next-active\n");
+ exit(1);
+ }
+
+ /* Switch buffers */
+ i = act[0] - '0';
+ if (i != 0 && i != 1) {
+ fprintf(logfile, "Log-dirty: bad next-active entry: %s\n", act);
+ exit(1);
+ }
+ logdirty_bitmap = (unsigned long *)(seg + i * logdirty_bitmap_size);
+
+ /* Ack that we've switched */
+ xs_write(xsh, XBT_NULL, active_path, act, len);
+ free(act);
+}
+
+
+
void xenstore_process_event(void *opaque)
{
char **vec, *image = NULL;
@@ -200,6 +318,11 @@
if (!vec)
return;
+ if (!strcmp(vec[XS_WATCH_TOKEN], "logdirty")) {
+ xenstore_process_logdirty_event();
+ goto out;
+ }
+
if (strncmp(vec[XS_WATCH_TOKEN], "hd", 2) ||
strlen(vec[XS_WATCH_TOKEN]) != 3)
goto out;
Index: ioemu/target-i386-dm/exec-dm.c
===================================================================
--- ioemu.orig/target-i386-dm/exec-dm.c 2007-05-03 14:13:38.000000000 +0100
+++ ioemu/target-i386-dm/exec-dm.c 2007-05-03 14:18:14.000000000 +0100
@@ -431,6 +431,9 @@
#define phys_ram_addr(x) ((addr < ram_size) ? (phys_ram_base + (x)) : NULL)
#endif
+extern unsigned long *logdirty_bitmap;
+extern unsigned long logdirty_bitmap_size;
+
void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf,
int len, int is_write)
{
@@ -466,8 +469,19 @@
l = 1;
}
} else if ((ptr = phys_ram_addr(addr)) != NULL) {
- /* Reading from RAM */
+ /* Writing to RAM */
memcpy(ptr, buf, l);
+ if (logdirty_bitmap != NULL) {
+ /* Record that we have dirtied this frame */
+ unsigned long pfn = addr >> TARGET_PAGE_BITS;
+ if (pfn / 8 >= logdirty_bitmap_size) {
+ fprintf(logfile, "dirtying pfn %lx >= bitmap "
+ "size %lx\n", pfn, logdirty_bitmap_size * 8);
+ } else {
+ logdirty_bitmap[pfn / HOST_LONG_BITS]
+ |= 1UL << pfn % HOST_LONG_BITS;
+ }
+ }
#ifdef __ia64__
sync_icache(ptr, l);
#endif
@@ -0,0 +1,34 @@
Index: ioemu/hw/ne2000.c
===================================================================
--- ioemu.orig/hw/ne2000.c 2007-05-02 16:09:35.000000000 +0100
+++ ioemu/hw/ne2000.c 2007-05-02 16:10:03.000000000 +0100
@@ -739,7 +739,7 @@
s->macaddr[4],
s->macaddr[5]);
- register_savevm("ne2000", 0, 2, ne2000_save, ne2000_load, s);
+ register_savevm("ne2000", base, 2, ne2000_save, ne2000_load, s);
}
/***********************************************************/
@@ -775,6 +775,7 @@
PCINE2000State *d;
NE2000State *s;
uint8_t *pci_conf;
+ int instance;
d = (PCINE2000State *)pci_register_device(bus,
"NE2000", sizeof(PCINE2000State),
@@ -809,8 +810,8 @@
s->macaddr[4],
s->macaddr[5]);
- /* XXX: instance number ? */
- register_savevm("ne2000", 0, 2, ne2000_save, ne2000_load, s);
- register_savevm("ne2000_pci", 0, 1, generic_pci_save, generic_pci_load,
- &d->dev);
+ instance = pci_bus_num(bus) << 8 | s->pci_dev->devfn;
+ register_savevm("ne2000", instance, 2, ne2000_save, ne2000_load, s);
+ register_savevm("ne2000_pci", instance, 1, generic_pci_save,
+ generic_pci_load, &d->dev);
}
@@ -0,0 +1,80 @@
Index: ioemu/hw/pcnet.c
===================================================================
--- ioemu.orig/hw/pcnet.c 2007-05-02 16:09:36.000000000 +0100
+++ ioemu/hw/pcnet.c 2007-05-02 16:10:28.000000000 +0100
@@ -1727,10 +1727,63 @@
cpu_register_physical_memory(addr, PCNET_PNPMMIO_SIZE, d->mmio_io_addr);
}
+
+static void pcnet_save(QEMUFile *f, void *opaque)
+{
+ PCNetState *s = opaque;
+ unsigned int i;
+
+ qemu_put_be32s(f, &s->rap);
+ qemu_put_be32s(f, &s->isr);
+ qemu_put_be32s(f, &s->lnkst);
+ qemu_put_be32s(f, &s->rdra);
+ qemu_put_be32s(f, &s->tdra);
+ qemu_put_buffer(f, s->prom, 16);
+ for (i = 0; i < 128; i++)
+ qemu_put_be16s(f, &s->csr[i]);
+ for (i = 0; i < 32; i++)
+ qemu_put_be16s(f, &s->bcr[i]);
+ qemu_put_be64s(f, &s->timer);
+ qemu_put_be32s(f, &s->xmit_pos);
+ qemu_put_be32s(f, &s->recv_pos);
+ qemu_put_buffer(f, s->buffer, 4096);
+ qemu_put_be32s(f, &s->tx_busy);
+ qemu_put_timer(f, s->poll_timer);
+}
+
+static int pcnet_load(QEMUFile *f, void *opaque, int version_id)
+{
+ PCNetState *s = opaque;
+ int i, ret;
+
+ if (version_id != 1)
+ return -EINVAL;
+
+ qemu_get_be32s(f, &s->rap);
+ qemu_get_be32s(f, &s->isr);
+ qemu_get_be32s(f, &s->lnkst);
+ qemu_get_be32s(f, &s->rdra);
+ qemu_get_be32s(f, &s->tdra);
+ qemu_get_buffer(f, s->prom, 16);
+ for (i = 0; i < 128; i++)
+ qemu_get_be16s(f, &s->csr[i]);
+ for (i = 0; i < 32; i++)
+ qemu_get_be16s(f, &s->bcr[i]);
+ qemu_get_be64s(f, &s->timer);
+ qemu_get_be32s(f, &s->xmit_pos);
+ qemu_get_be32s(f, &s->recv_pos);
+ qemu_get_buffer(f, s->buffer, 4096);
+ qemu_get_be32s(f, &s->tx_busy);
+ qemu_get_timer(f, s->poll_timer);
+
+ return 0;
+}
+
void pci_pcnet_init(PCIBus *bus, NICInfo *nd)
{
PCNetState *d;
uint8_t *pci_conf;
+ int instance;
#if 0
printf("sizeof(RMD)=%d, sizeof(TMD)=%d\n",
@@ -1775,6 +1828,11 @@
d->vc = qemu_new_vlan_client(nd->vlan, pcnet_receive,
pcnet_can_receive, d);
+
+ instance = pci_bus_num(bus) << 8 | d->dev.devfn;
+ register_savevm("pcnet", instance, 1, pcnet_save, pcnet_load, d);
+ register_savevm("pcnet_pci", instance, 1, generic_pci_save,
+ generic_pci_load, &d->dev);
snprintf(d->vc->info_str, sizeof(d->vc->info_str),
"pcnet macaddr=%02x:%02x:%02x:%02x:%02x:%02x",
@@ -0,0 +1,27 @@
Index: ioemu/hw/rtl8139.c
===================================================================
--- ioemu.orig/hw/rtl8139.c 2007-05-02 16:09:35.000000000 +0100
+++ ioemu/hw/rtl8139.c 2007-05-02 16:10:56.000000000 +0100
@@ -3406,6 +3406,7 @@
PCIRTL8139State *d;
RTL8139State *s;
uint8_t *pci_conf;
+ int instance;
d = (PCIRTL8139State *)pci_register_device(bus,
"RTL8139", sizeof(PCIRTL8139State),
@@ -3456,10 +3457,10 @@
s->cplus_txbuffer_len = 0;
s->cplus_txbuffer_offset = 0;
- /* XXX: instance number ? */
- register_savevm("rtl8139", 0, 2, rtl8139_save, rtl8139_load, s);
- register_savevm("rtl8139_pci", 0, 1, generic_pci_save, generic_pci_load,
- &d->dev);
+ instance = pci_bus_num(bus) << 8 | s->pci_dev->devfn;
+ register_savevm("rtl8139", instance, 2, rtl8139_save, rtl8139_load, s);
+ register_savevm("rtl8139_pci", instance, 1, generic_pci_save,
+ generic_pci_load, &d->dev);
#if RTL8139_ONBOARD_TIMER
s->timer = qemu_new_timer(vm_clock, rtl8139_timer, s);
@@ -0,0 +1,27 @@
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2007-05-03 10:07:54.000000000 +0100
+++ ioemu/vl.c 2007-05-03 10:07:54.000000000 +0100
@@ -828,10 +828,22 @@
#ifdef CONFIG_DM
static void timer_save(QEMUFile *f, void *opaque)
{
+ /* need timer for save/restoe qemu_timer in usb_uhci */
+ if (cpu_ticks_enabled) {
+ hw_error("cannot save state if virtual timers are running");
+ }
+ qemu_put_be64s(f, &cpu_clock_offset);
}
static int timer_load(QEMUFile *f, void *opaque, int version_id)
{
+ if (version_id != 1)
+ return -EINVAL;
+ if (cpu_ticks_enabled) {
+ return -EINVAL;
+ }
+
+ qemu_get_be64s(f, &cpu_clock_offset);
return 0;
}
#else /* !CONFIG_DM */
+235
View File
@@ -0,0 +1,235 @@
Index: ioemu/hw/usb-hid.c
===================================================================
--- ioemu.orig/hw/usb-hid.c 2007-05-03 09:56:32.000000000 +0100
+++ ioemu/hw/usb-hid.c 2007-05-03 10:07:54.000000000 +0100
@@ -508,6 +508,49 @@
qemu_free(s);
}
+void usb_mouse_save(QEMUFile *f, void *opaque)
+{
+ USBMouseState *s = (USBMouseState*)opaque;
+
+ qemu_put_be32s(f, &s->dx);
+ qemu_put_be32s(f, &s->dy);
+ qemu_put_be32s(f, &s->dz);
+ qemu_put_be32s(f, &s->buttons_state);
+ qemu_put_be32s(f, &s->x);
+ qemu_put_be32s(f, &s->y);
+ qemu_put_be32s(f, &s->kind);
+ qemu_put_be32s(f, &s->mouse_grabbed);
+ qemu_put_be32s(f, &s->status_changed);
+
+}
+
+int usb_mouse_load(QEMUFile *f, void *opaque, int version_id)
+{
+ USBMouseState *s = (USBMouseState*)opaque;
+
+ if (version_id != 1)
+ return -EINVAL;
+
+ qemu_get_be32s(f, &s->dx);
+ qemu_get_be32s(f, &s->dy);
+ qemu_get_be32s(f, &s->dz);
+ qemu_get_be32s(f, &s->buttons_state);
+ qemu_get_be32s(f, &s->x);
+ qemu_get_be32s(f, &s->y);
+ qemu_get_be32s(f, &s->kind);
+ qemu_get_be32s(f, &s->mouse_grabbed);
+ qemu_get_be32s(f, &s->status_changed);
+
+ if ( s->kind == USB_TABLET) {
+ fprintf(logfile, "usb_mouse_load:add usb_tablet_event.\n");
+ qemu_add_mouse_event_handler(usb_tablet_event, s, 1);
+ } else if ( s->kind == USB_MOUSE) {
+ fprintf(logfile, "usb_mouse_load:add usb_mouse_event.\n");
+ qemu_add_mouse_event_handler(usb_mouse_event, s, 0);
+ }
+}
+
+
USBDevice *usb_tablet_init(void)
{
USBMouseState *s;
@@ -526,6 +569,8 @@
pstrcpy(s->dev.devname, sizeof(s->dev.devname), "QEMU USB Tablet");
+ register_savevm("USB tablet dev", 0, 1, usb_mouse_save, usb_mouse_load, s);
+
return (USBDevice *)s;
}
@@ -547,5 +592,7 @@
pstrcpy(s->dev.devname, sizeof(s->dev.devname), "QEMU USB Mouse");
+ register_savevm("USB mouse dev", 0, 1, usb_mouse_save, usb_mouse_load, s);
+
return (USBDevice *)s;
}
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2007-05-03 10:07:53.000000000 +0100
+++ ioemu/vl.c 2007-05-03 10:07:54.000000000 +0100
@@ -3878,6 +3878,7 @@
const char *p;
USBDevice *dev;
USBPort *port;
+ char usb_name[256] = "USB ";
if (!free_usb_ports)
return -1;
@@ -3914,6 +3915,12 @@
free_usb_ports = port->next;
port->next = used_usb_ports;
used_usb_ports = port;
+
+ pstrcpy(usb_name + strlen(usb_name),
+ sizeof(usb_name) - strlen(usb_name),
+ devname);
+ register_savevm(usb_name, 0, 1, generic_usb_save, generic_usb_load, dev);
+
usb_attach(port, dev);
return 0;
}
Index: ioemu/hw/usb.c
===================================================================
--- ioemu.orig/hw/usb.c 2007-05-03 09:56:32.000000000 +0100
+++ ioemu/hw/usb.c 2007-05-03 10:07:54.000000000 +0100
@@ -191,3 +191,43 @@
}
return q - buf;
}
+
+void generic_usb_save(QEMUFile* f, void *opaque)
+{
+ USBDevice *s = (USBDevice*)opaque;
+
+ qemu_put_be32s(f, &s->speed);
+ qemu_put_8s(f, &s->addr);
+ qemu_put_be32s(f, &s->state);
+
+ qemu_put_buffer(f, s->setup_buf, 8);
+ qemu_put_buffer(f, s->data_buf, 1024);
+
+ qemu_put_be32s(f, &s->remote_wakeup);
+ qemu_put_be32s(f, &s->setup_state);
+ qemu_put_be32s(f, &s->setup_len);
+ qemu_put_be32s(f, &s->setup_index);
+
+}
+
+int generic_usb_load(QEMUFile* f, void *opaque, int version_id)
+{
+ USBDevice *s = (USBDevice*)opaque;
+
+ if (version_id != 1)
+ return -EINVAL;
+
+ qemu_get_be32s(f, &s->speed);
+ qemu_get_8s(f, &s->addr);
+ qemu_get_be32s(f, &s->state);
+
+ qemu_get_buffer(f, s->setup_buf, 8);
+ qemu_get_buffer(f, s->data_buf, 1024);
+
+ qemu_get_be32s(f, &s->remote_wakeup);
+ qemu_get_be32s(f, &s->setup_state);
+ qemu_get_be32s(f, &s->setup_len);
+ qemu_get_be32s(f, &s->setup_index);
+
+ return 0;
+}
Index: ioemu/hw/usb-ohci.c
===================================================================
--- ioemu.orig/hw/usb-ohci.c 2007-05-03 09:56:32.000000000 +0100
+++ ioemu/hw/usb-ohci.c 2007-05-03 10:07:54.000000000 +0100
@@ -1186,5 +1186,7 @@
qemu_register_usb_port(&ohci->rhport[i].port, ohci, i, ohci_attach);
}
+ register_savevm("OHCI USB", 0, 1, generic_pci_save, generic_pci_load, ohci);
+
ohci_reset(ohci);
}
Index: ioemu/hw/usb.h
===================================================================
--- ioemu.orig/hw/usb.h 2007-05-03 09:56:32.000000000 +0100
+++ ioemu/hw/usb.h 2007-05-03 10:07:54.000000000 +0100
@@ -176,3 +176,9 @@
/* usb-msd.c */
USBDevice *usb_msd_init(const char *filename);
+
+/* usb.c */
+void generic_usb_save(QEMUFile* f, void *opaque);
+int generic_usb_load(QEMUFile* f, void *opaque, int version_id);
+
+
Index: ioemu/hw/usb-uhci.c
===================================================================
--- ioemu.orig/hw/usb-uhci.c 2007-05-03 09:56:32.000000000 +0100
+++ ioemu/hw/usb-uhci.c 2007-05-03 10:07:54.000000000 +0100
@@ -638,6 +638,51 @@
register_ioport_read(addr, 32, 1, uhci_ioport_readb, s);
}
+void uhci_usb_save(QEMUFile *f, void *opaque)
+{
+ int i;
+ UHCIState *s = (UHCIState*)opaque;
+
+ qemu_put_be16s(f, &s->cmd);
+ qemu_put_be16s(f, &s->status);
+ qemu_put_be16s(f, &s->intr);
+ qemu_put_be16s(f, &s->frnum);
+ qemu_put_be32s(f, &s->fl_base_addr);
+ qemu_put_8s(f, &s->sof_timing);
+ qemu_put_8s(f, &s->status2);
+
+ for(i = 0; i < NB_PORTS; i++) {
+ qemu_put_be16s(f, &s->ports[i].ctrl);
+ }
+
+ qemu_put_timer(f, s->frame_timer);
+}
+
+int uhci_usb_load(QEMUFile *f, void *opaque, int version_id)
+{
+ int i;
+ UHCIState *s = (UHCIState*)opaque;
+
+ if (version_id != 1)
+ return -EINVAL;
+
+ qemu_get_be16s(f, &s->cmd);
+ qemu_get_be16s(f, &s->status);
+ qemu_get_be16s(f, &s->intr);
+ qemu_get_be16s(f, &s->frnum);
+ qemu_get_be32s(f, &s->fl_base_addr);
+ qemu_get_8s(f, &s->sof_timing);
+ qemu_get_8s(f, &s->status2);
+
+ for(i = 0; i < NB_PORTS; i++) {
+ qemu_get_be16s(f, &s->ports[i].ctrl);
+ }
+
+ qemu_get_timer(f, s->frame_timer);
+
+ return 0;
+}
+
void usb_uhci_init(PCIBus *bus, int devfn)
{
UHCIState *s;
@@ -671,4 +716,8 @@
to rely on this. */
pci_register_io_region(&s->dev, 4, 0x20,
PCI_ADDRESS_SPACE_IO, uhci_map);
+
+ register_savevm("UHCI_usb_pci", 0, 1, generic_pci_save, generic_pci_load, s);
+
+ register_savevm("UHCI usb controller", 0, 1, uhci_usb_save, uhci_usb_load, s);
}
+4 -4
View File
@@ -8,9 +8,9 @@ Signed-off-by: Steven Smith <sos22@cam.ac.uk>
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-12-08 18:21:56.000000000 +0000
+++ ioemu/vl.c 2006-12-08 18:22:42.000000000 +0000
@@ -2530,6 +2530,7 @@
--- ioemu.orig/vl.c 2007-05-03 10:09:02.000000000 +0100
+++ ioemu/vl.c 2007-05-03 10:09:03.000000000 +0100
@@ -2586,6 +2586,7 @@
int is_waitconnect = 1;
const char *ptr;
struct sockaddr_in saddr;
@@ -18,7 +18,7 @@ Index: ioemu/vl.c
if (parse_host_port(&saddr, host_str) < 0)
goto fail;
@@ -2598,6 +2599,8 @@
@@ -2654,6 +2655,8 @@
}
}
s->fd = fd;
+11 -11
View File
@@ -1,7 +1,7 @@
Index: ioemu/cpu-all.h
===================================================================
--- ioemu.orig/cpu-all.h 2006-08-06 02:14:09.796902750 +0100
+++ ioemu/cpu-all.h 2006-08-06 02:15:39.707879423 +0100
--- ioemu.orig/cpu-all.h 2007-05-02 16:04:46.000000000 +0100
+++ ioemu/cpu-all.h 2007-05-02 16:05:50.000000000 +0100
@@ -822,7 +822,7 @@
/* memory API */
@@ -13,8 +13,8 @@ Index: ioemu/cpu-all.h
extern uint8_t *phys_ram_dirty;
Index: ioemu/hw/pc.c
===================================================================
--- ioemu.orig/hw/pc.c 2006-08-06 02:14:09.797902638 +0100
+++ ioemu/hw/pc.c 2006-08-06 02:15:39.708879311 +0100
--- ioemu.orig/hw/pc.c 2007-05-02 16:04:46.000000000 +0100
+++ ioemu/hw/pc.c 2007-05-02 16:05:50.000000000 +0100
@@ -155,7 +155,7 @@
}
@@ -53,8 +53,8 @@ Index: ioemu/hw/pc.c
const char *kernel_filename,
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-08-06 02:15:31.040845624 +0100
+++ ioemu/vl.c 2006-08-06 02:15:39.711878977 +0100
--- ioemu.orig/vl.c 2007-05-02 16:05:50.000000000 +0100
+++ ioemu/vl.c 2007-05-02 16:05:50.000000000 +0100
@@ -122,7 +122,7 @@
const char* keyboard_layout = NULL;
int64_t ticks_per_sec;
@@ -64,7 +64,7 @@ Index: ioemu/vl.c
int pit_min_timer_count = 0;
int nb_nics;
NICInfo nd_table[MAX_NICS];
@@ -5895,7 +5895,7 @@
@@ -5899,7 +5899,7 @@
help();
break;
case QEMU_OPTION_m:
@@ -75,8 +75,8 @@ Index: ioemu/vl.c
if (ram_size > PHYS_RAM_MAX_SIZE) {
Index: ioemu/vl.h
===================================================================
--- ioemu.orig/vl.h 2006-08-06 02:15:10.368150219 +0100
+++ ioemu/vl.h 2006-08-06 02:15:39.711878977 +0100
--- ioemu.orig/vl.h 2007-05-02 16:05:50.000000000 +0100
+++ ioemu/vl.h 2007-05-02 16:05:50.000000000 +0100
@@ -146,7 +146,7 @@
extern int xc_handle;
extern int domid;
@@ -97,8 +97,8 @@ Index: ioemu/vl.h
const char *kernel_filename, const char *kernel_cmdline,
Index: ioemu/hw/vga.c
===================================================================
--- ioemu.orig/hw/vga.c 2006-08-06 02:15:10.364150665 +0100
+++ ioemu/hw/vga.c 2006-08-06 02:15:39.712878866 +0100
--- ioemu.orig/hw/vga.c 2007-05-02 16:05:50.000000000 +0100
+++ ioemu/hw/vga.c 2007-05-02 16:05:50.000000000 +0100
@@ -1365,7 +1365,8 @@
static void vga_draw_graphic(VGAState *s, int full_update)
{
@@ -0,0 +1,22 @@
Index: ioemu/block.c
===================================================================
--- ioemu.orig/block.c 2007-05-03 14:55:04.000000000 +0100
+++ ioemu/block.c 2007-05-03 14:59:20.000000000 +0100
@@ -420,6 +420,8 @@
if (!bs->inserted)
return -1;
+ if (sector_num < 0)
+ return -1;
while (nb_sectors > 0) {
if (sector_num == 0 && bs->boot_sector_enabled) {
@@ -458,6 +460,8 @@
return -1;
if (bs->read_only)
return -1;
+ if (sector_num < 0)
+ return -1;
if (sector_num == 0 && bs->boot_sector_enabled && nb_sectors > 0) {
memcpy(bs->boot_sector_data, buf, 512);
}
+12 -12
View File
@@ -1,8 +1,8 @@
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-12-20 15:12:08.000000000 +0000
+++ ioemu/vl.c 2006-12-20 15:21:19.000000000 +0000
@@ -125,7 +125,7 @@
--- ioemu.orig/vl.c 2007-05-03 15:20:35.000000000 +0100
+++ ioemu/vl.c 2007-05-03 15:20:43.000000000 +0100
@@ -126,7 +126,7 @@
struct sockaddr_in vnclisten_addr;
const char* keyboard_layout = NULL;
int64_t ticks_per_sec;
@@ -11,7 +11,7 @@ Index: ioemu/vl.c
uint64_t ram_size;
int pit_min_timer_count = 0;
int nb_nics;
@@ -6059,14 +6059,14 @@
@@ -6150,14 +6150,14 @@
break;
#endif /* !CONFIG_DM */
case QEMU_OPTION_boot:
@@ -34,7 +34,7 @@ Index: ioemu/vl.c
exit(1);
}
break;
@@ -6333,6 +6333,7 @@
@@ -6424,6 +6424,7 @@
fd_filename[0] == '\0')
help();
@@ -42,7 +42,7 @@ Index: ioemu/vl.c
/* boot to cd by default if no hard disk */
if (hd_filename[0] == '\0' && boot_device == 'c') {
if (fd_filename[0] != '\0')
@@ -6340,6 +6341,7 @@
@@ -6431,6 +6432,7 @@
else
boot_device = 'd';
}
@@ -50,7 +50,7 @@ Index: ioemu/vl.c
#endif /* !CONFIG_DM */
setvbuf(stdout, NULL, _IOLBF, 0);
@@ -6590,6 +6592,7 @@
@@ -6692,6 +6694,7 @@
ds, fd_filename, snapshot,
kernel_filename, kernel_cmdline, initrd_filename,
timeoffset);
@@ -60,8 +60,8 @@ Index: ioemu/vl.c
if (usb_enabled) {
Index: ioemu/vl.h
===================================================================
--- ioemu.orig/vl.h 2006-12-20 15:12:08.000000000 +0000
+++ ioemu/vl.h 2006-12-20 15:21:14.000000000 +0000
--- ioemu.orig/vl.h 2007-05-03 15:20:39.000000000 +0100
+++ ioemu/vl.h 2007-05-03 15:20:43.000000000 +0100
@@ -578,7 +578,7 @@
#ifndef QEMU_TOOL
@@ -71,7 +71,7 @@ Index: ioemu/vl.h
DisplayState *ds, const char **fd_filename, int snapshot,
const char *kernel_filename, const char *kernel_cmdline,
const char *initrd_filename, time_t timeoffset);
@@ -1023,7 +1023,7 @@
@@ -1024,7 +1024,7 @@
uint32_t start, uint32_t count);
int PPC_NVRAM_set_params (m48t59_t *nvram, uint16_t NVRAM_size,
const unsigned char *arch,
@@ -82,8 +82,8 @@ Index: ioemu/vl.h
uint32_t initrd_image, uint32_t initrd_size,
Index: ioemu/hw/pc.c
===================================================================
--- ioemu.orig/hw/pc.c 2006-12-20 15:12:08.000000000 +0000
+++ ioemu/hw/pc.c 2006-12-20 15:21:19.000000000 +0000
--- ioemu.orig/hw/pc.c 2007-05-03 15:20:35.000000000 +0100
+++ ioemu/hw/pc.c 2007-05-03 15:20:43.000000000 +0100
@@ -158,8 +158,25 @@
rtc_set_memory(s, info_ofs + 8, sectors);
}
@@ -0,0 +1,350 @@
Index: ioemu/hw/cirrus_vga.c
===================================================================
--- ioemu.orig/hw/cirrus_vga.c 2007-05-03 14:55:45.000000000 +0100
+++ ioemu/hw/cirrus_vga.c 2007-05-03 14:58:05.000000000 +0100
@@ -601,7 +601,8 @@
off_cur_end = off_cur + bytesperline;
off_cur &= TARGET_PAGE_MASK;
while (off_cur < off_cur_end) {
- cpu_physical_memory_set_dirty(s->vram_offset + off_cur);
+ cpu_physical_memory_set_dirty(s->vram_offset +
+ (off_cur & s->cirrus_addr_mask));
off_cur += TARGET_PAGE_SIZE;
}
off_begin += off_pitch;
Index: ioemu/hw/cirrus_vga_rop.h
===================================================================
--- ioemu.orig/hw/cirrus_vga_rop.h 2007-05-02 10:30:05.000000000 +0100
+++ ioemu/hw/cirrus_vga_rop.h 2007-05-03 14:58:22.000000000 +0100
@@ -22,18 +22,36 @@
* THE SOFTWARE.
*/
+#define get_base(p, s, b) do { \
+ if ((p) >= (s)->vram_ptr && (p) < (s)->vram_ptr + (s)->vram_size) \
+ (b) = (s)->vram_ptr; \
+ else if ((p) >= &(s)->cirrus_bltbuf[0] && \
+ (p) < &(s)->cirrus_bltbuf[CIRRUS_BLTBUFSIZE]) \
+ (b) = &(s)->cirrus_bltbuf[0]; \
+ else \
+ return; \
+} while(0)
+
+#define m(x) ((x) & s->cirrus_addr_mask)
+
static void
glue(cirrus_bitblt_rop_fwd_, ROP_NAME)(CirrusVGAState *s,
- uint8_t *dst,const uint8_t *src,
+ uint8_t *dst_,const uint8_t *src_,
int dstpitch,int srcpitch,
int bltwidth,int bltheight)
{
int x,y;
+ uint32_t dst, src;
+ uint8_t *dst_base, *src_base;
+ get_base(dst_, s, dst_base);
+ get_base(src_, s, src_base);
+ dst = dst_ - dst_base;
+ src = src_ - src_base;
dstpitch -= bltwidth;
srcpitch -= bltwidth;
for (y = 0; y < bltheight; y++) {
for (x = 0; x < bltwidth; x++) {
- ROP_OP(*dst, *src);
+ ROP_OP(*(dst_base + m(dst)), *(src_base + m(src)));
dst++;
src++;
}
@@ -44,16 +62,22 @@
static void
glue(cirrus_bitblt_rop_bkwd_, ROP_NAME)(CirrusVGAState *s,
- uint8_t *dst,const uint8_t *src,
+ uint8_t *dst_,const uint8_t *src_,
int dstpitch,int srcpitch,
int bltwidth,int bltheight)
{
int x,y;
+ uint32_t dst, src;
+ uint8_t *dst_base, *src_base;
+ get_base(dst_, s, dst_base);
+ get_base(src_, s, src_base);
+ dst = dst_ - dst_base;
+ src = src_ - src_base;
dstpitch += bltwidth;
srcpitch += bltwidth;
for (y = 0; y < bltheight; y++) {
for (x = 0; x < bltwidth; x++) {
- ROP_OP(*dst, *src);
+ ROP_OP(*(dst_base + m(dst)), *(src_base + m(src)));
dst--;
src--;
}
@@ -76,3 +100,6 @@
#undef ROP_NAME
#undef ROP_OP
+
+#undef get_base
+#undef m
Index: ioemu/hw/cirrus_vga_rop2.h
===================================================================
--- ioemu.orig/hw/cirrus_vga_rop2.h 2007-05-02 10:30:05.000000000 +0100
+++ ioemu/hw/cirrus_vga_rop2.h 2007-05-03 14:58:42.000000000 +0100
@@ -23,36 +23,42 @@
*/
#if DEPTH == 8
-#define PUTPIXEL() ROP_OP(d[0], col)
+#define PUTPIXEL() ROP_OP((dst_base + m(d))[0], col)
#elif DEPTH == 16
-#define PUTPIXEL() ROP_OP(((uint16_t *)d)[0], col);
+#define PUTPIXEL() ROP_OP(((uint16_t *)(dst_base + m(d)))[0], col);
#elif DEPTH == 24
-#define PUTPIXEL() ROP_OP(d[0], col); \
- ROP_OP(d[1], (col >> 8)); \
- ROP_OP(d[2], (col >> 16))
+#define PUTPIXEL() ROP_OP((dst_base + m(d))[0], col); \
+ ROP_OP((dst_base + m(d))[1], (col >> 8)); \
+ ROP_OP((dst_base + m(d))[2], (col >> 16))
#elif DEPTH == 32
-#define PUTPIXEL() ROP_OP(((uint32_t *)d)[0], col)
+#define PUTPIXEL() ROP_OP(((uint32_t *)(dst_base + m(d)))[0], col)
#else
#error unsupported DEPTH
#endif
static void
glue(glue(glue(cirrus_patternfill_, ROP_NAME), _),DEPTH)
- (CirrusVGAState * s, uint8_t * dst,
- const uint8_t * src,
+ (CirrusVGAState * s, uint8_t * dst_,
+ const uint8_t * src_,
int dstpitch, int srcpitch,
int bltwidth, int bltheight)
{
- uint8_t *d;
+ uint8_t *dst_base, *src_base;
+ uint32_t src, dst;
+ uint32_t d;
int x, y, pattern_y, pattern_pitch, pattern_x;
unsigned int col;
- const uint8_t *src1;
+ uint32_t src1;
#if DEPTH == 24
int skipleft = s->gr[0x2f] & 0x1f;
#else
int skipleft = (s->gr[0x2f] & 0x07) * (DEPTH / 8);
#endif
+ get_base(dst_, s, dst_base);
+ get_base(src_, s, src_base);
+ dst = dst_ - dst_base;
+ src = src_ - src_base;
#if DEPTH == 8
pattern_pitch = 8;
#elif DEPTH == 16
@@ -67,19 +73,19 @@
src1 = src + pattern_y * pattern_pitch;
for (x = skipleft; x < bltwidth; x += (DEPTH / 8)) {
#if DEPTH == 8
- col = src1[pattern_x];
+ col = *(src_base + m(src1 + pattern_x));
pattern_x = (pattern_x + 1) & 7;
#elif DEPTH == 16
- col = ((uint16_t *)(src1 + pattern_x))[0];
+ col = *(uint16_t *)(src_base + m(src1 + pattern_x));
pattern_x = (pattern_x + 2) & 15;
#elif DEPTH == 24
{
- const uint8_t *src2 = src1 + pattern_x * 3;
+ const uint8_t *src2 = src_base + m(src1 + pattern_x * 3);
col = src2[0] | (src2[1] << 8) | (src2[2] << 16);
pattern_x = (pattern_x + 1) & 7;
}
#else
- col = ((uint32_t *)(src1 + pattern_x))[0];
+ col = *(uint32_t *)(src_base + m(src1 + pattern_x));
pattern_x = (pattern_x + 4) & 31;
#endif
PUTPIXEL();
@@ -93,12 +99,14 @@
/* NOTE: srcpitch is ignored */
static void
glue(glue(glue(cirrus_colorexpand_transp_, ROP_NAME), _),DEPTH)
- (CirrusVGAState * s, uint8_t * dst,
- const uint8_t * src,
+ (CirrusVGAState * s, uint8_t * dst_,
+ const uint8_t * src_,
int dstpitch, int srcpitch,
int bltwidth, int bltheight)
{
- uint8_t *d;
+ uint8_t *dst_base, *src_base;
+ uint32_t src, dst;
+ uint32_t d;
int x, y;
unsigned bits, bits_xor;
unsigned int col;
@@ -112,6 +120,10 @@
int dstskipleft = srcskipleft * (DEPTH / 8);
#endif
+ get_base(dst_, s, dst_base);
+ get_base(src_, s, src_base);
+ dst = dst_ - dst_base;
+ src = src_ - src_base;
if (s->cirrus_blt_modeext & CIRRUS_BLTMODEEXT_COLOREXPINV) {
bits_xor = 0xff;
col = s->cirrus_blt_bgcol;
@@ -122,12 +134,12 @@
for(y = 0; y < bltheight; y++) {
bitmask = 0x80 >> srcskipleft;
- bits = *src++ ^ bits_xor;
+ bits = *(src_base + m(src++)) ^ bits_xor;
d = dst + dstskipleft;
for (x = dstskipleft; x < bltwidth; x += (DEPTH / 8)) {
if ((bitmask & 0xff) == 0) {
bitmask = 0x80;
- bits = *src++ ^ bits_xor;
+ bits = *(src_base + m(src++)) ^ bits_xor;
}
index = (bits & bitmask);
if (index) {
@@ -142,13 +154,15 @@
static void
glue(glue(glue(cirrus_colorexpand_, ROP_NAME), _),DEPTH)
- (CirrusVGAState * s, uint8_t * dst,
- const uint8_t * src,
+ (CirrusVGAState * s, uint8_t * dst_,
+ const uint8_t * src_,
int dstpitch, int srcpitch,
int bltwidth, int bltheight)
{
+ uint8_t *dst_base, *src_base;
+ uint32_t src, dst;
uint32_t colors[2];
- uint8_t *d;
+ uint32_t d;
int x, y;
unsigned bits;
unsigned int col;
@@ -156,16 +170,20 @@
int srcskipleft = s->gr[0x2f] & 0x07;
int dstskipleft = srcskipleft * (DEPTH / 8);
+ get_base(dst_, s, dst_base);
+ get_base(src_, s, src_base);
+ dst = dst_ - dst_base;
+ src = src_ - src_base;
colors[0] = s->cirrus_blt_bgcol;
colors[1] = s->cirrus_blt_fgcol;
for(y = 0; y < bltheight; y++) {
bitmask = 0x80 >> srcskipleft;
- bits = *src++;
+ bits = *(src_base + m(src++));
d = dst + dstskipleft;
for (x = dstskipleft; x < bltwidth; x += (DEPTH / 8)) {
if ((bitmask & 0xff) == 0) {
bitmask = 0x80;
- bits = *src++;
+ bits = *(src_base + m(src++));
}
col = colors[!!(bits & bitmask)];
PUTPIXEL();
@@ -178,12 +196,14 @@
static void
glue(glue(glue(cirrus_colorexpand_pattern_transp_, ROP_NAME), _),DEPTH)
- (CirrusVGAState * s, uint8_t * dst,
- const uint8_t * src,
+ (CirrusVGAState * s, uint8_t * dst_,
+ const uint8_t * src_,
int dstpitch, int srcpitch,
int bltwidth, int bltheight)
{
- uint8_t *d;
+ uint8_t *dst_base, *src_base;
+ uint32_t src, dst;
+ uint32_t d;
int x, y, bitpos, pattern_y;
unsigned int bits, bits_xor;
unsigned int col;
@@ -195,6 +215,10 @@
int dstskipleft = srcskipleft * (DEPTH / 8);
#endif
+ get_base(dst_, s, dst_base);
+ get_base(src_, s, src_base);
+ dst = dst_ - dst_base;
+ src = src_ - src_base;
if (s->cirrus_blt_modeext & CIRRUS_BLTMODEEXT_COLOREXPINV) {
bits_xor = 0xff;
col = s->cirrus_blt_bgcol;
@@ -205,7 +229,7 @@
pattern_y = s->cirrus_blt_srcaddr & 7;
for(y = 0; y < bltheight; y++) {
- bits = src[pattern_y] ^ bits_xor;
+ bits = *(src_base + m(src + pattern_y)) ^ bits_xor;
bitpos = 7 - srcskipleft;
d = dst + dstskipleft;
for (x = dstskipleft; x < bltwidth; x += (DEPTH / 8)) {
@@ -222,25 +246,31 @@
static void
glue(glue(glue(cirrus_colorexpand_pattern_, ROP_NAME), _),DEPTH)
- (CirrusVGAState * s, uint8_t * dst,
- const uint8_t * src,
+ (CirrusVGAState * s, uint8_t * dst_,
+ const uint8_t * src_,
int dstpitch, int srcpitch,
int bltwidth, int bltheight)
{
+ uint8_t *dst_base, *src_base;
+ uint32_t src, dst;
uint32_t colors[2];
- uint8_t *d;
+ uint32_t d;
int x, y, bitpos, pattern_y;
unsigned int bits;
unsigned int col;
int srcskipleft = s->gr[0x2f] & 0x07;
int dstskipleft = srcskipleft * (DEPTH / 8);
+ get_base(dst_, s, dst_base);
+ get_base(src_, s, src_base);
+ dst = dst_ - dst_base;
+ src = src_ - src_base;
colors[0] = s->cirrus_blt_bgcol;
colors[1] = s->cirrus_blt_fgcol;
pattern_y = s->cirrus_blt_srcaddr & 7;
for(y = 0; y < bltheight; y++) {
- bits = src[pattern_y];
+ bits = *(src_base + m(src + pattern_y));
bitpos = 7 - srcskipleft;
d = dst + dstskipleft;
for (x = dstskipleft; x < bltwidth; x += (DEPTH / 8)) {
@@ -257,13 +287,17 @@
static void
glue(glue(glue(cirrus_fill_, ROP_NAME), _),DEPTH)
(CirrusVGAState *s,
- uint8_t *dst, int dst_pitch,
+ uint8_t *dst_, int dst_pitch,
int width, int height)
{
- uint8_t *d, *d1;
+ uint8_t *dst_base;
+ uint32_t dst;
+ uint32_t d, d1;
uint32_t col;
int x, y;
+ get_base(dst_, s, dst_base);
+ dst = dst_ - dst_base;
col = s->cirrus_blt_fgcol;
d1 = dst;
+9 -9
View File
@@ -1,7 +1,7 @@
Index: ioemu/hw/vga.c
===================================================================
--- ioemu.orig/hw/vga.c 2006-10-24 14:44:03.000000000 +0100
+++ ioemu/hw/vga.c 2006-10-24 14:45:22.000000000 +0100
--- ioemu.orig/hw/vga.c 2007-05-02 16:04:46.000000000 +0100
+++ ioemu/hw/vga.c 2007-05-02 16:05:50.000000000 +0100
@@ -1622,7 +1622,9 @@
static void vga_save(QEMUFile *f, void *opaque)
{
@@ -26,8 +26,8 @@ Index: ioemu/hw/vga.c
return -EINVAL;
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-10-24 14:44:08.000000000 +0100
+++ ioemu/vl.c 2006-10-24 14:45:29.000000000 +0100
--- ioemu.orig/vl.c 2007-05-02 16:05:50.000000000 +0100
+++ ioemu/vl.c 2007-05-02 16:05:50.000000000 +0100
@@ -39,6 +39,7 @@
#include <sys/ioctl.h>
#include <sys/socket.h>
@@ -74,7 +74,7 @@ Index: ioemu/vl.c
#ifdef USE_KQEMU
{ "no-kqemu", 0, QEMU_OPTION_no_kqemu },
{ "kernel-kqemu", 0, QEMU_OPTION_kernel_kqemu },
@@ -5849,9 +5854,11 @@
@@ -5853,9 +5858,11 @@
fd_bootchk = 0;
break;
#endif
@@ -88,8 +88,8 @@ Index: ioemu/vl.c
fprintf(stderr, "qemu: too many network clients\n");
Index: ioemu/vl.h
===================================================================
--- ioemu.orig/vl.h 2006-10-24 14:44:08.000000000 +0100
+++ ioemu/vl.h 2006-10-24 14:45:22.000000000 +0100
--- ioemu.orig/vl.h 2007-05-02 16:05:50.000000000 +0100
+++ ioemu/vl.h 2007-05-02 16:05:50.000000000 +0100
@@ -957,7 +957,7 @@
unsigned long vram_offset, int vram_size, int width, int height);
@@ -101,8 +101,8 @@ Index: ioemu/vl.h
void slavio_irq_info(void *opaque);
Index: ioemu/usb-linux.c
===================================================================
--- ioemu.orig/usb-linux.c 2006-10-24 14:44:03.000000000 +0100
+++ ioemu/usb-linux.c 2006-10-24 14:44:08.000000000 +0100
--- ioemu.orig/usb-linux.c 2007-05-02 16:04:46.000000000 +0100
+++ ioemu/usb-linux.c 2007-05-02 16:05:50.000000000 +0100
@@ -26,7 +26,9 @@
#if defined(__linux__)
#include <dirent.h>
+3 -3
View File
@@ -2,9 +2,9 @@ Changes required because qemu-dm runs daemonized.
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-12-08 02:00:42.000000000 +0000
+++ ioemu/vl.c 2006-12-08 02:00:42.000000000 +0000
@@ -6038,10 +6038,11 @@
--- ioemu.orig/vl.c 2007-05-03 10:11:05.000000000 +0100
+++ ioemu/vl.c 2007-05-03 10:11:05.000000000 +0100
@@ -6129,10 +6129,11 @@
}
break;
case QEMU_OPTION_nographic:
+44 -20
View File
@@ -1,7 +1,7 @@
Index: ioemu/Makefile.target
===================================================================
--- ioemu.orig/Makefile.target 2006-12-08 01:41:05.000000000 +0000
+++ ioemu/Makefile.target 2006-12-08 01:41:10.000000000 +0000
--- ioemu.orig/Makefile.target 2007-05-02 15:48:40.000000000 +0100
+++ ioemu/Makefile.target 2007-05-02 16:04:46.000000000 +0100
@@ -303,7 +303,7 @@
endif
@@ -13,8 +13,8 @@ Index: ioemu/Makefile.target
VL_OBJS+=tap-win32.o
Index: ioemu/configure
===================================================================
--- ioemu.orig/configure 2006-12-08 01:40:58.000000000 +0000
+++ ioemu/configure 2006-12-08 01:41:10.000000000 +0000
--- ioemu.orig/configure 2007-05-02 15:48:40.000000000 +0100
+++ ioemu/configure 2007-05-02 16:04:46.000000000 +0100
@@ -75,8 +75,8 @@
bigendian="no"
mingw32="no"
@@ -37,8 +37,8 @@ Index: ioemu/configure
target_user_only="yes"
Index: ioemu/cpu-all.h
===================================================================
--- ioemu.orig/cpu-all.h 2006-12-08 01:40:58.000000000 +0000
+++ ioemu/cpu-all.h 2006-12-08 01:41:10.000000000 +0000
--- ioemu.orig/cpu-all.h 2007-05-02 15:48:36.000000000 +0100
+++ ioemu/cpu-all.h 2007-05-02 16:04:46.000000000 +0100
@@ -690,7 +690,9 @@
void page_set_flags(target_ulong start, target_ulong end, int flags);
void page_unprotect_range(target_ulong data, target_ulong data_size);
@@ -64,8 +64,8 @@ Index: ioemu/cpu-all.h
void cpu_dump_state(CPUState *env, FILE *f,
Index: ioemu/disas.h
===================================================================
--- ioemu.orig/disas.h 2006-12-08 01:40:58.000000000 +0000
+++ ioemu/disas.h 2006-12-08 01:41:10.000000000 +0000
--- ioemu.orig/disas.h 2007-05-02 15:48:36.000000000 +0100
+++ ioemu/disas.h 2007-05-02 15:48:40.000000000 +0100
@@ -1,6 +1,7 @@
#ifndef _QEMU_DISAS_H
#define _QEMU_DISAS_H
@@ -83,8 +83,8 @@ Index: ioemu/disas.h
#endif /* _QEMU_DISAS_H */
Index: ioemu/exec-all.h
===================================================================
--- ioemu.orig/exec-all.h 2006-12-08 01:40:58.000000000 +0000
+++ ioemu/exec-all.h 2006-12-08 01:41:10.000000000 +0000
--- ioemu.orig/exec-all.h 2007-05-02 15:48:36.000000000 +0100
+++ ioemu/exec-all.h 2007-05-02 16:04:45.000000000 +0100
@@ -509,7 +509,7 @@
extern int tb_invalidated_flag;
@@ -105,8 +105,8 @@ Index: ioemu/exec-all.h
return addr;
Index: ioemu/hw/pc.c
===================================================================
--- ioemu.orig/hw/pc.c 2006-12-08 01:40:58.000000000 +0000
+++ ioemu/hw/pc.c 2006-12-08 01:41:10.000000000 +0000
--- ioemu.orig/hw/pc.c 2007-05-02 15:48:36.000000000 +0100
+++ ioemu/hw/pc.c 2007-05-02 16:04:46.000000000 +0100
@@ -73,6 +73,7 @@
}
}
@@ -184,8 +184,8 @@ Index: ioemu/hw/pc.c
if (serial_hds[i]) {
Index: ioemu/hw/vga_int.h
===================================================================
--- ioemu.orig/hw/vga_int.h 2006-12-08 01:40:58.000000000 +0000
+++ ioemu/hw/vga_int.h 2006-12-08 01:41:10.000000000 +0000
--- ioemu.orig/hw/vga_int.h 2007-05-02 15:48:36.000000000 +0100
+++ ioemu/hw/vga_int.h 2007-05-02 16:04:45.000000000 +0100
@@ -28,7 +28,7 @@
#define ST01_DISP_ENABLE 0x01
@@ -197,8 +197,8 @@ Index: ioemu/hw/vga_int.h
#define VBE_DISPI_MAX_YRES 1200
Index: ioemu/monitor.c
===================================================================
--- ioemu.orig/monitor.c 2006-12-08 01:40:58.000000000 +0000
+++ ioemu/monitor.c 2006-12-08 01:41:10.000000000 +0000
--- ioemu.orig/monitor.c 2007-05-02 15:48:36.000000000 +0100
+++ ioemu/monitor.c 2007-05-02 16:04:46.000000000 +0100
@@ -68,6 +68,12 @@
void term_flush(void)
@@ -429,8 +429,8 @@ Index: ioemu/monitor.c
{
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-12-08 01:40:58.000000000 +0000
+++ ioemu/vl.c 2006-12-08 01:41:10.000000000 +0000
--- ioemu.orig/vl.c 2007-05-02 15:48:36.000000000 +0100
+++ ioemu/vl.c 2007-05-02 16:05:40.000000000 +0100
@@ -422,12 +422,15 @@
void hw_error(const char *fmt, ...)
{
@@ -489,7 +489,31 @@ Index: ioemu/vl.c
/***********************************************************/
/* machine registration */
@@ -6054,6 +6078,7 @@
@@ -5664,15 +5688,19 @@
#endif
cyls = heads = secs = 0;
translation = BIOS_ATA_TRANSLATION_AUTO;
- pstrcpy(monitor_device, sizeof(monitor_device), "vc");
+ pstrcpy(monitor_device, sizeof(monitor_device), "null");
- pstrcpy(serial_devices[0], sizeof(serial_devices[0]), "vc");
- for(i = 1; i < MAX_SERIAL_PORTS; i++)
+ for(i = 0; i < MAX_SERIAL_PORTS; i++)
serial_devices[i][0] = '\0';
serial_device_index = 0;
-
+
+#ifndef CONFIG_DM
pstrcpy(parallel_devices[0], sizeof(parallel_devices[0]), "vc");
for(i = 1; i < MAX_PARALLEL_PORTS; i++)
+#else
+ /* Xen steals IRQ7 for PCI. Disable LPT1 by default. */
+ for(i = 0; i < MAX_PARALLEL_PORTS; i++)
+#endif
parallel_devices[i][0] = '\0';
parallel_device_index = 0;
@@ -6054,6 +6082,7 @@
socket_init();
#endif
@@ -497,7 +521,7 @@ Index: ioemu/vl.c
/* init network clients */
if (nb_net_clients == 0) {
/* if no clients, we use a default config */
@@ -6063,6 +6088,7 @@
@@ -6063,6 +6092,7 @@
"user");
nb_net_clients = 2;
}
@@ -0,0 +1,13 @@
Index: ioemu/hw/dma.c
===================================================================
--- ioemu.orig/hw/dma.c 2007-05-02 10:30:05.000000000 +0100
+++ ioemu/hw/dma.c 2007-05-03 14:59:53.000000000 +0100
@@ -340,6 +340,8 @@
#endif
r = dma_controllers[ncont].regs + ichan;
+ if (r->transfer_handler == NULL)
+ return;
n = r->transfer_handler (r->opaque, ichan + (ncont << 2),
r->now[COUNT], (r->base[COUNT] + 1) << ncont);
r->now[COUNT] = n;
+4 -4
View File
@@ -1,7 +1,7 @@
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-10-24 14:36:58.000000000 +0100
+++ ioemu/vl.c 2006-10-24 14:37:03.000000000 +0100
--- ioemu.orig/vl.c 2007-05-02 16:05:51.000000000 +0100
+++ ioemu/vl.c 2007-05-02 16:05:51.000000000 +0100
@@ -5234,7 +5234,7 @@
"-S freeze CPU at startup (use 'c' to start execution)\n"
"-s wait gdb connection to port %d\n"
@@ -38,7 +38,7 @@ Index: ioemu/vl.c
LIST_INIT (&vm_change_state_head);
#ifndef _WIN32
{
@@ -5715,6 +5717,11 @@
@@ -5719,6 +5721,11 @@
nb_nics = 0;
/* default mac address of the first network interface */
@@ -50,7 +50,7 @@ Index: ioemu/vl.c
optind = 1;
for(;;) {
if (optind >= argc)
@@ -5905,7 +5912,7 @@
@@ -5909,7 +5916,7 @@
exit(1);
}
break;
+12 -12
View File
@@ -1,8 +1,8 @@
Index: ioemu/hw/pci.c
===================================================================
--- ioemu.orig/hw/pci.c 2006-12-08 02:02:05.000000000 +0000
+++ ioemu/hw/pci.c 2006-12-08 18:16:55.000000000 +0000
@@ -286,6 +286,7 @@
--- ioemu.orig/hw/pci.c 2007-05-03 15:20:35.000000000 +0100
+++ ioemu/hw/pci.c 2007-05-03 15:20:43.000000000 +0100
@@ -289,6 +289,7 @@
case 0x0b:
case 0x0e:
case 0x10 ... 0x27: /* base */
@@ -10,7 +10,7 @@ Index: ioemu/hw/pci.c
case 0x30 ... 0x33: /* rom */
case 0x3d:
can_write = 0;
@@ -318,6 +319,18 @@
@@ -321,6 +322,18 @@
break;
}
if (can_write) {
@@ -31,9 +31,9 @@ Index: ioemu/hw/pci.c
addr++;
Index: ioemu/hw/rtl8139.c
===================================================================
--- ioemu.orig/hw/rtl8139.c 2006-12-08 02:02:05.000000000 +0000
+++ ioemu/hw/rtl8139.c 2006-12-08 18:16:47.000000000 +0000
@@ -3423,6 +3423,8 @@
--- ioemu.orig/hw/rtl8139.c 2007-05-03 15:20:35.000000000 +0100
+++ ioemu/hw/rtl8139.c 2007-05-03 15:20:43.000000000 +0100
@@ -3424,6 +3424,8 @@
pci_conf[0x0e] = 0x00; /* header_type */
pci_conf[0x3d] = 1; /* interrupt pin 0 */
pci_conf[0x34] = 0xdc;
@@ -44,9 +44,9 @@ Index: ioemu/hw/rtl8139.c
Index: ioemu/hw/usb-uhci.c
===================================================================
--- ioemu.orig/hw/usb-uhci.c 2006-12-08 02:02:05.000000000 +0000
+++ ioemu/hw/usb-uhci.c 2006-12-08 02:02:38.000000000 +0000
@@ -659,6 +659,8 @@
--- ioemu.orig/hw/usb-uhci.c 2007-05-03 15:20:35.000000000 +0100
+++ ioemu/hw/usb-uhci.c 2007-05-03 15:20:43.000000000 +0100
@@ -704,6 +704,8 @@
pci_conf[0x0e] = 0x00; // header_type
pci_conf[0x3d] = 4; // interrupt pin 3
pci_conf[0x60] = 0x10; // release number
@@ -57,8 +57,8 @@ Index: ioemu/hw/usb-uhci.c
qemu_register_usb_port(&s->ports[i].port, s, i, uhci_attach);
Index: ioemu/vl.h
===================================================================
--- ioemu.orig/vl.h 2006-12-08 18:16:47.000000000 +0000
+++ ioemu/vl.h 2006-12-08 18:16:55.000000000 +0000
--- ioemu.orig/vl.h 2007-05-03 15:20:43.000000000 +0100
+++ ioemu/vl.h 2007-05-03 15:20:43.000000000 +0100
@@ -650,8 +650,11 @@
#define PCI_MAX_LAT 0x3f /* 8 bits */
+47
View File
@@ -0,0 +1,47 @@
Index: ioemu/hw/cirrus_vga.c
===================================================================
--- ioemu.orig/hw/cirrus_vga.c 2007-05-03 15:06:41.000000000 +0100
+++ ioemu/hw/cirrus_vga.c 2007-05-03 15:07:16.000000000 +0100
@@ -3339,6 +3339,10 @@
pci_conf[0x0a] = PCI_CLASS_SUB_VGA;
pci_conf[0x0b] = PCI_CLASS_BASE_DISPLAY;
pci_conf[0x0e] = PCI_CLASS_HEADERTYPE_00h;
+ pci_conf[0x2c] = 0x53; /* subsystem vendor: XenSource */
+ pci_conf[0x2d] = 0x58;
+ pci_conf[0x2e] = 0x01; /* subsystem device */
+ pci_conf[0x2f] = 0x00;
/* setup VGA */
s = &d->cirrus_vga;
Index: ioemu/hw/rtl8139.c
===================================================================
--- ioemu.orig/hw/rtl8139.c 2007-05-03 15:07:16.000000000 +0100
+++ ioemu/hw/rtl8139.c 2007-05-03 15:07:16.000000000 +0100
@@ -3424,8 +3424,10 @@
pci_conf[0x0e] = 0x00; /* header_type */
pci_conf[0x3d] = 1; /* interrupt pin 0 */
pci_conf[0x34] = 0xdc;
- pci_conf[0x2c] = pci_conf[0x00]; // same as Vendor ID
- pci_conf[0x2d] = pci_conf[0x01];
+ pci_conf[0x2c] = 0x53; /* subsystem vendor: XenSource */
+ pci_conf[0x2d] = 0x58;
+ pci_conf[0x2e] = 0x01; /* subsystem device */
+ pci_conf[0x2f] = 0x00;
s = &d->rtl8139;
Index: ioemu/hw/ide.c
===================================================================
--- ioemu.orig/hw/ide.c 2007-05-03 15:07:16.000000000 +0100
+++ ioemu/hw/ide.c 2007-05-03 15:07:16.000000000 +0100
@@ -2763,6 +2763,10 @@
pci_conf[0x0a] = 0x01; // class_sub = PCI_IDE
pci_conf[0x0b] = 0x01; // class_base = PCI_mass_storage
pci_conf[0x0e] = 0x00; // header_type
+ pci_conf[0x2c] = 0x53; /* subsystem vendor: XenSource */
+ pci_conf[0x2d] = 0x58;
+ pci_conf[0x2e] = 0x01; /* subsystem device */
+ pci_conf[0x2f] = 0x00;
pci_register_io_region((PCIDevice *)d, 4, 0x10,
PCI_ADDRESS_SPACE_IO, bmdma_map);
+5 -5
View File
@@ -13,9 +13,9 @@ Signed-off-by: Keir Fraser <keir@xensource.com>
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-12-08 01:28:59.000000000 +0000
+++ ioemu/vl.c 2006-12-08 01:28:59.000000000 +0000
@@ -1684,7 +1684,7 @@
--- ioemu.orig/vl.c 2007-05-03 10:09:02.000000000 +0100
+++ ioemu/vl.c 2007-05-03 10:09:02.000000000 +0100
@@ -1740,7 +1740,7 @@
tty.c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP
|INLCR|IGNCR|ICRNL|IXON);
@@ -26,8 +26,8 @@ Index: ioemu/vl.c
switch(data_bits) {
Index: ioemu/hw/serial.c
===================================================================
--- ioemu.orig/hw/serial.c 2006-12-08 01:28:17.000000000 +0000
+++ ioemu/hw/serial.c 2006-12-08 01:29:10.000000000 +0000
--- ioemu.orig/hw/serial.c 2007-05-03 10:09:02.000000000 +0100
+++ ioemu/hw/serial.c 2007-05-03 10:09:02.000000000 +0100
@@ -73,6 +73,11 @@
#define UART_LSR_OE 0x02 /* Overrun error indicator */
#define UART_LSR_DR 0x01 /* Receiver data ready */
+7 -7
View File
@@ -1,8 +1,8 @@
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-08-06 02:18:54.847125593 +0100
+++ ioemu/vl.c 2006-08-06 02:19:00.413505070 +0100
@@ -158,6 +158,8 @@
--- ioemu.orig/vl.c 2007-05-03 10:07:47.000000000 +0100
+++ ioemu/vl.c 2007-05-03 10:07:52.000000000 +0100
@@ -159,6 +159,8 @@
int acpi_enabled = 1;
int fd_bootchk = 1;
@@ -11,7 +11,7 @@ Index: ioemu/vl.c
int xc_handle;
char domain_name[1024] = { 'H','V', 'M', 'X', 'E', 'N', '-'};
@@ -5172,6 +5174,7 @@
@@ -5173,6 +5175,7 @@
"-m megs set virtual RAM size to megs MB [default=%d]\n"
"-smp n set the number of CPUs to 'n' [default=1]\n"
"-nographic disable graphical output and redirect serial I/Os to console\n"
@@ -19,7 +19,7 @@ Index: ioemu/vl.c
#ifndef _WIN32
"-k language use keyboard layout (for example \"fr\" for French)\n"
#endif
@@ -5342,6 +5345,7 @@
@@ -5343,6 +5346,7 @@
QEMU_OPTION_no_acpi,
QEMU_OPTION_d,
@@ -27,7 +27,7 @@ Index: ioemu/vl.c
};
typedef struct QEMUOption {
@@ -5423,6 +5427,7 @@
@@ -5424,6 +5428,7 @@
{ "no-acpi", 0, QEMU_OPTION_no_acpi },
{ "d", HAS_ARG, QEMU_OPTION_d },
@@ -35,7 +35,7 @@ Index: ioemu/vl.c
{ NULL },
};
@@ -6087,6 +6092,10 @@
@@ -6092,6 +6097,10 @@
domid = atoi(optarg);
fprintf(logfile, "domid: %d\n", domid);
break;
+76 -29
View File
@@ -1,7 +1,7 @@
Index: ioemu/Makefile.target
===================================================================
--- ioemu.orig/Makefile.target 2006-12-08 01:41:10.000000000 +0000
+++ ioemu/Makefile.target 2006-12-08 01:41:11.000000000 +0000
--- ioemu.orig/Makefile.target 2007-05-03 14:53:03.000000000 +0100
+++ ioemu/Makefile.target 2007-05-03 14:53:58.000000000 +0100
@@ -62,6 +62,8 @@
QEMU_SYSTEM=qemu-fast
endif
@@ -32,8 +32,8 @@ Index: ioemu/Makefile.target
DEFINES += -DHAS_AUDIO
Index: ioemu/configure
===================================================================
--- ioemu.orig/configure 2006-12-08 01:41:10.000000000 +0000
+++ ioemu/configure 2006-12-08 01:41:11.000000000 +0000
--- ioemu.orig/configure 2007-05-03 14:53:03.000000000 +0100
+++ ioemu/configure 2007-05-03 14:53:57.000000000 +0100
@@ -373,6 +373,8 @@
if [ "$user" = "yes" ] ; then
target_list="i386-user arm-user armeb-user sparc-user ppc-user mips-user mipsel-user $target_list"
@@ -45,8 +45,8 @@ Index: ioemu/configure
fi
Index: ioemu/monitor.c
===================================================================
--- ioemu.orig/monitor.c 2006-12-08 01:41:10.000000000 +0000
+++ ioemu/monitor.c 2006-12-08 01:41:11.000000000 +0000
--- ioemu.orig/monitor.c 2007-05-03 14:53:03.000000000 +0100
+++ ioemu/monitor.c 2007-05-03 14:53:58.000000000 +0100
@@ -1262,6 +1262,10 @@
"", "show profiling information", },
{ "capture", "", do_info_capture,
@@ -60,8 +60,8 @@ Index: ioemu/monitor.c
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-12-08 01:41:10.000000000 +0000
+++ ioemu/vl.c 2006-12-08 01:41:11.000000000 +0000
--- ioemu.orig/vl.c 2007-05-03 14:53:03.000000000 +0100
+++ ioemu/vl.c 2007-05-03 14:53:59.000000000 +0100
@@ -87,7 +87,7 @@
#include "exec-all.h"
@@ -98,8 +98,8 @@ Index: ioemu/vl.c
{
Index: ioemu/vl.h
===================================================================
--- ioemu.orig/vl.h 2006-12-08 01:40:58.000000000 +0000
+++ ioemu/vl.h 2006-12-08 01:41:11.000000000 +0000
--- ioemu.orig/vl.h 2007-05-03 14:52:58.000000000 +0100
+++ ioemu/vl.h 2007-05-03 14:53:59.000000000 +0100
@@ -37,6 +37,8 @@
#include <unistd.h>
#include <fcntl.h>
@@ -132,7 +132,7 @@ Index: ioemu/vl.h
Index: ioemu/target-i386-dm/cpu.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ ioemu/target-i386-dm/cpu.h 2006-12-08 01:41:11.000000000 +0000
+++ ioemu/target-i386-dm/cpu.h 2007-05-03 14:53:58.000000000 +0100
@@ -0,0 +1,84 @@
+/*
+ * i386 virtual CPU header
@@ -221,8 +221,8 @@ Index: ioemu/target-i386-dm/cpu.h
Index: ioemu/target-i386-dm/exec-dm.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ ioemu/target-i386-dm/exec-dm.c 2006-12-08 01:41:11.000000000 +0000
@@ -0,0 +1,546 @@
+++ ioemu/target-i386-dm/exec-dm.c 2007-05-03 14:53:56.000000000 +0100
@@ -0,0 +1,540 @@
+/*
+ * virtual page mapping and translated block handling
+ *
@@ -638,14 +638,8 @@ Index: ioemu/target-i386-dm/exec-dm.c
+{
+ /* Is this guest physical address RAM-backed? */
+#if defined(CONFIG_DM) && (defined(__i386__) || defined(__x86_64__))
+ if (ram_size <= HVM_BELOW_4G_RAM_END)
+ /* RAM is contiguous */
+ return (addr < ram_size);
+ else
+ /* There is RAM below and above the MMIO hole */
+ return ((addr < HVM_BELOW_4G_MMIO_START) ||
+ ((addr >= HVM_BELOW_4G_MMIO_START + HVM_BELOW_4G_MMIO_LENGTH)
+ && (addr < ram_size + HVM_BELOW_4G_MMIO_LENGTH)));
+ return ((addr < HVM_BELOW_4G_MMIO_START) ||
+ (addr >= HVM_BELOW_4G_MMIO_START + HVM_BELOW_4G_MMIO_LENGTH));
+#else
+ return (addr < ram_size);
+#endif
@@ -772,8 +766,8 @@ Index: ioemu/target-i386-dm/exec-dm.c
Index: ioemu/target-i386-dm/helper2.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ ioemu/target-i386-dm/helper2.c 2006-12-08 01:41:11.000000000 +0000
@@ -0,0 +1,488 @@
+++ ioemu/target-i386-dm/helper2.c 2007-05-03 14:54:46.000000000 +0100
@@ -0,0 +1,542 @@
+/*
+ * i386 helpers (without register variable usage)
+ *
@@ -1162,6 +1156,21 @@ Index: ioemu/target-i386-dm/helper2.c
+ req->data = tmp1;
+}
+
+void cpu_ioreq_sub(CPUState *env, ioreq_t *req)
+{
+ unsigned long tmp1, tmp2;
+
+ if (req->data_is_ptr != 0)
+ hw_error("expected scalar value");
+
+ read_physical(req->addr, req->size, &tmp1);
+ if (req->dir == IOREQ_WRITE) {
+ tmp2 = tmp1 - (unsigned long) req->data;
+ write_physical(req->addr, req->size, &tmp2);
+ }
+ req->data = tmp1;
+}
+
+void cpu_ioreq_or(CPUState *env, ioreq_t *req)
+{
+ unsigned long tmp1, tmp2;
@@ -1192,8 +1201,22 @@ Index: ioemu/target-i386-dm/helper2.c
+ req->data = tmp1;
+}
+
+void cpu_ioreq_xchg(CPUState *env, ioreq_t *req)
+{
+ unsigned long tmp1;
+
+ if (req->data_is_ptr != 0)
+ hw_error("expected scalar value");
+
+ read_physical(req->addr, req->size, &tmp1);
+ write_physical(req->addr, req->size, &req->data);
+ req->data = tmp1;
+}
+
+void cpu_handle_ioreq(void *opaque)
+{
+ extern int vm_running;
+ extern int shutdown_requested;
+ CPUState *env = opaque;
+ ioreq_t *req = cpu_get_ioreq();
+
@@ -1216,12 +1239,18 @@ Index: ioemu/target-i386-dm/helper2.c
+ case IOREQ_TYPE_ADD:
+ cpu_ioreq_add(env, req);
+ break;
+ case IOREQ_TYPE_SUB:
+ cpu_ioreq_sub(env, req);
+ break;
+ case IOREQ_TYPE_OR:
+ cpu_ioreq_or(env, req);
+ break;
+ case IOREQ_TYPE_XOR:
+ cpu_ioreq_xor(env, req);
+ break;
+ case IOREQ_TYPE_XCHG:
+ cpu_ioreq_xchg(env, req);
+ break;
+ default:
+ hw_error("Invalid ioreq type 0x%x\n", req->type);
+ }
@@ -1237,6 +1266,25 @@ Index: ioemu/target-i386-dm/helper2.c
+ }
+
+ wmb(); /* Update ioreq contents /then/ update state. */
+
+ /*
+ * We do this before we send the response so that the tools
+ * have the opportunity to pick up on the reset before the
+ * guest resumes and does a hlt with interrupts disabled which
+ * causes Xen to powerdown the domain.
+ */
+ if (vm_running) {
+ if (shutdown_requested) {
+ fprintf(logfile, "shutdown requested in cpu_handle_ioreq\n");
+ destroy_hvm_domain();
+ }
+ if (reset_requested) {
+ fprintf(logfile, "reset requested in cpu_handle_ioreq.\n");
+ qemu_system_reset();
+ reset_requested = 0;
+ }
+ }
+
+ req->state = STATE_IORESP_READY;
+ xc_evtchn_notify(xce_handle, ioreq_local_port[send_vcpu]);
+ }
@@ -1265,7 +1313,7 @@ Index: ioemu/target-i386-dm/helper2.c
Index: ioemu/target-i386-dm/i8259-dm.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ ioemu/target-i386-dm/i8259-dm.c 2006-12-08 01:41:11.000000000 +0000
+++ ioemu/target-i386-dm/i8259-dm.c 2007-05-03 14:53:57.000000000 +0100
@@ -0,0 +1,67 @@
+/* Xen 8259 stub for interrupt controller emulation
+ *
@@ -1337,7 +1385,7 @@ Index: ioemu/target-i386-dm/i8259-dm.c
Index: ioemu/target-i386-dm/qemu-dm.debug
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ ioemu/target-i386-dm/qemu-dm.debug 2006-12-08 01:41:11.000000000 +0000
+++ ioemu/target-i386-dm/qemu-dm.debug 2007-05-03 14:53:03.000000000 +0100
@@ -0,0 +1,10 @@
+#!/bin/sh
+
@@ -1352,15 +1400,14 @@ Index: ioemu/target-i386-dm/qemu-dm.debug
Index: ioemu/target-i386-dm/qemu-ifup
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ ioemu/target-i386-dm/qemu-ifup 2006-12-08 01:41:11.000000000 +0000
@@ -0,0 +1,10 @@
+++ ioemu/target-i386-dm/qemu-ifup 2007-05-03 14:53:03.000000000 +0100
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+#. /etc/rc.d/init.d/functions
+#ulimit -c unlimited
+
+echo -c 'config qemu network with xen bridge for '
+echo $*
+echo 'config qemu network with xen bridge for ' $*
+
+ifconfig $1 0.0.0.0 up
+brctl addif $2 $1
+6 -6
View File
@@ -1,8 +1,8 @@
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-08-06 02:22:53.925474246 +0100
+++ ioemu/vl.c 2006-08-06 02:22:56.618174081 +0100
@@ -824,6 +824,16 @@
--- ioemu.orig/vl.c 2007-05-03 10:07:52.000000000 +0100
+++ ioemu/vl.c 2007-05-03 10:07:52.000000000 +0100
@@ -825,6 +825,16 @@
}
}
@@ -19,7 +19,7 @@ Index: ioemu/vl.c
static void timer_save(QEMUFile *f, void *opaque)
{
if (cpu_ticks_enabled) {
@@ -940,6 +950,8 @@
@@ -941,6 +951,8 @@
#endif /* !defined(_WIN32) */
@@ -28,7 +28,7 @@ Index: ioemu/vl.c
static void init_timer_alarm(void)
{
#ifdef _WIN32
@@ -971,12 +983,15 @@
@@ -972,12 +984,15 @@
pit_min_timer_count = ((uint64_t)10000 * PIT_FREQ) / 1000000;
#else
{
@@ -44,7 +44,7 @@ Index: ioemu/vl.c
/* timer signal */
sigfillset(&act.sa_mask);
act.sa_flags = 0;
@@ -1022,6 +1037,7 @@
@@ -1023,6 +1038,7 @@
pit_min_timer_count = ((uint64_t)itv.it_interval.tv_usec *
PIT_FREQ) / 1000000;
}
@@ -1,7 +1,7 @@
Index: ioemu/hw/ide.c
===================================================================
--- ioemu.orig/hw/ide.c 2006-08-20 22:22:36.000000000 +0100
+++ ioemu/hw/ide.c 2006-08-20 23:56:13.000000000 +0100
--- ioemu.orig/hw/ide.c 2007-05-03 15:07:15.000000000 +0100
+++ ioemu/hw/ide.c 2007-05-03 15:07:16.000000000 +0100
@@ -305,6 +305,7 @@
PCIDevice *pci_dev;
struct BMDMAState *bmdma;
@@ -10,7 +10,7 @@ Index: ioemu/hw/ide.c
/* ide regs */
uint8_t feature;
uint8_t error;
@@ -789,6 +790,9 @@
@@ -947,6 +948,9 @@
}
ide_set_sector(s, sector_num + n);
@@ -20,7 +20,7 @@ Index: ioemu/hw/ide.c
#ifdef TARGET_I386
if (win2k_install_hack && ((++s->irq_count % 16) == 0)) {
/* It seems there is a bug in the Windows 2000 installer HDD
@@ -863,6 +867,10 @@
@@ -1021,6 +1025,10 @@
transfer_size -= len;
phys_addr += len;
}
@@ -31,7 +31,7 @@ Index: ioemu/hw/ide.c
return transfer_size1 - transfer_size;
}
@@ -1672,7 +1680,15 @@
@@ -1831,7 +1839,15 @@
/* XXX: valid for CDROM ? */
switch(s->feature) {
case 0x02: /* write cache enable */
@@ -47,7 +47,7 @@ Index: ioemu/hw/ide.c
case 0xaa: /* read look-ahead enable */
case 0x55: /* read look-ahead disable */
s->status = READY_STAT | SEEK_STAT;
@@ -2090,6 +2106,7 @@
@@ -2254,6 +2270,7 @@
s->irq = irq;
s->sector_write_timer = qemu_new_timer(vm_clock,
ide_sector_write_timer_cb, s);
+194
View File
@@ -0,0 +1,194 @@
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2007-05-03 15:20:45.000000000 +0100
+++ ioemu/vl.c 2007-05-03 15:20:45.000000000 +0100
@@ -116,7 +116,7 @@
void *ioport_opaque[MAX_IOPORTS];
IOPortReadFunc *ioport_read_table[3][MAX_IOPORTS];
IOPortWriteFunc *ioport_write_table[3][MAX_IOPORTS];
-BlockDriverState *bs_table[MAX_DISKS], *fd_table[MAX_FD];
+BlockDriverState *bs_table[MAX_DISKS + MAX_SCSI_DISKS], *fd_table[MAX_FD];
int vga_ram_size;
int bios_size;
static DisplayState display_state;
@@ -1396,7 +1396,7 @@
case 's':
{
int i;
- for (i = 0; i < MAX_DISKS; i++) {
+ for (i = 0; i < MAX_DISKS + MAX_SCSI_DISKS; i++) {
if (bs_table[i])
bdrv_commit(bs_table[i]);
}
@@ -6057,7 +6057,7 @@
int snapshot, linux_boot;
const char *initrd_filename;
#ifndef CONFIG_DM
- const char *hd_filename[MAX_DISKS];
+ const char *hd_filename[MAX_DISKS + MAX_SCSI_DISKS];
#endif /* !CONFIG_DM */
const char *fd_filename[MAX_FD];
const char *kernel_filename, *kernel_cmdline;
@@ -6126,7 +6126,7 @@
for(i = 0; i < MAX_FD; i++)
fd_filename[i] = NULL;
#ifndef CONFIG_DM
- for(i = 0; i < MAX_DISKS; i++)
+ for(i = 0; i < MAX_DISKS + MAX_SCSI_DISKS; i++)
hd_filename[i] = NULL;
#endif /* !CONFIG_DM */
ram_size = DEFAULT_RAM_SIZE * 1024 * 1024;
@@ -6724,7 +6724,7 @@
}
/* open the virtual block devices */
- for(i = 0; i < MAX_DISKS; i++) {
+ for(i = 0; i < MAX_DISKS + MAX_SCSI_DISKS; i++) {
if (hd_filename[i]) {
if (!bs_table[i]) {
char buf[64];
Index: ioemu/vl.h
===================================================================
--- ioemu.orig/vl.h 2007-05-03 15:20:45.000000000 +0100
+++ ioemu/vl.h 2007-05-03 15:20:45.000000000 +0100
@@ -818,8 +818,9 @@
/* ide.c */
#define MAX_DISKS 4
+#define MAX_SCSI_DISKS 7
-extern BlockDriverState *bs_table[MAX_DISKS];
+extern BlockDriverState *bs_table[MAX_DISKS + MAX_SCSI_DISKS];
void isa_ide_init(int iobase, int iobase2, int irq,
BlockDriverState *hd0, BlockDriverState *hd1);
Index: ioemu/hw/pc.c
===================================================================
--- ioemu.orig/hw/pc.c 2007-05-03 15:20:44.000000000 +0100
+++ ioemu/hw/pc.c 2007-05-03 15:20:45.000000000 +0100
@@ -902,7 +902,6 @@
if (pci_enabled && acpi_enabled) {
piix4_pm_init(pci_bus, piix3_devfn + 3);
}
-#endif /* !CONFIG_DM */
#if 0
/* ??? Need to figure out some way for the user to
@@ -921,6 +920,18 @@
lsi_scsi_attach(scsi, bdrv, -1);
}
#endif
+#else
+ if (pci_enabled) {
+ void *scsi = NULL;
+ for (i = 0; i < MAX_SCSI_DISKS ; i++) {
+ if (!bs_table[i + MAX_DISKS])
+ continue;
+ if (!scsi)
+ scsi = lsi_scsi_init(pci_bus, -1);
+ lsi_scsi_attach(scsi, bs_table[i + MAX_DISKS], -1);
+ }
+ }
+#endif /* !CONFIG_DM */
/* must be done after all PCI devices are instanciated */
/* XXX: should be done in the Bochs BIOS */
if (pci_enabled) {
Index: ioemu/xenstore.c
===================================================================
--- ioemu.orig/xenstore.c 2007-05-03 15:20:45.000000000 +0100
+++ ioemu/xenstore.c 2007-05-03 15:20:45.000000000 +0100
@@ -18,7 +18,7 @@
#include <fcntl.h>
static struct xs_handle *xsh = NULL;
-static char *media_filename[MAX_DISKS];
+static char *media_filename[MAX_DISKS + MAX_SCSI_DISKS];
static QEMUTimer *insert_timer = NULL;
#define UWAIT_MAX (30*1000000) /* thirty seconds */
@@ -44,7 +44,7 @@
{
int i;
- for (i = 0; i < MAX_DISKS; i++) {
+ for (i = 0; i < MAX_DISKS + MAX_SCSI_DISKS; i++) {
if (media_filename[i] && bs_table[i]) {
do_change(bs_table[i]->device_name, media_filename[i]);
free(media_filename[i]);
@@ -83,10 +83,10 @@
char *buf = NULL, *path;
char *fpath = NULL, *bpath = NULL,
*dev = NULL, *params = NULL, *type = NULL;
- int i;
+ int i, is_scsi;
unsigned int len, num, hd_index;
- for(i = 0; i < MAX_DISKS; i++)
+ for(i = 0; i < MAX_DISKS + MAX_SCSI_DISKS; i++)
media_filename[i] = NULL;
xsh = xs_daemon_open();
@@ -123,10 +123,11 @@
dev = xs_read(xsh, XBT_NULL, buf, &len);
if (dev == NULL)
continue;
- if (strncmp(dev, "hd", 2) || strlen(dev) != 3)
+ is_scsi = !strncmp(dev, "sd", 2);
+ if ((strncmp(dev, "hd", 2) && !is_scsi) || strlen(dev) != 3 )
continue;
hd_index = dev[2] - 'a';
- if (hd_index >= MAX_DISKS)
+ if (hd_index >= (is_scsi ? MAX_SCSI_DISKS : MAX_DISKS))
continue;
/* read the type of the device */
if (pasprintf(&buf, "%s/device/vbd/%s/device-type", path, e[i]) == -1)
@@ -163,7 +164,7 @@
}
}
- bs_table[hd_index] = bdrv_new(dev);
+ bs_table[hd_index + (is_scsi ? MAX_DISKS : 0)] = bdrv_new(dev);
/* check if it is a cdrom */
if (type && !strcmp(type, "cdrom")) {
bdrv_set_type_hint(bs_table[hd_index], BDRV_TYPE_CDROM);
@@ -172,7 +173,8 @@
}
/* open device now if media present */
if (params[0]) {
- if (bdrv_open(bs_table[hd_index], params, 0 /* snapshot */) < 0)
+ if (bdrv_open(bs_table[hd_index + (is_scsi ? MAX_DISKS : 0)],
+ params, 0 /* snapshot */) < 0)
fprintf(stderr, "qemu: could not open hard disk image '%s'\n",
params);
}
Index: ioemu/monitor.c
===================================================================
--- ioemu.orig/monitor.c 2007-05-03 15:18:43.000000000 +0100
+++ ioemu/monitor.c 2007-05-03 15:20:45.000000000 +0100
@@ -180,7 +180,7 @@
{
int i;
- for (i = 0; i < MAX_DISKS; i++) {
+ for (i = 0; i < MAX_DISKS + MAX_SCSI_DISKS; i++) {
if (bs_table[i]) {
bdrv_commit(bs_table[i]);
}
Index: ioemu/hw/lsi53c895a.c
===================================================================
--- ioemu.orig/hw/lsi53c895a.c 2007-05-03 15:18:43.000000000 +0100
+++ ioemu/hw/lsi53c895a.c 2007-05-03 15:20:45.000000000 +0100
@@ -1071,8 +1071,13 @@
shift = (offset & 3) * 8;
return (s->scratch[n] >> shift) & 0xff;
}
+#ifndef CONFIG_DM
BADF("readb 0x%x\n", offset);
exit(1);
+#else
+ /* XEN: This path can be triggered (e.g. ASPI8DOS.SYS reads 0x8). */
+ return 0;
+#endif
#undef CASE_GET_REG32
}
+3 -3
View File
@@ -1,8 +1,8 @@
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-08-17 19:49:52.162002356 +0100
+++ ioemu/vl.c 2006-08-17 19:49:56.273547905 +0100
@@ -1175,19 +1175,34 @@
--- ioemu.orig/vl.c 2007-05-03 10:07:53.000000000 +0100
+++ ioemu/vl.c 2007-05-03 10:07:53.000000000 +0100
@@ -1176,19 +1176,34 @@
static int unix_write(int fd, const uint8_t *buf, int len1)
{
+21 -2
View File
@@ -24,11 +24,18 @@ hypervisor-pit
shared-vram
shadow-vram
serial-non-block
ioemu-save-restore
ioemu-save-restore-ide
ioemu-save-restore-usb
ioemu-save-restore-timer
ioemu-save-restore-rtl8139
ioemu-save-restore-pcnet
ioemu-save-restore-ne2000
ide-hd-multithread
domain-timeoffset
acpi-support
acpi-timer-support
acpi-poweroff-support
ioemu-save-restore-acpi
fix-vga-scanning-code-overflow
vnc-cleanup
vnc-fixes
@@ -39,16 +46,20 @@ vnc-access-monitor-vt
vnc-display-find-unused
vnc-listen-specific-interface
vnc-backoff-screen-scan
xenstore
xenstore-block-device-config
xenstore-write-vnc-port
domain-timeoffset
qemu-allow-disable-sdl
qemu-fix-memset-args
xen-support-buffered-ioreqs
ioemu-buffer-pio-ia64
qemu-daemonize
xen-platform-device
qemu-bootorder
qemu-tunable-ide-write-cache
qemu-pci
qemu-pci-vendor-ids
serial-port-rate-limit
hypervisor-rtc
ide-cd-dma
@@ -67,5 +78,13 @@ usb-uhci-buffer-size
vnc-monitor-shift-key-processing
ide-error-reporting
vnc-numpad-handling
vnc-altgr-keysym
xen-mapcache
usb-mouse-tablet-status-check -p3
ioemu-save-restore-logdirty
usb-mouse-tablet-status-check
vnc-fix-signedness
vnc-fix-version-check
scsi
qemu-cirrus-bounds-checks
qemu-block-device-bounds-checks
qemu-dma-null-pointer-check
+35 -7
View File
@@ -1,7 +1,7 @@
Index: ioemu/hw/vga.c
===================================================================
--- ioemu.orig/hw/vga.c 2006-08-17 19:49:52.159002688 +0100
+++ ioemu/hw/vga.c 2006-08-17 19:49:54.575735565 +0100
--- ioemu.orig/hw/vga.c 2007-05-02 10:32:35.000000000 +0100
+++ ioemu/hw/vga.c 2007-05-02 10:35:05.000000000 +0100
@@ -1359,6 +1359,105 @@
}
}
@@ -120,10 +120,11 @@ Index: ioemu/hw/vga.c
addr1 = (s->start_addr * 4);
bwidth = width * 4;
y_start = -1;
@@ -1889,6 +1993,14 @@
@@ -1889,7 +1993,18 @@
vga_reset(s);
- s->vram_ptr = qemu_malloc(vga_ram_size);
+ check_sse2();
+ s->vram_shadow = qemu_malloc(vga_ram_size+TARGET_PAGE_SIZE+1);
+ if (s->vram_shadow == NULL)
@@ -132,16 +133,43 @@ Index: ioemu/hw/vga.c
+ s->vram_shadow = (uint8_t *)((long)(s->vram_shadow + TARGET_PAGE_SIZE - 1)
+ & ~(TARGET_PAGE_SIZE - 1));
+
s->vram_ptr = qemu_malloc(vga_ram_size);
+ /* Video RAM must be 128-bit aligned for SSE optimizations later */
+ s->vram_alloc = qemu_malloc(vga_ram_size + 15);
+ s->vram_ptr = (uint8_t *)((long)(s->vram_alloc + 15) & ~15L);
+
s->vram_offset = vga_ram_offset;
s->vram_size = vga_ram_size;
s->ds = ds;
@@ -2013,7 +2128,7 @@
}
if (!vga_ram_base) {
- vga_ram_base = qemu_malloc(vga_ram_size);
+ vga_ram_base = qemu_malloc(vga_ram_size + TARGET_PAGE_SIZE + 1);
if (!vga_ram_base) {
fprintf(stderr, "reallocate error\n");
return NULL;
@@ -2021,8 +2136,10 @@
}
/* XXX lock needed? */
+ old_pointer = s->vram_alloc;
+ s->vram_alloc = vga_ram_base;
+ vga_ram_base = (uint8_t *)((long)(vga_ram_base + 15) & ~15L);
memcpy(vga_ram_base, s->vram_ptr, vga_ram_size);
- old_pointer = s->vram_ptr;
s->vram_ptr = vga_ram_base;
return old_pointer;
Index: ioemu/hw/vga_int.h
===================================================================
--- ioemu.orig/hw/vga_int.h 2006-08-17 19:49:52.159002688 +0100
+++ ioemu/hw/vga_int.h 2006-08-17 19:49:54.575735565 +0100
@@ -79,6 +79,7 @@
--- ioemu.orig/hw/vga_int.h 2007-05-02 10:32:35.000000000 +0100
+++ ioemu/hw/vga_int.h 2007-05-02 10:35:10.000000000 +0100
@@ -78,7 +78,9 @@
#define VGA_MAX_HEIGHT 2048
#define VGA_STATE_COMMON \
+ uint8_t *vram_alloc; \
uint8_t *vram_ptr; \
+ uint8_t *vram_shadow; \
unsigned long vram_offset; \
+35 -34
View File
@@ -1,7 +1,7 @@
Index: ioemu/hw/cirrus_vga.c
===================================================================
--- ioemu.orig/hw/cirrus_vga.c 2006-12-08 01:57:54.000000000 +0000
+++ ioemu/hw/cirrus_vga.c 2006-12-08 02:00:04.000000000 +0000
--- ioemu.orig/hw/cirrus_vga.c 2007-05-03 09:56:32.000000000 +0100
+++ ioemu/hw/cirrus_vga.c 2007-05-03 10:07:53.000000000 +0100
@@ -28,6 +28,9 @@
*/
#include "vl.h"
@@ -39,7 +39,7 @@ Index: ioemu/hw/cirrus_vga.c
/***************************************
*
* prototypes.
@@ -2520,6 +2529,80 @@
@@ -2520,6 +2529,83 @@
cirrus_linear_bitblt_writel,
};
@@ -85,7 +85,8 @@ Index: ioemu/hw/cirrus_vga.c
+ return vram_pointer;
+}
+
+static int unset_vram_mapping(unsigned long begin, unsigned long end)
+static int unset_vram_mapping(unsigned long begin, unsigned long end,
+ void *mapping)
+{
+ xen_pfn_t *extent_start = NULL;
+ unsigned long nr_extents;
@@ -105,11 +106,13 @@ Index: ioemu/hw/cirrus_vga.c
+ return -1;
+ }
+
+ memset(extent_start, 0, sizeof(xen_pfn_t) * nr_extents);
+ /* Drop our own references to the vram pages */
+ munmap(mapping, nr_extents * TARGET_PAGE_SIZE);
+
+ /* Now drop the guest's mappings */
+ memset(extent_start, 0, sizeof(xen_pfn_t) * nr_extents);
+ for (i = 0; i < nr_extents; i++)
+ extent_start[i] = (begin + (i * TARGET_PAGE_SIZE)) >> TARGET_PAGE_BITS;
+
+ unset_mm_mapping(xc_handle, domid, nr_extents, 0, extent_start);
+
+ free(extent_start);
@@ -120,7 +123,7 @@ Index: ioemu/hw/cirrus_vga.c
/* Compute the memory access functions */
static void cirrus_update_memory_access(CirrusVGAState *s)
{
@@ -2538,11 +2621,39 @@
@@ -2538,11 +2624,37 @@
mode = s->gr[0x05] & 0x7;
if (mode < 4 || mode > 5 || ((s->gr[0x0B] & 0x4) == 0)) {
@@ -145,22 +148,20 @@ Index: ioemu/hw/cirrus_vga.c
} else {
generic_io:
+ if (s->cirrus_lfb_addr && s->cirrus_lfb_end && s->map_addr) {
+ int error;
+ void *old_vram = NULL;
+ void *old_vram;
+
+ old_vram = vga_update_vram((VGAState *)s, NULL, VGA_RAM_SIZE);
+
+ unset_vram_mapping(s->cirrus_lfb_addr,
+ s->cirrus_lfb_end,
+ old_vram);
+
+ error = unset_vram_mapping(s->cirrus_lfb_addr,
+ s->cirrus_lfb_end);
+ if (!error)
+ old_vram = vga_update_vram((VGAState *)s, NULL,
+ VGA_RAM_SIZE);
+ if (old_vram)
+ munmap(old_vram, s->map_addr - s->map_end);
+ s->map_addr = s->map_end = 0;
+ }
s->cirrus_linear_write[0] = cirrus_linear_writeb;
s->cirrus_linear_write[1] = cirrus_linear_writew;
s->cirrus_linear_write[2] = cirrus_linear_writel;
@@ -3136,6 +3247,13 @@
@@ -3136,6 +3248,13 @@
/* XXX: add byte swapping apertures */
cpu_register_physical_memory(addr, s->vram_size,
s->cirrus_linear_io_addr);
@@ -176,8 +177,8 @@ Index: ioemu/hw/cirrus_vga.c
}
Index: ioemu/hw/pc.c
===================================================================
--- ioemu.orig/hw/pc.c 2006-12-08 02:00:04.000000000 +0000
+++ ioemu/hw/pc.c 2006-12-08 02:00:04.000000000 +0000
--- ioemu.orig/hw/pc.c 2007-05-03 10:07:53.000000000 +0100
+++ ioemu/hw/pc.c 2007-05-03 10:07:53.000000000 +0100
@@ -790,14 +790,14 @@
if (cirrus_vga_enabled) {
if (pci_enabled) {
@@ -198,8 +199,8 @@ Index: ioemu/hw/pc.c
Index: ioemu/hw/vga.c
===================================================================
--- ioemu.orig/hw/vga.c 2006-12-08 02:00:04.000000000 +0000
+++ ioemu/hw/vga.c 2006-12-08 02:00:04.000000000 +0000
--- ioemu.orig/hw/vga.c 2007-05-03 10:07:52.000000000 +0100
+++ ioemu/hw/vga.c 2007-05-03 10:07:53.000000000 +0100
@@ -1858,6 +1858,7 @@
/* TODO: add vbe support if enabled */
}
@@ -251,8 +252,8 @@ Index: ioemu/hw/vga.c
Index: ioemu/hw/vga_int.h
===================================================================
--- ioemu.orig/hw/vga_int.h 2006-12-08 01:57:54.000000000 +0000
+++ ioemu/hw/vga_int.h 2006-12-08 02:00:04.000000000 +0000
--- ioemu.orig/hw/vga_int.h 2007-05-03 09:56:32.000000000 +0100
+++ ioemu/hw/vga_int.h 2007-05-03 10:07:53.000000000 +0100
@@ -169,5 +169,6 @@
unsigned int color0, unsigned int color1,
unsigned int color_xor);
@@ -262,9 +263,9 @@ Index: ioemu/hw/vga_int.h
extern const uint8_t gr_mask[16];
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-12-08 02:00:04.000000000 +0000
+++ ioemu/vl.c 2006-12-08 02:00:27.000000000 +0000
@@ -5693,6 +5693,62 @@
--- ioemu.orig/vl.c 2007-05-03 10:07:53.000000000 +0100
+++ ioemu/vl.c 2007-05-03 10:07:53.000000000 +0100
@@ -5745,6 +5745,62 @@
#define MAX_NET_CLIENTS 32
@@ -278,17 +279,17 @@ Index: ioemu/vl.c
+ int err = 0;
+ xc_dominfo_t info;
+
+ xc_domain_getinfo(xc_handle, domid, 1, &info);
+ if ((info.nr_pages - nr_pages) <= 0) {
+ fprintf(stderr, "unset_mm_mapping: error nr_pages\n");
+ err = -1;
+ }
+
+ err = xc_domain_memory_decrease_reservation(xc_handle, domid,
+ nr_pages, 0, extent_start);
+ if (err)
+ fprintf(stderr, "Failed to decrease physmap\n");
+
+ xc_domain_getinfo(xc_handle, domid, 1, &info);
+
+ if ((info.nr_pages - nr_pages) <= 0) {
+ fprintf(stderr, "unset_mm_mapping: error nr_pages\n");
+ err = -1;
+ }
+
+ if (xc_domain_setmaxmem(xc_handle, domid, (info.nr_pages - nr_pages) *
+ PAGE_SIZE/1024) != 0) {
@@ -329,8 +330,8 @@ Index: ioemu/vl.c
#ifdef CONFIG_GDBSTUB
Index: ioemu/vl.h
===================================================================
--- ioemu.orig/vl.h 2006-12-08 02:00:04.000000000 +0000
+++ ioemu/vl.h 2006-12-08 02:00:04.000000000 +0000
--- ioemu.orig/vl.h 2007-05-03 10:07:53.000000000 +0100
+++ ioemu/vl.h 2007-05-03 10:07:53.000000000 +0100
@@ -145,6 +145,13 @@
void main_loop_wait(int timeout);
+93 -10
View File
@@ -1,17 +1,56 @@
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-08-17 19:49:40.119333436 +0100
+++ ioemu/vl.c 2006-08-17 19:49:48.566399780 +0100
@@ -1536,26 +1536,65 @@
--- ioemu.orig/vl.c 2007-05-03 10:24:03.000000000 +0100
+++ ioemu/vl.c 2007-05-03 10:24:04.000000000 +0100
@@ -1537,26 +1537,108 @@
return chr;
}
+int store_console_dev(int domid, char *pts)
+/*
+ * Create a store entry for a device (e.g., monitor, serial/parallel lines).
+ * The entry is <domain-path><storeString>/tty and the value is the name
+ * of the pty associated with the device.
+ */
+static int store_dev_info(char *devName, int domid,
+ CharDriverState *cState, char *storeString)
+{
+ int xc_handle;
+ struct xs_handle *xs;
+ char *path;
+ char *newpath;
+ FDCharDriver *s;
+ char *pts;
+
+ /* Check for valid arguments (at least, prevent segfaults). */
+ if ((devName == NULL) || (cState == NULL) || (storeString == NULL)) {
+ fprintf(logfile, "%s - invalid arguments\n", __FUNCTION__);
+ return EINVAL;
+ }
+
+ /*
+ * Only continue if we're talking to a pty
+ * Actually, the following code works for any CharDriverState using
+ * FDCharDriver, but we really only care about pty's here
+ */
+ if (strcmp(devName, "pty"))
+ return 0;
+
+ s = cState->opaque;
+ if (s == NULL) {
+ fprintf(logfile, "%s - unable to retrieve fd for '%s'/'%s'\n",
+ __FUNCTION__, storeString, devName);
+ return EBADF;
+ }
+
+ pts = ptsname(s->fd_in);
+ if (pts == NULL) {
+ fprintf(logfile, "%s - unable to determine ptsname '%s'/'%s', "
+ "error %d (%s)\n",
+ __FUNCTION__, storeString, devName, errno, strerror(errno));
+ return errno;
+ }
+
+ /* We now have everything we need to set the xenstore entry. */
+ xs = xs_daemon_open();
+ if (xs == NULL) {
+ fprintf(logfile, "Could not contact XenStore\n");
@@ -29,14 +68,19 @@ Index: ioemu/vl.c
+ fprintf(logfile, "xs_get_domain_path() error\n");
+ return -1;
+ }
+ path = realloc(path, strlen(path) + strlen("/console/tty") + 1);
+ if (path == NULL) {
+ newpath = realloc(path, (strlen(path) + strlen(storeString) +
+ strlen("/tty") + 1));
+ if (newpath == NULL) {
+ free(path); /* realloc errors leave old block */
+ fprintf(logfile, "realloc error\n");
+ return -1;
+ }
+ strcat(path, "/console/tty");
+ path = newpath;
+
+ strcat(path, storeString);
+ strcat(path, "/tty");
+ if (!xs_write(xs, XBT_NULL, path, pts, strlen(pts))) {
+ fprintf(logfile, "xs_write for console fail");
+ fprintf(logfile, "xs_write for '%s' fail", storeString);
+ return -1;
+ }
+
@@ -71,13 +115,12 @@ Index: ioemu/vl.c
+ tcsetattr(slave_fd, TCSAFLUSH, &tty);
+
+ fprintf(stderr, "char device redirected to %s\n", ptsname(master_fd));
+ store_console_dev(domid, ptsname(master_fd));
- fprintf(stderr, "char device redirected to %s\n", slave_name);
return qemu_chr_open_fd(master_fd, master_fd);
}
@@ -5868,7 +5907,9 @@
@@ -5881,7 +5963,9 @@
break;
case QEMU_OPTION_nographic:
pstrcpy(monitor_device, sizeof(monitor_device), "stdio");
@@ -88,3 +131,43 @@ Index: ioemu/vl.c
nographic = 1;
break;
case QEMU_OPTION_kernel:
@@ -6348,16 +6432,23 @@
fprintf(stderr, "qemu: could not open monitor device '%s'\n", monitor_device);
exit(1);
}
+ store_dev_info(monitor_device, domid, monitor_hd, "/monitor");
monitor_init(monitor_hd, !nographic);
for(i = 0; i < MAX_SERIAL_PORTS; i++) {
if (serial_devices[i][0] != '\0') {
+ char buf[16];
serial_hds[i] = qemu_chr_open(serial_devices[i]);
if (!serial_hds[i]) {
fprintf(stderr, "qemu: could not open serial device '%s'\n",
serial_devices[i]);
exit(1);
}
+ snprintf(buf, sizeof(buf), "/serial/%d", i);
+ store_dev_info(serial_devices[i], domid, serial_hds[i], buf);
+ if (i == 0) /* serial 0 is also called the console */
+ store_dev_info(serial_devices[i], domid,
+ serial_hds[i], "/console");
if (!strcmp(serial_devices[i], "vc"))
qemu_chr_printf(serial_hds[i], "serial%d console\r\n", i);
}
@@ -6365,12 +6456,15 @@
for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
if (parallel_devices[i][0] != '\0') {
+ char buf[16];
parallel_hds[i] = qemu_chr_open(parallel_devices[i]);
if (!parallel_hds[i]) {
fprintf(stderr, "qemu: could not open parallel device '%s'\n",
parallel_devices[i]);
exit(1);
}
+ snprintf(buf, sizeof(buf), "/parallel/%d", i);
+ store_dev_info(parallel_devices[i], domid, parallel_hds[i], buf);
if (!strcmp(parallel_devices[i], "vc"))
qemu_chr_printf(parallel_hds[i], "parallel%d console\r\n", i);
}
+21 -13
View File
@@ -22,8 +22,8 @@ Signed-off-by: Stefan Berger <stefanb@us.ibm.com>
Index: ioemu/Makefile.target
===================================================================
--- ioemu.orig/Makefile.target 2006-12-20 15:21:55.000000000 +0000
+++ ioemu/Makefile.target 2006-12-20 15:21:55.000000000 +0000
--- ioemu.orig/Makefile.target 2007-05-03 15:20:44.000000000 +0100
+++ ioemu/Makefile.target 2007-05-03 15:20:44.000000000 +0100
@@ -369,6 +369,7 @@
VL_OBJS+= piix4acpi.o
VL_OBJS+= xenstore.o
@@ -34,8 +34,8 @@ Index: ioemu/Makefile.target
ifeq ($(TARGET_BASE_ARCH), ppc)
Index: ioemu/hw/pc.c
===================================================================
--- ioemu.orig/hw/pc.c 2006-12-20 15:21:54.000000000 +0000
+++ ioemu/hw/pc.c 2006-12-20 15:21:55.000000000 +0000
--- ioemu.orig/hw/pc.c 2007-05-03 15:20:43.000000000 +0100
+++ ioemu/hw/pc.c 2007-05-03 15:20:44.000000000 +0100
@@ -877,6 +877,9 @@
}
}
@@ -49,8 +49,8 @@ Index: ioemu/hw/pc.c
Index: ioemu/hw/tpm_tis.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ ioemu/hw/tpm_tis.c 2006-12-20 15:21:55.000000000 +0000
@@ -0,0 +1,1120 @@
+++ ioemu/hw/tpm_tis.c 2007-05-03 15:20:44.000000000 +0100
@@ -0,0 +1,1128 @@
+/*
+ * tpm_tis.c - QEMU emulator for a 1.2 TPM with TIS interface
+ *
@@ -570,7 +570,7 @@ Index: ioemu/hw/tpm_tis.c
+
+#ifdef DEBUG_TPM
+ fprintf(logfile," read(%08x) = %08x\n",
+ addr,
+ (int)addr,
+ val);
+#endif
+
@@ -591,7 +591,7 @@ Index: ioemu/hw/tpm_tis.c
+
+#ifdef DEBUG_TPM
+ fprintf(logfile,"write(%08x) = %08x\n",
+ addr,
+ (int)addr,
+ val);
+#endif
+
@@ -810,10 +810,11 @@ Index: ioemu/hw/tpm_tis.c
+static void tpm_save(QEMUFile* f,void* opaque)
+{
+ tpmState* s=(tpmState*)opaque;
+ uint8_t locty = s->active_loc;
+ int c;
+
+ /* need to wait for outstanding requests to complete */
+ if (IS_COMM_WITH_VTPM(s)) {
+ if (s->loc[locty].state == STATE_EXECUTION) {
+ int repeats = 30; /* 30 seconds; really should be infty */
+ while (repeats > 0 &&
+ !(s->loc[s->active_loc].sts & STS_DATA_AVAILABLE)) {
@@ -821,6 +822,8 @@ Index: ioemu/hw/tpm_tis.c
+ if (n > 0) {
+ if (IS_VALID_LOC(s->active_loc)) {
+ s->loc[s->active_loc].sts = STS_VALID | STS_DATA_AVAILABLE;
+ s->loc[s->active_loc].state = STATE_COMPLETION;
+ tis_raise_irq(s, s->active_loc, INT_DATA_AVAILABLE);
+ }
+ /* close the connection with the vTPM for good */
+ close_vtpm_channel(s, 1);
@@ -830,6 +833,10 @@ Index: ioemu/hw/tpm_tis.c
+ }
+ }
+
+ if (IS_COMM_WITH_VTPM(s)) {
+ close_vtpm_channel(s, 1);
+ }
+
+ qemu_put_be32s(f,&s->offset);
+ qemu_put_buffer(f, s->buffer.buf, TPM_MAX_PKT);
+ qemu_put_8s(f, &s->active_loc);
@@ -929,6 +936,7 @@ Index: ioemu/hw/tpm_tis.c
+ s->Transmitlayer = -1;
+ s->tpmTx.fd[0] = -1;
+ s->tpmTx.fd[1] = -1;
+ s->aborting_locty = NO_LOCALITY;
+
+ tpm_initialize_instance(s, s->vtpm_instance);
+ memset(s->buffer.buf,0,sizeof(s->buffer.buf));
@@ -1046,7 +1054,7 @@ Index: ioemu/hw/tpm_tis.c
+ uint32_t size = tpm_get_size_from_buffer(buffer->buf);
+ if (size + sizeof(buffer->instance) != off) {
+ fprintf(logfile,"TPM: Packet size is bad! %d != %d\n",
+ size + sizeof(buffer->instance),
+ (int)(size + sizeof(buffer->instance)),
+ off);
+ } else {
+ uint32_t ret;
@@ -1173,9 +1181,9 @@ Index: ioemu/hw/tpm_tis.c
+}
Index: ioemu/vl.h
===================================================================
--- ioemu.orig/vl.h 2006-12-20 15:21:55.000000000 +0000
+++ ioemu/vl.h 2006-12-20 15:21:55.000000000 +0000
@@ -932,6 +932,10 @@
--- ioemu.orig/vl.h 2007-05-03 15:20:44.000000000 +0100
+++ ioemu/vl.h 2007-05-03 15:20:44.000000000 +0100
@@ -933,6 +933,10 @@
void piix4_pm_init(PCIBus *bus, int devfn);
void acpi_bios_init(void);
@@ -16,10 +16,11 @@ This patch make UHC & USB mouse/tablet behave consistently with spec.
Signed-off-by: Xinmei Huang <xinmei.huang@intel.com>
diff -r fb3cb6f52a29 -r 60bbcf799384 tools/ioemu/hw/usb-hid.c
--- a/tools/ioemu/hw/usb-hid.c Thu Dec 07 11:51:22 2006 +0000
+++ b/tools/ioemu/hw/usb-hid.c Thu Dec 07 11:52:26 2006 +0000
@@ -39,6 +39,7 @@ typedef struct USBMouseState {
Index: ioemu/hw/usb-hid.c
===================================================================
--- ioemu.orig/hw/usb-hid.c 2007-05-02 14:21:51.000000000 +0100
+++ ioemu/hw/usb-hid.c 2007-05-02 14:23:54.000000000 +0100
@@ -39,6 +39,7 @@
int x, y;
int kind;
int mouse_grabbed;
@@ -27,7 +28,7 @@ diff -r fb3cb6f52a29 -r 60bbcf799384 tools/ioemu/hw/usb-hid.c
} USBMouseState;
/* mostly the same values as the Bochs USB Mouse device */
@@ -231,6 +232,7 @@ static void usb_mouse_event(void *opaque
@@ -231,6 +232,7 @@
s->dy += dy1;
s->dz += dz1;
s->buttons_state = buttons_state;
@@ -35,7 +36,7 @@ diff -r fb3cb6f52a29 -r 60bbcf799384 tools/ioemu/hw/usb-hid.c
}
static void usb_tablet_event(void *opaque,
@@ -242,6 +244,7 @@ static void usb_tablet_event(void *opaqu
@@ -242,6 +244,7 @@
s->y = y;
s->dz += dz;
s->buttons_state = buttons_state;
@@ -43,7 +44,7 @@ diff -r fb3cb6f52a29 -r 60bbcf799384 tools/ioemu/hw/usb-hid.c
}
static inline int int_clamp(int val, int vmin, int vmax)
@@ -483,10 +486,16 @@ static int usb_mouse_handle_data(USBDevi
@@ -483,10 +486,16 @@
switch(pid) {
case USB_TOKEN_IN:
if (devep == 1) {
@@ -64,7 +65,7 @@ diff -r fb3cb6f52a29 -r 60bbcf799384 tools/ioemu/hw/usb-hid.c
} else {
goto fail;
}
@@ -523,6 +532,7 @@ USBDevice *usb_tablet_init(void)
@@ -566,6 +575,7 @@
s->dev.handle_data = usb_mouse_handle_data;
s->dev.handle_destroy = usb_mouse_handle_destroy;
s->kind = USB_TABLET;
@@ -72,7 +73,7 @@ diff -r fb3cb6f52a29 -r 60bbcf799384 tools/ioemu/hw/usb-hid.c
pstrcpy(s->dev.devname, sizeof(s->dev.devname), "QEMU USB Tablet");
@@ -544,6 +554,7 @@ USBDevice *usb_mouse_init(void)
@@ -589,6 +599,7 @@
s->dev.handle_data = usb_mouse_handle_data;
s->dev.handle_destroy = usb_mouse_handle_destroy;
s->kind = USB_MOUSE;
@@ -80,27 +81,45 @@ diff -r fb3cb6f52a29 -r 60bbcf799384 tools/ioemu/hw/usb-hid.c
pstrcpy(s->dev.devname, sizeof(s->dev.devname), "QEMU USB Mouse");
diff -r fb3cb6f52a29 -r 60bbcf799384 tools/ioemu/hw/usb-uhci.c
--- a/tools/ioemu/hw/usb-uhci.c Thu Dec 07 11:51:22 2006 +0000
+++ b/tools/ioemu/hw/usb-uhci.c Thu Dec 07 11:52:26 2006 +0000
@@ -424,12 +424,10 @@ static int uhci_handle_td(UHCIState *s,
Index: ioemu/hw/usb-uhci.c
===================================================================
--- ioemu.orig/hw/usb-uhci.c 2007-05-02 14:23:54.000000000 +0100
+++ ioemu/hw/usb-uhci.c 2007-05-02 14:23:54.000000000 +0100
@@ -43,9 +43,15 @@
#define TD_CTRL_IOC (1 << 24)
#define TD_CTRL_ACTIVE (1 << 23)
#define TD_CTRL_STALL (1 << 22)
+#define TD_CTRL_BUFFER (1 << 21)
#define TD_CTRL_BABBLE (1 << 20)
#define TD_CTRL_NAK (1 << 19)
#define TD_CTRL_TIMEOUT (1 << 18)
+#define TD_CTRL_BITSTUFF \
+ (1 << 17)
+#define TD_CTRL_MASK \
+ (TD_CTRL_BITSTUFF | TD_CTRL_TIMEOUT | TD_CTRL_NAK \
+ | TD_CTRL_BABBLE | TD_CTRL_BUFFER | TD_CTRL_STALL)
#define UHCI_PORT_RESET (1 << 9)
#define UHCI_PORT_LSDA (1 << 8)
@@ -424,12 +430,12 @@
uint8_t buf[2048];
int len, max_len, err, ret;
- if (td->ctrl & TD_CTRL_IOC) {
- *int_mask |= 0x01;
- }
-
- if (!(td->ctrl & TD_CTRL_ACTIVE))
- return 1;
+ if (!(td->ctrl & TD_CTRL_ACTIVE)){
+ ret = 1;
+ goto out;
+ }
}
-
- if (!(td->ctrl & TD_CTRL_ACTIVE))
- return 1;
+ /* Clear TD's status field explicitly */
+ td->ctrl = td->ctrl & (~TD_CTRL_MASK);
/* TD is active */
max_len = ((td->token >> 21) + 1) & 0x7ff;
@@ -467,7 +465,8 @@ static int uhci_handle_td(UHCIState *s,
@@ -467,7 +473,8 @@
/* invalid pid : frame interrupted */
s->status |= UHCI_STS_HCPERR;
uhci_update_irq(s);
@@ -110,7 +129,7 @@ diff -r fb3cb6f52a29 -r 60bbcf799384 tools/ioemu/hw/usb-uhci.c
}
if (td->ctrl & TD_CTRL_IOS)
td->ctrl &= ~TD_CTRL_ACTIVE;
@@ -479,10 +478,12 @@ static int uhci_handle_td(UHCIState *s,
@@ -479,10 +486,12 @@
len < max_len) {
*int_mask |= 0x02;
/* short packet: do not update QH */
@@ -125,7 +144,7 @@ diff -r fb3cb6f52a29 -r 60bbcf799384 tools/ioemu/hw/usb-uhci.c
}
} else {
switch(ret) {
@@ -501,23 +502,34 @@ static int uhci_handle_td(UHCIState *s,
@@ -501,23 +510,34 @@
}
td->ctrl = (td->ctrl & ~(3 << TD_CTRL_ERROR_SHIFT)) |
(err << TD_CTRL_ERROR_SHIFT);
@@ -150,12 +169,10 @@ diff -r fb3cb6f52a29 -r 60bbcf799384 tools/ioemu/hw/usb-uhci.c
td->ctrl &= ~TD_CTRL_ACTIVE;
/* frame interrupted */
- return -1;
- }
- }
+ ret = -1;
+ goto out;
+ }
+ }
}
}
+
+out:
+ /* If TD is inactive and IOC bit set to 1 then update int_mask */
+24
View File
@@ -0,0 +1,24 @@
Index: ioemu/keymaps/modifiers
===================================================================
--- ioemu.orig/keymaps/modifiers 2007-05-02 10:30:05.000000000 +0100
+++ ioemu/keymaps/modifiers 2007-05-03 15:02:56.000000000 +0100
@@ -3,6 +3,7 @@
Alt_R 0xb8
Mode_switch 0xb8
+ISO_Level3_Switch 0xb8
Alt_L 0x38
Control_R 0x9d
Index: ioemu/vnc_keysym.h
===================================================================
--- ioemu.orig/vnc_keysym.h 2007-05-03 15:02:10.000000000 +0100
+++ ioemu/vnc_keysym.h 2007-05-03 15:03:03.000000000 +0100
@@ -215,6 +215,7 @@
{"Shift_R", 0xffe2}, /* XK_Shift_R */
{"Super_L", 0xffeb}, /* XK_Super_L */
{"Super_R", 0xffec}, /* XK_Super_R */
+{"ISO_Level3_Shift", 0xfe03}, /* XK_ISO_Level3_Shift */
/* special keys */
{"BackSpace", 0xff08}, /* XK_BackSpace */
+7 -7
View File
@@ -1,7 +1,7 @@
Index: ioemu/vnc.c
===================================================================
--- ioemu.orig/vnc.c 2006-12-06 23:46:12.000000000 +0000
+++ ioemu/vnc.c 2006-12-06 23:46:12.000000000 +0000
--- ioemu.orig/vnc.c 2007-05-03 10:07:56.000000000 +0100
+++ ioemu/vnc.c 2007-05-03 10:07:56.000000000 +0100
@@ -28,7 +28,19 @@
#include "qemu_socket.h"
#include <assert.h>
@@ -356,9 +356,9 @@ Index: ioemu/vnc.c
case 6:
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-12-06 23:46:12.000000000 +0000
+++ ioemu/vl.c 2006-12-06 23:46:12.000000000 +0000
@@ -726,6 +726,12 @@
--- ioemu.orig/vl.c 2007-05-03 10:07:56.000000000 +0100
+++ ioemu/vl.c 2007-05-03 10:07:56.000000000 +0100
@@ -725,6 +725,12 @@
}
}
@@ -373,8 +373,8 @@ Index: ioemu/vl.c
void qemu_mod_timer(QEMUTimer *ts, int64_t expire_time)
Index: ioemu/vl.h
===================================================================
--- ioemu.orig/vl.h 2006-12-06 23:46:12.000000000 +0000
+++ ioemu/vl.h 2006-12-06 23:46:12.000000000 +0000
--- ioemu.orig/vl.h 2007-05-03 10:07:56.000000000 +0100
+++ ioemu/vl.h 2007-05-03 10:07:56.000000000 +0100
@@ -407,6 +407,7 @@
void qemu_free_timer(QEMUTimer *ts);
void qemu_del_timer(QEMUTimer *ts);
+5 -5
View File
@@ -1,7 +1,7 @@
Index: ioemu/vnc.c
===================================================================
--- ioemu.orig/vnc.c 2006-09-21 18:54:22.000000000 +0100
+++ ioemu/vnc.c 2006-09-21 19:05:39.000000000 +0100
--- ioemu.orig/vnc.c 2007-05-03 09:56:31.000000000 +0100
+++ ioemu/vnc.c 2007-05-03 10:07:55.000000000 +0100
@@ -143,13 +143,16 @@
static void vnc_dpy_update(DisplayState *ds, int x, int y, int w, int h)
{
@@ -90,9 +90,9 @@ Index: ioemu/vnc.c
static void set_encodings(VncState *vs, int32_t *encodings, size_t n_encodings)
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-09-21 18:55:38.000000000 +0100
+++ ioemu/vl.c 2006-09-21 19:00:48.000000000 +0100
@@ -5120,10 +5120,10 @@
--- ioemu.orig/vl.c 2007-05-03 10:07:54.000000000 +0100
+++ ioemu/vl.c 2007-05-03 10:07:55.000000000 +0100
@@ -5195,10 +5195,10 @@
/* XXX: better handling of removal */
for(ioh = first_io_handler; ioh != NULL; ioh = ioh_next) {
ioh_next = ioh->next;
+15 -15
View File
@@ -1,7 +1,7 @@
Index: ioemu/vnc.c
===================================================================
--- ioemu.orig/vnc.c 2006-12-20 15:21:52.000000000 +0000
+++ ioemu/vnc.c 2006-12-20 15:21:52.000000000 +0000
--- ioemu.orig/vnc.c 2007-05-03 10:24:06.000000000 +0100
+++ ioemu/vnc.c 2007-05-03 10:24:06.000000000 +0100
@@ -1197,7 +1197,7 @@
}
}
@@ -50,9 +50,9 @@ Index: ioemu/vnc.c
int vnc_start_viewer(int port)
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-12-20 15:21:51.000000000 +0000
+++ ioemu/vl.c 2006-12-20 15:21:52.000000000 +0000
@@ -121,6 +121,7 @@
--- ioemu.orig/vl.c 2007-05-03 10:24:06.000000000 +0100
+++ ioemu/vl.c 2007-05-03 10:24:06.000000000 +0100
@@ -122,6 +122,7 @@
static DisplayState display_state;
int nographic;
int vncviewer;
@@ -60,23 +60,23 @@ Index: ioemu/vl.c
const char* keyboard_layout = NULL;
int64_t ticks_per_sec;
int boot_device = 'c';
@@ -5342,6 +5343,7 @@
@@ -5417,6 +5418,7 @@
"-loadvm file start right away with a saved state (loadvm in monitor)\n"
"-vnc display start a VNC server on display\n"
"-vncviewer start a vncviewer process for this domain\n"
+ "-vncunused bind the VNC server to an unused port\n"
"-timeoffset time offset (in seconds) from local time\n"
"-acpi disable or enable ACPI of HVM domain \n"
"\n"
@@ -5431,6 +5433,7 @@
QEMU_OPTION_timeoffset,
"During emulation, the following keys are useful:\n"
@@ -5504,6 +5506,7 @@
QEMU_OPTION_vcpus,
QEMU_OPTION_acpi,
QEMU_OPTION_vncviewer,
+ QEMU_OPTION_vncunused,
};
typedef struct QEMUOption {
@@ -5506,6 +5509,7 @@
@@ -5579,6 +5582,7 @@
{ "smp", HAS_ARG, QEMU_OPTION_smp },
{ "vnc", HAS_ARG, QEMU_OPTION_vnc },
{ "vncviewer", 0, QEMU_OPTION_vncviewer },
@@ -84,7 +84,7 @@ Index: ioemu/vl.c
/* temporary options */
{ "usb", 0, QEMU_OPTION_usb },
@@ -5857,6 +5861,7 @@
@@ -5938,6 +5942,7 @@
snapshot = 0;
nographic = 0;
vncviewer = 0;
@@ -92,7 +92,7 @@ Index: ioemu/vl.c
kernel_filename = NULL;
kernel_cmdline = "";
#ifdef TARGET_PPC
@@ -6254,6 +6259,11 @@
@@ -6336,6 +6341,11 @@
case QEMU_OPTION_vncviewer:
vncviewer++;
break;
@@ -104,7 +104,7 @@ Index: ioemu/vl.c
}
}
}
@@ -6460,7 +6470,7 @@
@@ -6537,7 +6547,7 @@
if (nographic) {
dumb_display_init(ds);
} else if (vnc_display != -1) {
@@ -115,8 +115,8 @@ Index: ioemu/vl.c
} else {
Index: ioemu/vl.h
===================================================================
--- ioemu.orig/vl.h 2006-12-20 15:21:51.000000000 +0000
+++ ioemu/vl.h 2006-12-20 15:21:52.000000000 +0000
--- ioemu.orig/vl.h 2007-05-03 10:24:06.000000000 +0100
+++ ioemu/vl.h 2007-05-03 10:24:06.000000000 +0100
@@ -785,7 +785,7 @@
void cocoa_display_init(DisplayState *ds, int full_screen);
+222
View File
@@ -0,0 +1,222 @@
# HG changeset patch
# User kaf24@localhost.localdomain
# Date 1167325891 0
# Node ID ede2f5280810789c3cb37603cf2e6b34c60982b1
# Parent a138fabc2120376cfb4bf72596a334a1edf8adb0
[QEMU] Fix a number of signedness issues plus a typo in the version checking in vnc.c.
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Index: ioemu/vnc.c
===================================================================
--- ioemu.orig/vnc.c 2007-05-02 14:03:41.000000000 +0100
+++ ioemu/vnc.c 2007-05-02 14:03:42.000000000 +0100
@@ -54,12 +54,12 @@
{
size_t capacity;
size_t offset;
- char *buffer;
+ uint8_t *buffer;
} Buffer;
typedef struct VncState VncState;
-typedef int VncReadEvent(VncState *vs, char *data, size_t len);
+typedef int VncReadEvent(VncState *vs, uint8_t *data, size_t len);
typedef void VncWritePixels(VncState *vs, void *data, int size);
@@ -90,7 +90,7 @@
uint64_t *update_row; /* outstanding updates */
int has_update; /* there's outstanding updates in the
* visible area */
- char *old_data;
+ uint8_t *old_data;
int depth; /* internal VNC frame buffer byte per pixel */
int has_resize;
int has_hextile;
@@ -140,7 +140,7 @@
static void vnc_update_client(void *opaque);
static void vnc_client_read(void *opaque);
static void framebuffer_set_updated(VncState *vs, int x, int y, int w, int h);
-static int make_challenge(char *random, int size);
+static int make_challenge(unsigned char *random, int size);
static void set_seed(unsigned int *seedp);
static void get_random(int len, unsigned char *buf);
@@ -330,7 +330,7 @@
static void send_framebuffer_update_raw(VncState *vs, int x, int y, int w, int h)
{
int i;
- char *row;
+ uint8_t *row;
vnc_framebuffer_update(vs, x, y, w, h, 0);
@@ -394,9 +394,9 @@
static void vnc_copy(DisplayState *ds, int src_x, int src_y, int dst_x, int dst_y, int w, int h)
{
int src, dst;
- char *src_row;
- char *dst_row;
- char *old_row;
+ uint8_t *src_row;
+ uint8_t *dst_row;
+ uint8_t *old_row;
int y = 0;
int pitch = ds->linesize;
VncState *vs = ds->opaque;
@@ -465,8 +465,8 @@
VncState *vs = opaque;
int64_t now;
int y;
- char *row;
- char *old_row;
+ uint8_t *row;
+ uint8_t *old_row;
uint64_t width_mask;
int n_rectangles;
int saved_offset;
@@ -491,7 +491,7 @@
for (y = 0; y < vs->ds->height; y++) {
if (vs->dirty_row[y] & width_mask) {
int x;
- char *ptr, *old_ptr;
+ uint8_t *ptr, *old_ptr;
ptr = row;
old_ptr = old_row;
@@ -654,7 +654,7 @@
return buffer->offset == 0;
}
-static char *buffer_end(Buffer *buffer)
+static uint8_t *buffer_end(Buffer *buffer)
{
return buffer->buffer + buffer->offset;
}
@@ -778,7 +778,7 @@
static void vnc_write_u16(VncState *vs, uint16_t value)
{
- char buf[2];
+ uint8_t buf[2];
buf[0] = (value >> 8) & 0xFF;
buf[1] = value & 0xFF;
@@ -788,7 +788,7 @@
static void vnc_write_u8(VncState *vs, uint8_t value)
{
- vnc_write(vs, (char *)&value, 1);
+ vnc_write(vs, &value, 1);
}
static void vnc_flush(VncState *vs)
@@ -797,23 +797,23 @@
vnc_client_write(vs);
}
-static uint8_t read_u8(char *data, size_t offset)
+static uint8_t read_u8(uint8_t *data, size_t offset)
{
return data[offset];
}
-static uint16_t read_u16(char *data, size_t offset)
+static uint16_t read_u16(uint8_t *data, size_t offset)
{
return ((data[offset] & 0xFF) << 8) | (data[offset + 1] & 0xFF);
}
-static int32_t read_s32(char *data, size_t offset)
+static int32_t read_s32(uint8_t *data, size_t offset)
{
return (int32_t)((data[offset] << 24) | (data[offset + 1] << 16) |
(data[offset + 2] << 8) | data[offset + 3]);
}
-static uint32_t read_u32(char *data, size_t offset)
+static uint32_t read_u32(uint8_t *data, size_t offset)
{
return ((data[offset] << 24) | (data[offset + 1] << 16) |
(data[offset + 2] << 8) | data[offset + 3]);
@@ -1115,11 +1115,10 @@
vga_hw_update();
}
-static int protocol_client_msg(VncState *vs, char *data, size_t len)
+static int protocol_client_msg(VncState *vs, uint8_t *data, size_t len)
{
int i;
uint16_t limit;
- int64_t now;
switch (data[0]) {
case 0:
@@ -1188,7 +1187,7 @@
return 8 + v;
}
- client_cut_text(vs, read_u32(data, 4), data + 8);
+ client_cut_text(vs, read_u32(data, 4), (char *)(data + 8));
break;
default:
printf("Msg: %d\n", data[0]);
@@ -1200,7 +1199,7 @@
return 0;
}
-static int protocol_client_init(VncState *vs, char *data, size_t len)
+static int protocol_client_init(VncState *vs, uint8_t *data, size_t len)
{
size_t l;
char pad[3] = { 0, 0, 0 };
@@ -1261,7 +1260,7 @@
return 0;
}
-static int protocol_response(VncState *vs, char *client_response, size_t len)
+static int protocol_response(VncState *vs, uint8_t *client_response, size_t len)
{
extern char vncpasswd[64];
extern unsigned char challenge[AUTHCHALLENGESIZE];
@@ -1299,7 +1298,7 @@
return 0;
}
-static int protocol_version(VncState *vs, char *version, size_t len)
+static int protocol_version(VncState *vs, uint8_t *version, size_t len)
{
extern char vncpasswd[64];
extern unsigned char challenge[AUTHCHALLENGESIZE];
@@ -1474,7 +1473,7 @@
unsigned int seed;
-static int make_challenge(char *random, int size)
+static int make_challenge(unsigned char *random, int size)
{
set_seed(&seed);
Index: ioemu/vnchextile.h
===================================================================
--- ioemu.orig/vnchextile.h 2007-05-02 14:03:13.000000000 +0100
+++ ioemu/vnchextile.h 2007-05-02 14:03:42.000000000 +0100
@@ -13,7 +13,7 @@
uint32_t *last_fg32,
int *has_bg, int *has_fg)
{
- char *row = (vs->ds->data + y * vs->ds->linesize + x * vs->depth);
+ uint8_t *row = (vs->ds->data + y * vs->ds->linesize + x * vs->depth);
pixel_t *irow = (pixel_t *)row;
int j, i;
pixel_t *last_bg = (pixel_t *)last_bg32;
@@ -119,7 +119,7 @@
for (j = 0; j < h; j++) {
int has_color = 0;
int min_x = -1;
- pixel_t color;
+ pixel_t color = 0;
for (i = 0; i < w; i++) {
if (!has_color) {
+13
View File
@@ -0,0 +1,13 @@
Index: ioemu/vnc.c
===================================================================
--- ioemu.orig/vnc.c 2007-05-02 10:47:41.000000000 +0100
+++ ioemu/vnc.c 2007-05-02 10:47:42.000000000 +0100
@@ -1317,7 +1317,7 @@
support = 0;
- if (maj = 3) {
+ if (maj == 3) {
if (min == 3 || min ==4) {
support = 1;
}
+7 -7
View File
@@ -1,8 +1,8 @@
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-12-20 15:21:51.000000000 +0000
+++ ioemu/vl.c 2006-12-20 15:21:51.000000000 +0000
@@ -6511,8 +6511,10 @@
--- ioemu.orig/vl.c 2007-05-03 10:24:05.000000000 +0100
+++ ioemu/vl.c 2007-05-03 10:24:05.000000000 +0100
@@ -6597,8 +6597,10 @@
}
}
@@ -17,8 +17,8 @@ Index: ioemu/vl.c
if (use_gdbstub) {
Index: ioemu/vnc.c
===================================================================
--- ioemu.orig/vnc.c 2006-12-20 15:21:51.000000000 +0000
+++ ioemu/vnc.c 2006-12-20 15:21:51.000000000 +0000
--- ioemu.orig/vnc.c 2007-05-03 10:24:05.000000000 +0100
+++ ioemu/vnc.c 2007-05-03 10:24:05.000000000 +0100
@@ -3,6 +3,7 @@
*
* Copyright (C) 2006 Anthony Liguori <anthony@codemonkey.ws>
@@ -531,8 +531,8 @@ Index: ioemu/vnc.c
}
Index: ioemu/vl.h
===================================================================
--- ioemu.orig/vl.h 2006-12-20 15:21:51.000000000 +0000
+++ ioemu/vl.h 2006-12-20 15:21:51.000000000 +0000
--- ioemu.orig/vl.h 2007-05-03 10:24:05.000000000 +0100
+++ ioemu/vl.h 2007-05-03 10:24:05.000000000 +0100
@@ -319,6 +319,7 @@
int is_graphic_console(void);
CharDriverState *text_console_init(DisplayState *ds);
@@ -20,9 +20,9 @@ Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-12-20 15:21:52.000000000 +0000
+++ ioemu/vl.c 2006-12-20 15:21:52.000000000 +0000
@@ -122,6 +122,7 @@
--- ioemu.orig/vl.c 2007-05-03 10:24:06.000000000 +0100
+++ ioemu/vl.c 2007-05-03 10:24:06.000000000 +0100
@@ -123,6 +123,7 @@
int nographic;
int vncviewer;
int vncunused;
@@ -30,7 +30,7 @@ Index: ioemu/vl.c
const char* keyboard_layout = NULL;
int64_t ticks_per_sec;
int boot_device = 'c';
@@ -2777,10 +2778,22 @@
@@ -2831,10 +2832,22 @@
return -1;
}
@@ -54,7 +54,7 @@ Index: ioemu/vl.c
const char *p, *r;
int port;
@@ -2791,14 +2804,8 @@
@@ -2845,14 +2858,8 @@
if (buf[0] == '\0') {
saddr->sin_addr.s_addr = 0;
} else {
@@ -71,15 +71,15 @@ Index: ioemu/vl.c
}
port = strtol(p, (char **)&r, 0);
if (r == p)
@@ -5344,6 +5351,7 @@
@@ -5419,6 +5426,7 @@
"-vnc display start a VNC server on display\n"
"-vncviewer start a vncviewer process for this domain\n"
"-vncunused bind the VNC server to an unused port\n"
+ "-vnclisten bind the VNC server to this address\n"
"-timeoffset time offset (in seconds) from local time\n"
"-acpi disable or enable ACPI of HVM domain \n"
"\n"
@@ -5434,6 +5442,7 @@
"During emulation, the following keys are useful:\n"
@@ -5507,6 +5515,7 @@
QEMU_OPTION_acpi,
QEMU_OPTION_vncviewer,
QEMU_OPTION_vncunused,
@@ -87,7 +87,7 @@ Index: ioemu/vl.c
};
typedef struct QEMUOption {
@@ -5510,6 +5519,7 @@
@@ -5583,6 +5592,7 @@
{ "vnc", HAS_ARG, QEMU_OPTION_vnc },
{ "vncviewer", 0, QEMU_OPTION_vncviewer },
{ "vncunused", 0, QEMU_OPTION_vncunused },
@@ -95,7 +95,7 @@ Index: ioemu/vl.c
/* temporary options */
{ "usb", 0, QEMU_OPTION_usb },
@@ -5889,6 +5899,8 @@
@@ -5974,6 +5984,8 @@
nb_nics = 0;
/* default mac address of the first network interface */
@@ -104,7 +104,7 @@ Index: ioemu/vl.c
/* init debug */
sprintf(qemu_dm_logfilename, "/var/log/xen/qemu-dm.%ld.log", (long)getpid());
@@ -6264,6 +6276,9 @@
@@ -6346,6 +6358,9 @@
if (vnc_display == -1)
vnc_display = 0;
break;
@@ -114,7 +114,7 @@ Index: ioemu/vl.c
}
}
}
@@ -6470,7 +6485,7 @@
@@ -6547,7 +6562,7 @@
if (nographic) {
dumb_display_init(ds);
} else if (vnc_display != -1) {
@@ -125,8 +125,8 @@ Index: ioemu/vl.c
} else {
Index: ioemu/vl.h
===================================================================
--- ioemu.orig/vl.h 2006-12-20 15:21:52.000000000 +0000
+++ ioemu/vl.h 2006-12-20 15:21:52.000000000 +0000
--- ioemu.orig/vl.h 2007-05-03 10:24:06.000000000 +0100
+++ ioemu/vl.h 2007-05-03 10:24:06.000000000 +0100
@@ -37,6 +37,8 @@
#include <unistd.h>
#include <fcntl.h>
@@ -147,8 +147,8 @@ Index: ioemu/vl.h
/* ide.c */
Index: ioemu/vnc.c
===================================================================
--- ioemu.orig/vnc.c 2006-12-20 15:21:52.000000000 +0000
+++ ioemu/vnc.c 2006-12-20 15:21:52.000000000 +0000
--- ioemu.orig/vnc.c 2007-05-03 10:24:06.000000000 +0100
+++ ioemu/vnc.c 2007-05-03 10:24:06.000000000 +0100
@@ -1197,9 +1197,8 @@
}
}
+40 -37
View File
@@ -17,8 +17,8 @@ Signed-off-by: Masami Watanabe <masami.watanabe@jp.fujitsu.com>
Index: ioemu/Makefile.target
===================================================================
--- ioemu.orig/Makefile.target 2006-12-20 15:21:55.000000000 +0000
+++ ioemu/Makefile.target 2006-12-20 15:21:55.000000000 +0000
--- ioemu.orig/Makefile.target 2007-05-03 15:23:43.000000000 +0100
+++ ioemu/Makefile.target 2007-05-03 15:23:43.000000000 +0100
@@ -407,6 +407,7 @@
VL_OBJS+=sdl.o
endif
@@ -39,9 +39,9 @@ Index: ioemu/Makefile.target
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-12-20 15:21:54.000000000 +0000
+++ ioemu/vl.c 2006-12-20 15:21:55.000000000 +0000
@@ -171,6 +171,9 @@
--- ioemu.orig/vl.c 2007-05-03 15:23:43.000000000 +0100
+++ ioemu/vl.c 2007-05-03 15:23:43.000000000 +0100
@@ -172,6 +172,9 @@
char domain_name[1024] = { 'H','V', 'M', 'X', 'E', 'N', '-'};
extern int domid;
@@ -51,7 +51,7 @@ Index: ioemu/vl.c
/***********************************************************/
/* x86 ISA bus support */
@@ -5895,6 +5898,7 @@
@@ -5982,6 +5985,7 @@
vncunused = 0;
kernel_filename = NULL;
kernel_cmdline = "";
@@ -59,7 +59,7 @@ Index: ioemu/vl.c
#ifndef CONFIG_DM
#ifdef TARGET_PPC
cdrom_index = 1;
@@ -6535,6 +6539,10 @@
@@ -6627,6 +6631,10 @@
init_ioports();
@@ -72,17 +72,17 @@ Index: ioemu/vl.c
dumb_display_init(ds);
Index: ioemu/vl.h
===================================================================
--- ioemu.orig/vl.h 2006-12-20 15:21:54.000000000 +0000
+++ ioemu/vl.h 2006-12-20 15:21:55.000000000 +0000
@@ -1214,6 +1214,7 @@
--- ioemu.orig/vl.h 2007-05-03 15:23:43.000000000 +0100
+++ ioemu/vl.h 2007-05-03 15:23:43.000000000 +0100
@@ -1215,6 +1215,7 @@
void xenstore_process_event(void *opaque);
void xenstore_check_new_media_present(int timeout);
void xenstore_write_vncport(int vnc_display);
+int xenstore_read_vncpasswd(int domid);
/* xen_platform.c */
void pci_xen_platform_init(PCIBus *bus);
@@ -1225,4 +1226,7 @@
int xenstore_vm_write(int domid, char *key, char *val);
char *xenstore_vm_read(int domid, char *key, int *len);
@@ -1233,4 +1234,7 @@
void destroy_hvm_domain(void);
@@ -92,8 +92,8 @@ Index: ioemu/vl.h
#endif /* VL_H */
Index: ioemu/vnc.c
===================================================================
--- ioemu.orig/vnc.c 2006-12-20 15:21:52.000000000 +0000
+++ ioemu/vnc.c 2006-12-20 15:21:55.000000000 +0000
--- ioemu.orig/vnc.c 2007-05-03 15:22:57.000000000 +0100
+++ ioemu/vnc.c 2007-05-03 15:23:43.000000000 +0100
@@ -44,6 +44,7 @@
#include "vnc_keysym.h"
@@ -209,7 +209,7 @@ Index: ioemu/vnc.c
return 0;
}
@@ -1344,3 +1417,32 @@
@@ -1350,3 +1423,32 @@
return pid;
}
}
@@ -244,13 +244,12 @@ Index: ioemu/vnc.c
+}
Index: ioemu/xenstore.c
===================================================================
--- ioemu.orig/xenstore.c 2006-12-20 15:21:54.000000000 +0000
+++ ioemu/xenstore.c 2006-12-20 15:21:55.000000000 +0000
@@ -213,3 +213,54 @@
free(portstr);
--- ioemu.orig/xenstore.c 2007-05-03 15:23:43.000000000 +0100
+++ ioemu/xenstore.c 2007-05-03 15:24:09.000000000 +0100
@@ -253,6 +253,57 @@
free(buf);
}
+
+int xenstore_read_vncpasswd(int domid)
+{
+ extern char vncpasswd[64];
@@ -258,41 +257,41 @@ Index: ioemu/xenstore.c
+ unsigned int i, len, rc = 0;
+
+ if (xsh == NULL) {
+ return -1;
+ return -1;
+ }
+
+ path = xs_get_domain_path(xsh, domid);
+ if (path == NULL) {
+ fprintf(logfile, "xs_get_domain_path() error. domid %d.\n", domid);
+ return -1;
+ fprintf(logfile, "xs_get_domain_path() error. domid %d.\n", domid);
+ return -1;
+ }
+
+ pasprintf(&buf, "%s/vm", path);
+ uuid = xs_read(xsh, XBT_NULL, buf, &len);
+ if (uuid == NULL) {
+ fprintf(logfile, "xs_read(): uuid get error. %s.\n", buf);
+ free(path);
+ return -1;
+ fprintf(logfile, "xs_read(): uuid get error. %s.\n", buf);
+ free(path);
+ return -1;
+ }
+
+ pasprintf(&buf, "%s/vncpasswd", uuid);
+ passwd = xs_read(xsh, XBT_NULL, buf, &len);
+ if (passwd == NULL) {
+ fprintf(logfile, "xs_read(): vncpasswd get error. %s.\n", buf);
+ free(uuid);
+ free(path);
+ return rc;
+ fprintf(logfile, "xs_read(): vncpasswd get error. %s.\n", buf);
+ free(uuid);
+ free(path);
+ return rc;
+ }
+
+ for (i=0; i<len && i<63; i++) {
+ vncpasswd[i] = passwd[i];
+ passwd[i] = '\0';
+ vncpasswd[i] = passwd[i];
+ passwd[i] = '\0';
+ }
+ vncpasswd[len] = '\0';
+ pasprintf(&buf, "%s/vncpasswd", uuid);
+ if (xs_write(xsh, XBT_NULL, buf, passwd, len) == 0) {
+ fprintf(logfile, "xs_write() vncpasswd failed.\n");
+ rc = -1;
+ fprintf(logfile, "xs_write() vncpasswd failed.\n");
+ rc = -1;
+ }
+
+ free(passwd);
@@ -301,10 +300,14 @@ Index: ioemu/xenstore.c
+
+ return rc;
+}
+
char *xenstore_vm_read(int domid, char *key, int *len)
{
char *buf = NULL, *path = NULL, *value = NULL;
Index: ioemu/d3des.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ ioemu/d3des.c 2006-12-20 15:21:55.000000000 +0000
+++ ioemu/d3des.c 2007-05-03 15:23:43.000000000 +0100
@@ -0,0 +1,434 @@
+/*
+ * This is D3DES (V5.09) by Richard Outerbridge with the double and
@@ -743,7 +746,7 @@ Index: ioemu/d3des.c
Index: ioemu/d3des.h
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ ioemu/d3des.h 2006-12-20 15:21:55.000000000 +0000
+++ ioemu/d3des.h 2007-05-03 15:23:43.000000000 +0100
@@ -0,0 +1,51 @@
+/*
+ * This is D3DES (V5.09) by Richard Outerbridge with the double and
+23 -17
View File
@@ -1,15 +1,15 @@
Index: ioemu/vnc.c
===================================================================
--- ioemu.orig/vnc.c 2006-12-20 15:21:51.000000000 +0000
+++ ioemu/vnc.c 2006-12-20 15:21:51.000000000 +0000
@@ -1189,3 +1189,25 @@
--- ioemu.orig/vnc.c 2007-05-03 10:24:06.000000000 +0100
+++ ioemu/vnc.c 2007-05-03 10:24:06.000000000 +0100
@@ -1189,3 +1189,31 @@
vnc_dpy_resize(vs->ds, 640, 400);
}
+
+int vnc_start_viewer(int port)
+{
+ int pid;
+ int pid, i, open_max;
+ char s[16];
+
+ sprintf(s, ":%d", port);
@@ -20,6 +20,12 @@ Index: ioemu/vnc.c
+ exit(1);
+
+ case 0: /* child */
+ open_max = sysconf(_SC_OPEN_MAX);
+ for (i = 0; i < open_max; i++)
+ if (i != STDIN_FILENO &&
+ i != STDOUT_FILENO &&
+ i != STDERR_FILENO)
+ close(i);
+ execlp("vncviewer", "vncviewer", s, NULL);
+ fprintf(stderr, "vncviewer execlp failed\n");
+ exit(1);
@@ -30,9 +36,9 @@ Index: ioemu/vnc.c
+}
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-12-20 15:21:51.000000000 +0000
+++ ioemu/vl.c 2006-12-20 15:21:51.000000000 +0000
@@ -120,6 +120,7 @@
--- ioemu.orig/vl.c 2007-05-03 10:24:05.000000000 +0100
+++ ioemu/vl.c 2007-05-03 10:24:06.000000000 +0100
@@ -121,6 +121,7 @@
int bios_size;
static DisplayState display_state;
int nographic;
@@ -40,23 +46,23 @@ Index: ioemu/vl.c
const char* keyboard_layout = NULL;
int64_t ticks_per_sec;
int boot_device = 'c';
@@ -5340,6 +5341,7 @@
@@ -5415,6 +5416,7 @@
#endif
"-loadvm file start right away with a saved state (loadvm in monitor)\n"
"-vnc display start a VNC server on display\n"
+ "-vncviewer start a vncviewer process for this domain\n"
"-timeoffset time offset (in seconds) from local time\n"
"-acpi disable or enable ACPI of HVM domain \n"
"\n"
@@ -5428,6 +5430,7 @@
"During emulation, the following keys are useful:\n"
@@ -5501,6 +5503,7 @@
QEMU_OPTION_d,
QEMU_OPTION_vcpus,
QEMU_OPTION_timeoffset,
QEMU_OPTION_acpi,
+ QEMU_OPTION_vncviewer,
};
typedef struct QEMUOption {
@@ -5502,6 +5505,7 @@
@@ -5575,6 +5578,7 @@
{ "usbdevice", HAS_ARG, QEMU_OPTION_usbdevice },
{ "smp", HAS_ARG, QEMU_OPTION_smp },
{ "vnc", HAS_ARG, QEMU_OPTION_vnc },
@@ -64,7 +70,7 @@ Index: ioemu/vl.c
/* temporary options */
{ "usb", 0, QEMU_OPTION_usb },
@@ -5852,6 +5856,7 @@
@@ -5933,6 +5937,7 @@
#endif
snapshot = 0;
nographic = 0;
@@ -72,7 +78,7 @@ Index: ioemu/vl.c
kernel_filename = NULL;
kernel_cmdline = "";
#ifdef TARGET_PPC
@@ -6246,6 +6251,9 @@
@@ -6328,6 +6333,9 @@
case QEMU_OPTION_acpi:
acpi_enabled = 1;
break;
@@ -82,7 +88,7 @@ Index: ioemu/vl.c
}
}
}
@@ -6453,6 +6461,8 @@
@@ -6530,6 +6538,8 @@
dumb_display_init(ds);
} else if (vnc_display != -1) {
vnc_display_init(ds, vnc_display);
@@ -93,8 +99,8 @@ Index: ioemu/vl.c
sdl_display_init(ds, full_screen);
Index: ioemu/vl.h
===================================================================
--- ioemu.orig/vl.h 2006-12-20 15:21:51.000000000 +0000
+++ ioemu/vl.h 2006-12-20 15:21:51.000000000 +0000
--- ioemu.orig/vl.h 2007-05-03 10:24:05.000000000 +0100
+++ ioemu/vl.h 2007-05-03 10:24:06.000000000 +0100
@@ -786,6 +786,7 @@
/* vnc.c */
+23 -8
View File
@@ -1,7 +1,7 @@
Index: ioemu/Makefile
===================================================================
--- ioemu.orig/Makefile 2006-12-08 01:26:04.000000000 +0000
+++ ioemu/Makefile 2006-12-08 01:26:06.000000000 +0000
--- ioemu.orig/Makefile 2007-05-03 15:38:37.000000000 +0100
+++ ioemu/Makefile 2007-05-03 15:38:39.000000000 +0100
@@ -1,11 +1,14 @@
# Makefile for QEMU.
@@ -41,7 +41,17 @@ Index: ioemu/Makefile
done
distclean: clean
@@ -68,12 +73,12 @@
@@ -60,24 +65,24 @@
install-doc: $(DOCS)
mkdir -p "$(DESTDIR)$(docdir)"
- $(INSTALL) -m 644 qemu-doc.html qemu-tech.html "$(DESTDIR)$(docdir)"
+ $(INSTALL_DATA) qemu-doc.html qemu-tech.html "$(DESTDIR)$(docdir)"
ifndef CONFIG_WIN32
mkdir -p "$(DESTDIR)$(mandir)/man1"
- $(INSTALL) qemu.1 qemu-img.1 "$(DESTDIR)$(mandir)/man1"
+ $(INSTALL_DATA) qemu.1 qemu-img.1 "$(DESTDIR)$(mandir)/man1"
endif
install: all $(if $(BUILD_DOCS),install-doc)
mkdir -p "$(DESTDIR)$(bindir)"
@@ -55,11 +65,16 @@ Index: ioemu/Makefile
+# mkdir -p "$(DESTDIR)$(datadir)"
+# for x in bios.bin vgabios.bin vgabios-cirrus.bin ppc_rom.bin \
+# video.x openbios-sparc32 linux_boot.bin; do \
+# $(INSTALL) -m 644 $(SRC_PATH)/pc-bios/$$x "$(DESTDIR)$(datadir)"; \
+# $(INSTALL_DATA) $(SRC_PATH)/pc-bios/$$x "$(DESTDIR)$(datadir)"; \
+# done
ifndef CONFIG_WIN32
mkdir -p "$(DESTDIR)$(datadir)/keymaps"
for x in $(KEYMAPS); do \
- $(INSTALL) -m 644 $(SRC_PATH)/keymaps/$$x "$(DESTDIR)$(datadir)/keymaps"; \
+ $(INSTALL_DATA) $(SRC_PATH)/keymaps/$$x "$(DESTDIR)$(datadir)/keymaps"; \
done
endif
for d in $(TARGET_DIRS); do \
@@ -89,7 +94,7 @@
$(MAKE) -C tests $@
@@ -85,8 +100,8 @@ Index: ioemu/Makefile
info: qemu-doc.info qemu-tech.info
Index: ioemu/Makefile.target
===================================================================
--- ioemu.orig/Makefile.target 2006-12-08 01:26:04.000000000 +0000
+++ ioemu/Makefile.target 2006-12-08 01:41:05.000000000 +0000
--- ioemu.orig/Makefile.target 2007-05-03 15:38:37.000000000 +0100
+++ ioemu/Makefile.target 2007-05-03 15:38:39.000000000 +0100
@@ -1,5 +1,8 @@
include config.mak
@@ -163,8 +178,8 @@ Index: ioemu/Makefile.target
include .depend
Index: ioemu/configure
===================================================================
--- ioemu.orig/configure 2006-12-08 01:26:04.000000000 +0000
+++ ioemu/configure 2006-12-08 01:40:58.000000000 +0000
--- ioemu.orig/configure 2007-05-03 15:38:37.000000000 +0100
+++ ioemu/configure 2007-05-03 15:38:39.000000000 +0100
@@ -18,8 +18,8 @@
# default parameters
+7 -7
View File
@@ -1,7 +1,7 @@
Index: ioemu/sdl.c
===================================================================
--- ioemu.orig/sdl.c 2006-08-06 02:03:48.563137711 +0100
+++ ioemu/sdl.c 2006-08-06 02:17:16.063137816 +0100
--- ioemu.orig/sdl.c 2007-05-02 16:04:45.000000000 +0100
+++ ioemu/sdl.c 2007-05-02 16:05:51.000000000 +0100
@@ -273,14 +273,14 @@
static void sdl_update_caption(void)
{
@@ -21,8 +21,8 @@ Index: ioemu/sdl.c
static void sdl_hide_cursor(void)
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-08-06 02:16:31.246133963 +0100
+++ ioemu/vl.c 2006-08-06 02:17:31.428424918 +0100
--- ioemu.orig/vl.c 2007-05-02 16:05:51.000000000 +0100
+++ ioemu/vl.c 2007-05-02 16:05:51.000000000 +0100
@@ -158,6 +158,8 @@
int acpi_enabled = 1;
int fd_bootchk = 1;
@@ -56,7 +56,7 @@ Index: ioemu/vl.c
{ "serial", 1, QEMU_OPTION_serial },
{ "parallel", 1, QEMU_OPTION_parallel },
{ "loadvm", HAS_ARG, QEMU_OPTION_loadvm },
@@ -6062,6 +6067,9 @@
@@ -6066,6 +6071,9 @@
case QEMU_OPTION_no_acpi:
acpi_enabled = 0;
break;
@@ -68,8 +68,8 @@ Index: ioemu/vl.c
}
Index: ioemu/vl.h
===================================================================
--- ioemu.orig/vl.h 2006-08-06 02:15:39.711878977 +0100
+++ ioemu/vl.h 2006-08-06 02:17:16.068137258 +0100
--- ioemu.orig/vl.h 2007-05-02 16:05:50.000000000 +0100
+++ ioemu/vl.h 2007-05-02 16:05:51.000000000 +0100
@@ -1185,4 +1185,5 @@
void kqemu_record_dump(void);
+3 -3
View File
@@ -1,7 +1,7 @@
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-08-06 02:17:31.428424918 +0100
+++ ioemu/vl.c 2006-08-06 02:18:12.550840673 +0100
--- ioemu.orig/vl.c 2007-05-02 16:05:51.000000000 +0100
+++ ioemu/vl.c 2007-05-02 16:05:51.000000000 +0100
@@ -159,6 +159,7 @@
int fd_bootchk = 1;
@@ -36,7 +36,7 @@ Index: ioemu/vl.c
{ NULL },
};
@@ -6070,6 +6076,10 @@
@@ -6074,6 +6080,10 @@
case QEMU_OPTION_domainname:
strncat(domain_name, optarg, sizeof(domain_name) - 20);
break;
+232 -141
View File
@@ -17,101 +17,189 @@ Signed-off-by: Keir Fraser <keir@xensource.com>
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-12-20 15:21:55.000000000 +0000
+++ ioemu/vl.c 2006-12-20 15:21:56.000000000 +0000
@@ -5808,6 +5808,91 @@
--- ioemu.orig/vl.c 2007-05-03 15:12:21.000000000 +0100
+++ ioemu/vl.c 2007-05-03 15:12:41.000000000 +0100
@@ -286,7 +286,7 @@
for(i = start; i < start + length; i += size) {
ioport_write_table[bsize][i] = func;
if (ioport_opaque[i] != NULL && ioport_opaque[i] != opaque)
- hw_error("register_ioport_read: invalid opaque");
+ hw_error("register_ioport_write: invalid opaque");
ioport_opaque[i] = opaque;
}
return 0;
@@ -5894,6 +5894,157 @@
suspend_requested = 1;
}
+#if defined(__i386__) || defined(__x86_64__)
+#if defined(MAPCACHE)
+
+#if defined(__i386__)
+#define MAX_MCACHE_SIZE 0x40000000 /* 1GB max for x86 */
+#define MCACHE_BUCKET_SHIFT 16
+#elif defined(__x86_64__)
+#define MAX_MCACHE_SIZE 0x1000000000 /* 64GB max for x86_64 */
+#define MCACHE_BUCKET_SHIFT 20
+#endif
+
+#define MCACHE_BUCKET_SIZE (1UL << MCACHE_BUCKET_SHIFT)
+
+#define BITS_PER_LONG (sizeof(long)*8)
+#define BITS_TO_LONGS(bits) \
+ (((bits)+BITS_PER_LONG-1)/BITS_PER_LONG)
+#define DECLARE_BITMAP(name,bits) \
+ unsigned long name[BITS_TO_LONGS(bits)]
+#define test_bit(bit,map) \
+ (!!((map)[(bit)/BITS_PER_LONG] & (1UL << ((bit)%BITS_PER_LONG))))
+
+struct map_cache {
+ unsigned long paddr_index;
+ uint8_t *vaddr_base;
+ DECLARE_BITMAP(valid_mapping, MCACHE_BUCKET_SIZE>>PAGE_SHIFT);
+};
+
+static struct map_cache *mapcache_entry;
+static unsigned long nr_buckets;
+
+static int qemu_map_cache_init(unsigned long nr_pages)
+/* For most cases (>99.9%), the page address is the same. */
+static unsigned long last_address_index = ~0UL;
+static uint8_t *last_address_vaddr;
+
+static int qemu_map_cache_init(void)
+{
+ unsigned long max_pages = MAX_MCACHE_SIZE >> PAGE_SHIFT;
+ int i;
+ unsigned long size;
+
+ if (nr_pages < max_pages)
+ max_pages = nr_pages;
+
+ nr_buckets = max_pages + (1UL << (MCACHE_BUCKET_SHIFT - PAGE_SHIFT)) - 1;
+ nr_buckets >>= (MCACHE_BUCKET_SHIFT - PAGE_SHIFT);
+ nr_buckets = (((MAX_MCACHE_SIZE >> PAGE_SHIFT) +
+ (1UL << (MCACHE_BUCKET_SHIFT - PAGE_SHIFT)) - 1) >>
+ (MCACHE_BUCKET_SHIFT - PAGE_SHIFT));
+ fprintf(logfile, "qemu_map_cache_init nr_buckets = %lx\n", nr_buckets);
+
+ mapcache_entry = malloc(nr_buckets * sizeof(struct map_cache));
+ if (mapcache_entry == NULL) {
+ /*
+ * Use mmap() directly: lets us allocate a big hash table with no up-front
+ * cost in storage space. The OS will allocate memory only for the buckets
+ * that we actually use. All others will contain all zeroes.
+ */
+ size = nr_buckets * sizeof(struct map_cache);
+ size = (size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1);
+ mapcache_entry = mmap(NULL, size, PROT_READ|PROT_WRITE,
+ MAP_SHARED|MAP_ANONYMOUS, 0, 0);
+ if (mapcache_entry == MAP_FAILED) {
+ errno = ENOMEM;
+ return -1;
+ }
+
+ memset(mapcache_entry, 0, nr_buckets * sizeof(struct map_cache));
+
+ /*
+ * To avoid ENOMEM from xc_map_foreign_batch() at runtime, we
+ * pre-fill all the map caches in advance.
+ */
+ for (i = 0; i < nr_buckets; i++)
+ (void)qemu_map_cache(((target_phys_addr_t)i) << MCACHE_BUCKET_SHIFT);
+
+ return 0;
+}
+
+static void qemu_remap_bucket(struct map_cache *entry,
+ unsigned long address_index)
+{
+ uint8_t *vaddr_base;
+ unsigned long pfns[MCACHE_BUCKET_SIZE >> PAGE_SHIFT];
+ unsigned int i, j;
+
+ if (entry->vaddr_base != NULL) {
+ errno = munmap(entry->vaddr_base, MCACHE_BUCKET_SIZE);
+ if (errno) {
+ fprintf(logfile, "unmap fails %d\n", errno);
+ exit(-1);
+ }
+ }
+
+ for (i = 0; i < MCACHE_BUCKET_SIZE >> PAGE_SHIFT; i++)
+ pfns[i] = (address_index << (MCACHE_BUCKET_SHIFT-PAGE_SHIFT)) + i;
+
+ vaddr_base = xc_map_foreign_batch(xc_handle, domid, PROT_READ|PROT_WRITE,
+ pfns, MCACHE_BUCKET_SIZE >> PAGE_SHIFT);
+ if (vaddr_base == NULL) {
+ fprintf(logfile, "xc_map_foreign_batch error %d\n", errno);
+ exit(-1);
+ }
+
+ entry->vaddr_base = vaddr_base;
+ entry->paddr_index = address_index;
+
+ for (i = 0; i < MCACHE_BUCKET_SIZE >> PAGE_SHIFT; i += BITS_PER_LONG) {
+ unsigned long word = 0;
+ j = ((i + BITS_PER_LONG) > (MCACHE_BUCKET_SIZE >> PAGE_SHIFT)) ?
+ (MCACHE_BUCKET_SIZE >> PAGE_SHIFT) % BITS_PER_LONG : BITS_PER_LONG;
+ while (j > 0)
+ word = (word << 1) | !(pfns[i + --j] & 0xF0000000UL);
+ entry->valid_mapping[i / BITS_PER_LONG] = word;
+ }
+}
+
+uint8_t *qemu_map_cache(target_phys_addr_t phys_addr)
+{
+ struct map_cache *entry;
+ unsigned long address_index = phys_addr >> MCACHE_BUCKET_SHIFT;
+ unsigned long address_offset = phys_addr & (MCACHE_BUCKET_SIZE-1);
+
+ /* For most cases (>99.9%), the page address is the same. */
+ static unsigned long last_address_index = ~0UL;
+ static uint8_t *last_address_vaddr;
+
+ if (address_index == last_address_index)
+ return last_address_vaddr + address_offset;
+
+ entry = &mapcache_entry[address_index % nr_buckets];
+
+ if (entry->vaddr_base == NULL || entry->paddr_index != address_index) {
+ /* We need to remap a bucket. */
+ uint8_t *vaddr_base;
+ unsigned long pfns[MCACHE_BUCKET_SIZE >> PAGE_SHIFT];
+ unsigned int i;
+ if (entry->vaddr_base == NULL || entry->paddr_index != address_index ||
+ !test_bit(address_offset>>PAGE_SHIFT, entry->valid_mapping))
+ qemu_remap_bucket(entry, address_index);
+
+ if (entry->vaddr_base != NULL) {
+ errno = munmap(entry->vaddr_base, MCACHE_BUCKET_SIZE);
+ if (errno) {
+ fprintf(logfile, "unmap fails %d\n", errno);
+ exit(-1);
+ }
+ }
+
+ for (i = 0; i < MCACHE_BUCKET_SIZE >> PAGE_SHIFT; i++)
+ pfns[i] = (address_index << (MCACHE_BUCKET_SHIFT-PAGE_SHIFT)) + i;
+
+ vaddr_base = xc_map_foreign_batch(
+ xc_handle, domid, PROT_READ|PROT_WRITE,
+ pfns, MCACHE_BUCKET_SIZE >> PAGE_SHIFT);
+ if (vaddr_base == NULL) {
+ fprintf(logfile, "xc_map_foreign_batch error %d\n", errno);
+ exit(-1);
+ }
+
+ entry->vaddr_base = vaddr_base;
+ entry->paddr_index = address_index;;
+ }
+ if (!test_bit(address_offset>>PAGE_SHIFT, entry->valid_mapping))
+ return NULL;
+
+ last_address_index = address_index;
+ last_address_vaddr = entry->vaddr_base;
+
+ return last_address_vaddr + address_offset;
+}
+#endif
+
+void qemu_invalidate_map_cache(void)
+{
+ unsigned long i;
+
+ mapcache_lock();
+
+ for (i = 0; i < nr_buckets; i++) {
+ struct map_cache *entry = &mapcache_entry[i];
+
+ if (entry->vaddr_base == NULL)
+ continue;
+
+ errno = munmap(entry->vaddr_base, MCACHE_BUCKET_SIZE);
+ if (errno) {
+ fprintf(logfile, "unmap fails %d\n", errno);
+ exit(-1);
+ }
+
+ entry->paddr_index = 0;
+ entry->vaddr_base = NULL;
+ }
+
+ last_address_index = ~0UL;
+ last_address_vaddr = NULL;
+
+ mapcache_unlock();
+}
+
+#endif /* defined(MAPCACHE) */
+
int main(int argc, char **argv)
{
#ifdef CONFIG_GDBSTUB
@@ -6130,6 +6215,7 @@
@@ -5930,8 +6081,11 @@
unsigned long ioreq_pfn;
extern void *shared_page;
extern void *buffered_io_page;
- extern void *buffered_pio_page;
+#ifdef __ia64__
unsigned long nr_pages;
+ xen_pfn_t *page_array;
+ extern void *buffered_pio_page;
+#endif
char qemu_dm_logfilename[64];
@@ -6221,6 +6375,7 @@
break;
case QEMU_OPTION_m:
ram_size = atol(optarg) * 1024 * 1024;
@@ -119,75 +207,61 @@ Index: ioemu/vl.c
if (ram_size <= 0)
help();
#ifndef CONFIG_DM
@@ -6404,50 +6490,41 @@
shared_page_nr = nr_pages - 1;
#endif
@@ -6482,30 +6637,15 @@
- page_array = (xen_pfn_t *)malloc(tmp_nr_pages * sizeof(xen_pfn_t));
#if defined(__i386__) || defined(__x86_64__)
- nr_pages = ram_size/PAGE_SIZE;
-
- page_array = (xen_pfn_t *)malloc(nr_pages * sizeof(xen_pfn_t));
- if (page_array == NULL) {
- fprintf(logfile, "malloc returned error %d\n", errno);
- exit(-1);
- }
-
#if defined(__i386__) || defined(__x86_64__)
- for ( i = 0; i < tmp_nr_pages; i++)
- for ( i = 0; i < nr_pages; i++)
- page_array[i] = i;
-
- phys_ram_base = xc_map_foreign_batch(xc_handle, domid,
- PROT_READ|PROT_WRITE, page_array,
- tmp_nr_pages);
- nr_pages);
- if (phys_ram_base == NULL) {
- fprintf(logfile, "batch map guest memory returned error %d\n", errno);
+ if ( qemu_map_cache_init(tmp_nr_pages) )
+ {
+ if (qemu_map_cache_init()) {
+ fprintf(logfile, "qemu_map_cache_init returned: error %d\n", errno);
exit(-1);
}
xc_get_hvm_param(xc_handle, domid, HVM_PARAM_IOREQ_PFN, &ioreq_pfn);
fprintf(logfile, "shared page at pfn %lx\n", ioreq_pfn);
shared_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
- PROT_READ|PROT_WRITE,
- page_array[shared_page_nr]);
+ PROT_READ|PROT_WRITE, shared_page_nr);
- page_array[ioreq_pfn]);
+ PROT_READ|PROT_WRITE, ioreq_pfn);
if (shared_page == NULL) {
fprintf(logfile, "map shared IO page returned error %d\n", errno);
exit(-1);
}
- fprintf(logfile, "shared page at pfn:%lx, mfn: %"PRIx64"\n",
- shared_page_nr, (uint64_t)(page_array[shared_page_nr]));
+ fprintf(logfile, "shared page at pfn:%lx\n", shared_page_nr);
@@ -6514,15 +6654,12 @@
xc_get_hvm_param(xc_handle, domid, HVM_PARAM_BUFIOREQ_PFN, &ioreq_pfn);
fprintf(logfile, "buffered io page at pfn %lx\n", ioreq_pfn);
buffered_io_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
PROT_READ|PROT_WRITE,
- page_array[shared_page_nr - 2]);
+ shared_page_nr - 2);
- PROT_READ|PROT_WRITE,
- page_array[ioreq_pfn]);
+ PROT_READ|PROT_WRITE, ioreq_pfn);
if (buffered_io_page == NULL) {
fprintf(logfile, "map buffered IO page returned error %d\n", errno);
exit(-1);
}
- fprintf(logfile, "buffered io page at pfn:%lx, mfn: %"PRIx64"\n",
- shared_page_nr - 2, (uint64_t)(page_array[shared_page_nr - 2]));
-
- free(page_array);
+ fprintf(logfile, "buffered io page at pfn:%lx\n", shared_page_nr - 2);
-
#elif defined(__ia64__)
-
+
+ page_array = (xen_pfn_t *)malloc(tmp_nr_pages * sizeof(xen_pfn_t));
+ if (page_array == NULL) {
+ fprintf(logfile, "malloc returned error %d\n", errno);
+ exit(-1);
+ }
+
shared_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
PROT_READ|PROT_WRITE,
IO_PAGE_START >> PAGE_SHIFT);
nr_pages = ram_size/PAGE_SIZE;
Index: ioemu/target-i386-dm/exec-dm.c
===================================================================
--- ioemu.orig/target-i386-dm/exec-dm.c 2006-12-20 15:21:42.000000000 +0000
+++ ioemu/target-i386-dm/exec-dm.c 2006-12-21 11:32:29.000000000 +0000
--- ioemu.orig/target-i386-dm/exec-dm.c 2007-05-03 15:10:22.000000000 +0100
+++ ioemu/target-i386-dm/exec-dm.c 2007-05-03 15:12:34.000000000 +0100
@@ -36,6 +36,7 @@
#include "cpu.h"
@@ -196,25 +270,13 @@ Index: ioemu/target-i386-dm/exec-dm.c
//#define DEBUG_TB_INVALIDATE
//#define DEBUG_FLUSH
@@ -127,10 +128,29 @@
@@ -127,10 +128,17 @@
FILE *logfile;
int loglevel;
+
+#if defined(__i386__) || defined(__x86_64__)
+#define MAPCACHE
+#endif
+
+#ifdef MAPCACHE
+#include <pthread.h>
+static pthread_mutex_t mapcache_mutex;
+#define mapcache_lock() pthread_mutex_lock(&mapcache_mutex)
+#define mapcache_unlock() pthread_mutex_unlock(&mapcache_mutex)
+#else
+#define mapcache_lock() ( (void)0 )
+#define mapcache_unlock() ( (void)0 )
+pthread_mutex_t mapcache_mutex;
+#endif
+
+
void cpu_exec_init(CPUState *env)
{
@@ -226,7 +288,7 @@ Index: ioemu/target-i386-dm/exec-dm.c
env->next_cpu = NULL;
penv = &first_cpu;
@@ -144,6 +164,14 @@
@@ -144,6 +152,14 @@
/* alloc dirty bits array */
phys_ram_dirty = qemu_malloc(phys_ram_size >> TARGET_PAGE_BITS);
@@ -241,19 +303,28 @@ Index: ioemu/target-i386-dm/exec-dm.c
}
/* enable or disable low levels log */
@@ -426,19 +454,27 @@
#endif
@@ -409,16 +425,11 @@
return 0;
}
-static inline int paddr_is_ram(target_phys_addr_t addr)
-{
- /* Is this guest physical address RAM-backed? */
-#if defined(CONFIG_DM) && (defined(__i386__) || defined(__x86_64__))
- return ((addr < HVM_BELOW_4G_MMIO_START) ||
- (addr >= HVM_BELOW_4G_MMIO_START + HVM_BELOW_4G_MMIO_LENGTH));
-#else
- return (addr < ram_size);
+#if defined(__i386__) || defined(__x86_64__)
+#define phys_ram_addr(x) (qemu_map_cache(x))
+#elif defined(__ia64__)
+#define phys_ram_addr(x) (phys_ram_base + (x))
+#endif
+
+#define phys_ram_addr(x) ((addr < ram_size) ? (phys_ram_base + (x)) : NULL)
#endif
-}
void cpu_physical_memory_rw(target_phys_addr_t addr, uint8_t *buf,
int len, int is_write)
{
@@ -426,13 +437,15 @@
int l, io_index;
uint8_t *ptr;
uint32_t val;
@@ -271,12 +342,14 @@ Index: ioemu/target-i386-dm/exec-dm.c
io_index = iomem_index(addr);
if (is_write) {
if (io_index) {
@@ -460,9 +496,10 @@
@@ -452,11 +465,11 @@
io_mem_write[io_index][0](io_mem_opaque[io_index], addr, val);
l = 1;
}
} else if (paddr_is_ram(addr)) {
- } else if (paddr_is_ram(addr)) {
+ } else if ((ptr = phys_ram_addr(addr)) != NULL) {
/* Reading from RAM */
- memcpy(phys_ram_base + addr, buf, l);
+ ptr = phys_ram_addr(addr);
+ memcpy(ptr, buf, l);
#ifdef __ia64__
- sync_icache((unsigned long)(phys_ram_base + addr), l);
@@ -284,17 +357,19 @@ Index: ioemu/target-i386-dm/exec-dm.c
#endif
}
} else {
@@ -485,7 +522,8 @@
@@ -477,9 +490,9 @@
stb_raw(buf, val);
l = 1;
}
} else if (paddr_is_ram(addr)) {
- } else if (paddr_is_ram(addr)) {
+ } else if ((ptr = phys_ram_addr(addr)) != NULL) {
/* Reading from RAM */
- memcpy(buf, phys_ram_base + addr, l);
+ ptr = phys_ram_addr(addr);
+ memcpy(buf, ptr, l);
} else {
/* Neither RAM nor known MMIO space */
memset(buf, 0xff, len);
@@ -495,6 +533,8 @@
@@ -489,6 +502,8 @@
buf += l;
addr += l;
}
@@ -305,30 +380,32 @@ Index: ioemu/target-i386-dm/exec-dm.c
Index: ioemu/vl.h
===================================================================
--- ioemu.orig/vl.h 2006-12-20 15:21:55.000000000 +0000
+++ ioemu/vl.h 2006-12-20 15:21:56.000000000 +0000
@@ -156,6 +156,26 @@
--- ioemu.orig/vl.h 2007-05-03 15:12:20.000000000 +0100
+++ ioemu/vl.h 2007-05-03 15:12:34.000000000 +0100
@@ -156,6 +156,28 @@
extern FILE *logfile;
+
+#if defined(__i386__) || defined(__x86_64__)
+#if defined(__i386__)
+#define MAX_MCACHE_SIZE 0x40000000 /* 1GB max for x86 */
+#define MCACHE_BUCKET_SHIFT 16
+#elif defined(__x86_64__)
+#define MAX_MCACHE_SIZE 0x1000000000 /* 64GB max for x86_64 */
+#define MCACHE_BUCKET_SHIFT 20
+#endif
+
+#define MCACHE_BUCKET_SIZE (1UL << MCACHE_BUCKET_SHIFT)
+
+struct map_cache {
+ unsigned long paddr_index;
+ uint8_t *vaddr_base;
+};
+#define MAPCACHE
+
+uint8_t *qemu_map_cache(target_phys_addr_t phys_addr);
+void qemu_invalidate_map_cache(void);
+
+#include <pthread.h>
+extern pthread_mutex_t mapcache_mutex;
+#define mapcache_lock() pthread_mutex_lock(&mapcache_mutex)
+#define mapcache_unlock() pthread_mutex_unlock(&mapcache_mutex)
+
+#else
+
+#define qemu_invalidate_map_cache() ((void)0)
+
+#define mapcache_lock() ((void)0)
+#define mapcache_unlock() ((void)0)
+
+#endif
+
extern int xc_handle;
@@ -336,8 +413,8 @@ Index: ioemu/vl.h
Index: ioemu/target-i386-dm/cpu.h
===================================================================
--- ioemu.orig/target-i386-dm/cpu.h 2006-12-20 15:21:45.000000000 +0000
+++ ioemu/target-i386-dm/cpu.h 2006-12-20 15:21:56.000000000 +0000
--- ioemu.orig/target-i386-dm/cpu.h 2007-05-03 15:10:22.000000000 +0100
+++ ioemu/target-i386-dm/cpu.h 2007-05-03 15:12:21.000000000 +0100
@@ -25,7 +25,8 @@
#ifdef TARGET_X86_64
#define TARGET_LONG_BITS 64
@@ -348,3 +425,17 @@ Index: ioemu/target-i386-dm/cpu.h
#endif
/* target supports implicit self modifying code */
Index: ioemu/target-i386-dm/helper2.c
===================================================================
--- ioemu.orig/target-i386-dm/helper2.c 2007-05-03 15:12:19.000000000 +0100
+++ ioemu/target-i386-dm/helper2.c 2007-05-03 15:12:21.000000000 +0100
@@ -526,6 +526,9 @@
case IOREQ_TYPE_TIMEOFFSET:
cpu_ioreq_timeoffset(env, req);
break;
+ case IOREQ_TYPE_INVALIDATE:
+ qemu_invalidate_map_cache();
+ break;
default:
hw_error("Invalid ioreq type 0x%x\n", req->type);
}
+30 -30
View File
@@ -1,7 +1,7 @@
Index: ioemu/hw/pc.c
===================================================================
--- ioemu.orig/hw/pc.c 2006-12-08 02:00:38.000000000 +0000
+++ ioemu/hw/pc.c 2006-12-08 02:02:07.000000000 +0000
--- ioemu.orig/hw/pc.c 2007-05-03 09:54:24.000000000 +0100
+++ ioemu/hw/pc.c 2007-05-03 09:56:32.000000000 +0100
@@ -646,7 +646,9 @@
}
@@ -25,9 +25,17 @@ Index: ioemu/hw/pc.c
isa_bios_size = bios_size;
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-12-08 02:00:39.000000000 +0000
+++ ioemu/vl.c 2006-12-08 02:02:28.000000000 +0000
@@ -158,6 +158,8 @@
--- ioemu.orig/vl.c 2007-05-03 09:54:24.000000000 +0100
+++ ioemu/vl.c 2007-05-03 10:04:06.000000000 +0100
@@ -88,6 +88,7 @@
#include "exec-all.h"
+#include <xen/hvm/params.h>
#define DEFAULT_NETWORK_SCRIPT "/etc/xen/qemu-ifup"
//#define DEBUG_UNUSED_IOPORT
@@ -158,6 +159,8 @@
int acpi_enabled = 1;
int fd_bootchk = 1;
@@ -36,17 +44,17 @@ Index: ioemu/vl.c
char domain_name[1024] = { 'H','V', 'M', 'X', 'E', 'N', '-'};
extern int domid;
@@ -5650,6 +5652,9 @@
@@ -5650,6 +5653,9 @@
QEMUMachine *machine;
char usb_devices[MAX_USB_CMDLINE][128];
int usb_devices_index;
+ unsigned long nr_pages, tmp_nr_pages, shared_page_nr;
+ xen_pfn_t *page_array;
+ unsigned long ioreq_pfn;
+ extern void *shared_page;
+ unsigned long nr_pages;
char qemu_dm_logfilename[64];
@@ -5917,11 +5922,13 @@
@@ -5921,11 +5927,13 @@
ram_size = atol(optarg) * 1024 * 1024;
if (ram_size <= 0)
help();
@@ -60,7 +68,7 @@ Index: ioemu/vl.c
break;
case QEMU_OPTION_l:
{
@@ -6133,12 +6140,61 @@
@@ -6137,12 +6145,53 @@
/* init the memory */
phys_ram_size = ram_size + vga_ram_size + bios_size;
@@ -68,45 +76,37 @@ Index: ioemu/vl.c
+
+ xc_handle = xc_interface_open();
+
+ nr_pages = ram_size/PAGE_SIZE;
+ tmp_nr_pages = nr_pages;
+
+#if defined(__i386__) || defined(__x86_64__)
+ if (ram_size > HVM_BELOW_4G_RAM_END) {
+ tmp_nr_pages += HVM_BELOW_4G_MMIO_LENGTH >> PAGE_SHIFT;
+ shared_page_nr = (HVM_BELOW_4G_RAM_END >> PAGE_SHIFT) - 1;
+ } else
+ shared_page_nr = nr_pages - 1;
+#endif
+
+ page_array = (xen_pfn_t *)malloc(tmp_nr_pages * sizeof(xen_pfn_t));
+ nr_pages = ram_size/PAGE_SIZE;
+
+ page_array = (xen_pfn_t *)malloc(nr_pages * sizeof(xen_pfn_t));
+ if (page_array == NULL) {
+ fprintf(logfile, "malloc returned error %d\n", errno);
+ exit(-1);
+ }
+
+ for ( i = 0; i < tmp_nr_pages; i++)
+ for ( i = 0; i < nr_pages; i++)
+ page_array[i] = i;
+
+ phys_ram_base = xc_map_foreign_batch(xc_handle, domid,
+ PROT_READ|PROT_WRITE, page_array,
+ tmp_nr_pages);
+ nr_pages);
+ if (phys_ram_base == NULL) {
+ fprintf(logfile, "batch map guest memory returned error %d\n", errno);
+ exit(-1);
+ }
+
+ xc_get_hvm_param(xc_handle, domid, HVM_PARAM_IOREQ_PFN, &ioreq_pfn);
+ fprintf(logfile, "shared page at pfn %lx\n", ioreq_pfn);
+ shared_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
+ PROT_READ|PROT_WRITE,
+ page_array[shared_page_nr]);
+ page_array[ioreq_pfn]);
+ if (shared_page == NULL) {
+ fprintf(logfile, "map shared IO page returned error %d\n", errno);
+ exit(-1);
+ }
+
+ fprintf(logfile, "shared page at pfn:%lx, mfn: %"PRIx64"\n",
+ shared_page_nr, (uint64_t)(page_array[shared_page_nr]));
+
+ free(page_array);
+
+#else /* !CONFIG_DM */
@@ -124,8 +124,8 @@ Index: ioemu/vl.c
if (cdrom_index >= 0) {
Index: ioemu/hw/piix_pci.c
===================================================================
--- ioemu.orig/hw/piix_pci.c 2006-12-08 02:00:36.000000000 +0000
+++ ioemu/hw/piix_pci.c 2006-12-08 02:02:06.000000000 +0000
--- ioemu.orig/hw/piix_pci.c 2007-05-03 09:54:18.000000000 +0100
+++ ioemu/hw/piix_pci.c 2007-05-03 09:56:32.000000000 +0100
@@ -399,7 +399,7 @@
uint8_t elcr[2];
@@ -137,8 +137,8 @@ Index: ioemu/hw/piix_pci.c
elcr[0] = 0x00;
Index: ioemu/vl.h
===================================================================
--- ioemu.orig/vl.h 2006-12-08 02:00:39.000000000 +0000
+++ ioemu/vl.h 2006-12-08 02:02:07.000000000 +0000
--- ioemu.orig/vl.h 2007-05-03 09:54:24.000000000 +0100
+++ ioemu/vl.h 2007-05-03 09:56:32.000000000 +0100
@@ -39,6 +39,7 @@
#include <sys/stat.h>
#include "xenctrl.h"
+20 -9
View File
@@ -1,16 +1,16 @@
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-08-06 02:22:01.556312045 +0100
+++ ioemu/vl.c 2006-08-06 02:22:53.925474246 +0100
@@ -89,6 +89,7 @@
#include "exec-all.h"
--- ioemu.orig/vl.c 2007-05-03 10:07:52.000000000 +0100
+++ ioemu/vl.c 2007-05-03 10:07:52.000000000 +0100
@@ -90,6 +90,7 @@
#include <xen/hvm/params.h>
#define DEFAULT_NETWORK_SCRIPT "/etc/xen/qemu-ifup"
+#define DEFAULT_BRIDGE "xenbr0"
//#define DEBUG_UNUSED_IOPORT
//#define DEBUG_IOPORT
@@ -3090,11 +3091,11 @@
@@ -3091,11 +3092,11 @@
#endif
static int net_tap_init(VLANState *vlan, const char *ifname1,
@@ -24,7 +24,18 @@ Index: ioemu/vl.c
char **parg;
char ifname[128];
@@ -3116,6 +3117,7 @@
@@ -3114,9 +3115,18 @@
pid = fork();
if (pid >= 0) {
if (pid == 0) {
+ int open_max = sysconf(_SC_OPEN_MAX), i;
+ for (i = 0; i < open_max; i++)
+ if (i != STDIN_FILENO &&
+ i != STDOUT_FILENO &&
+ i != STDERR_FILENO &&
+ i != fd)
+ close(i);
+
parg = args;
*parg++ = (char *)setup_script;
*parg++ = ifname;
@@ -32,7 +43,7 @@ Index: ioemu/vl.c
*parg++ = NULL;
execv(setup_script, args);
_exit(1);
@@ -3671,6 +3673,7 @@
@@ -3672,6 +3682,7 @@
if (!strcmp(device, "tap")) {
char ifname[64];
char setup_script[1024];
@@ -40,7 +51,7 @@ Index: ioemu/vl.c
int fd;
if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
fd = strtol(buf, NULL, 0);
@@ -3683,7 +3686,10 @@
@@ -3684,7 +3695,10 @@
if (get_param_value(setup_script, sizeof(setup_script), "script", p) == 0) {
pstrcpy(setup_script, sizeof(setup_script), DEFAULT_NETWORK_SCRIPT);
}
@@ -52,7 +63,7 @@ Index: ioemu/vl.c
}
} else
#endif
@@ -5208,7 +5214,7 @@
@@ -5209,7 +5223,7 @@
"-net tap[,vlan=n],ifname=name\n"
" connect the host TAP network interface to VLAN 'n'\n"
#else
+14 -24
View File
@@ -3,8 +3,8 @@ will come later.
Index: ioemu/Makefile.target
===================================================================
--- ioemu.orig/Makefile.target 2006-12-08 01:41:14.000000000 +0000
+++ ioemu/Makefile.target 2006-12-08 01:41:15.000000000 +0000
--- ioemu.orig/Makefile.target 2007-05-03 15:16:41.000000000 +0100
+++ ioemu/Makefile.target 2007-05-03 15:20:35.000000000 +0100
@@ -360,6 +360,7 @@
VL_OBJS+= usb-uhci.o
VL_OBJS+= piix4acpi.o
@@ -15,8 +15,8 @@ Index: ioemu/Makefile.target
ifeq ($(TARGET_BASE_ARCH), ppc)
Index: ioemu/hw/pc.c
===================================================================
--- ioemu.orig/hw/pc.c 2006-12-08 01:41:13.000000000 +0000
+++ ioemu/hw/pc.c 2006-12-08 01:41:15.000000000 +0000
--- ioemu.orig/hw/pc.c 2007-05-03 15:18:17.000000000 +0100
+++ ioemu/hw/pc.c 2007-05-03 15:20:35.000000000 +0100
@@ -823,6 +823,9 @@
}
#endif /* !CONFIG_DM */
@@ -30,8 +30,8 @@ Index: ioemu/hw/pc.c
Index: ioemu/hw/xen_platform.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ ioemu/hw/xen_platform.c 2006-12-08 01:41:15.000000000 +0000
@@ -0,0 +1,144 @@
+++ ioemu/hw/xen_platform.c 2007-05-03 15:18:17.000000000 +0100
@@ -0,0 +1,133 @@
+/*
+ * XEN platform fake pci device, formerly known as the event channel device
+ *
@@ -63,21 +63,10 @@ Index: ioemu/hw/xen_platform.c
+
+extern FILE *logfile;
+
+static void platform_ioport_write(void *opaque, uint32_t addr, uint32_t val)
+{
+ return;
+}
+
+static uint32_t platform_ioport_read(void *opaque, uint32_t addr)
+{
+ return 0;
+}
+
+static void platform_ioport_map(PCIDevice *pci_dev, int region_num,
+ uint32_t addr, uint32_t size, int type)
+{
+ register_ioport_write(addr, 16, 4, platform_ioport_write, NULL);
+ register_ioport_read(addr, 16, 1, platform_ioport_read, NULL);
+ /* nothing yet */
+}
+
+static uint32_t platform_mmio_read(void *opaque, target_phys_addr_t addr)
@@ -178,15 +167,16 @@ Index: ioemu/hw/xen_platform.c
+}
Index: ioemu/vl.h
===================================================================
--- ioemu.orig/vl.h 2006-12-08 01:41:14.000000000 +0000
+++ ioemu/vl.h 2006-12-08 01:41:15.000000000 +0000
@@ -1212,6 +1212,9 @@
void xenstore_check_new_media_present(int timeout);
void xenstore_write_vncport(int vnc_display);
--- ioemu.orig/vl.h 2007-05-03 15:18:17.000000000 +0100
+++ ioemu/vl.h 2007-05-03 15:20:39.000000000 +0100
@@ -1220,6 +1220,10 @@
extern long time_offset;
void timeoffset_get(void);
+/* xen_platform.c */
+void pci_xen_platform_init(PCIBus *bus);
+
+
void kqemu_record_dump(void);
extern char domain_name[];
+47 -20
View File
@@ -1,38 +1,37 @@
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-12-20 15:21:54.000000000 +0000
+++ ioemu/vl.c 2006-12-20 15:21:54.000000000 +0000
@@ -5838,6 +5838,7 @@
unsigned long nr_pages, tmp_nr_pages, shared_page_nr;
xen_pfn_t *page_array;
--- ioemu.orig/vl.c 2007-05-03 15:09:21.000000000 +0100
+++ ioemu/vl.c 2007-05-03 15:09:48.000000000 +0100
@@ -5923,6 +5923,7 @@
int usb_devices_index;
unsigned long ioreq_pfn;
extern void *shared_page;
+ extern void *buffered_io_page;
unsigned long nr_pages;
char qemu_dm_logfilename[64];
@@ -6499,6 +6500,16 @@
exit(-1);
}
@@ -6422,6 +6423,17 @@
fprintf(logfile, "shared page at pfn:%lx, mfn: %"PRIx64"\n",
shared_page_nr, (uint64_t)(page_array[shared_page_nr]));
+ xc_get_hvm_param(xc_handle, domid, HVM_PARAM_BUFIOREQ_PFN, &ioreq_pfn);
+ fprintf(logfile, "buffered io page at pfn %lx\n", ioreq_pfn);
+ buffered_io_page = xc_map_foreign_range(xc_handle, domid, PAGE_SIZE,
+ PROT_READ|PROT_WRITE,
+ page_array[shared_page_nr - 2]);
+ page_array[ioreq_pfn]);
+ if (buffered_io_page == NULL) {
+ fprintf(logfile, "map buffered IO page returned error %d\n", errno);
+ exit(-1);
+ }
+
+ fprintf(logfile, "buffered io page at pfn:%lx, mfn: %"PRIx64"\n",
+ shared_page_nr - 2, (uint64_t)(page_array[shared_page_nr - 2]));
+
free(page_array);
#elif defined(__ia64__)
Index: ioemu/target-i386-dm/helper2.c
===================================================================
--- ioemu.orig/target-i386-dm/helper2.c 2006-12-20 15:21:47.000000000 +0000
+++ ioemu/target-i386-dm/helper2.c 2006-12-20 15:21:54.000000000 +0000
@@ -76,6 +76,10 @@
--- ioemu.orig/target-i386-dm/helper2.c 2007-05-03 15:09:21.000000000 +0100
+++ ioemu/target-i386-dm/helper2.c 2007-05-03 15:10:03.000000000 +0100
@@ -78,6 +78,10 @@
shared_iopage_t *shared_page = NULL;
@@ -43,7 +42,7 @@ Index: ioemu/target-i386-dm/helper2.c
/* the evtchn fd for polling */
int xce_handle = -1;
@@ -435,39 +439,71 @@
@@ -489,6 +493,72 @@
req->data = tmp1;
}
@@ -65,12 +64,21 @@ Index: ioemu/target-i386-dm/helper2.c
+ case IOREQ_TYPE_ADD:
+ cpu_ioreq_add(env, req);
+ break;
+ case IOREQ_TYPE_SUB:
+ cpu_ioreq_sub(env, req);
+ break;
+ case IOREQ_TYPE_OR:
+ cpu_ioreq_or(env, req);
+ break;
+ case IOREQ_TYPE_XOR:
+ cpu_ioreq_xor(env, req);
+ break;
+ case IOREQ_TYPE_XCHG:
+ cpu_ioreq_xchg(env, req);
+ break;
+ case IOREQ_TYPE_TIMEOFFSET:
+ cpu_ioreq_timeoffset(env, req);
+ break;
+ default:
+ hw_error("Invalid ioreq type 0x%x\n", req->type);
+ }
@@ -106,6 +114,8 @@ Index: ioemu/target-i386-dm/helper2.c
+
void cpu_handle_ioreq(void *opaque)
{
extern int vm_running;
@@ -496,43 +566,9 @@
CPUState *env = opaque;
ioreq_t *req = cpu_get_ioreq();
@@ -129,12 +139,21 @@ Index: ioemu/target-i386-dm/helper2.c
- case IOREQ_TYPE_ADD:
- cpu_ioreq_add(env, req);
- break;
- case IOREQ_TYPE_SUB:
- cpu_ioreq_sub(env, req);
- break;
- case IOREQ_TYPE_OR:
- cpu_ioreq_or(env, req);
- break;
- case IOREQ_TYPE_XOR:
- cpu_ioreq_xor(env, req);
- break;
- case IOREQ_TYPE_XCHG:
- cpu_ioreq_xchg(env, req);
- break;
- case IOREQ_TYPE_TIMEOFFSET:
- cpu_ioreq_timeoffset(env, req);
- break;
- default:
- hw_error("Invalid ioreq type 0x%x\n", req->type);
- }
@@ -142,9 +161,9 @@ Index: ioemu/target-i386-dm/helper2.c
if (req->state != STATE_IOREQ_INPROCESS) {
fprintf(logfile, "Badness in I/O request ... not in service?!: "
@@ -492,6 +528,10 @@
CPUState *env = cpu_single_env;
@@ -578,6 +614,10 @@
int evtchn_fd = xc_evtchn_fd(xce_handle);
char qemu_file[20];
+ buffered_io_timer = qemu_new_timer(rt_clock, handle_buffered_io,
+ cpu_single_env);
@@ -152,4 +171,12 @@ Index: ioemu/target-i386-dm/helper2.c
+
qemu_set_fd_handler(evtchn_fd, cpu_handle_ioreq, NULL, env);
while (1) {
while (!(vm_running && suspend_requested))
@@ -587,6 +627,7 @@
fprintf(logfile, "device model received suspend signal!\n");
/* Pull all outstanding ioreqs through the system */
+ handle_buffered_io(env);
main_loop_wait(1); /* For the select() on events */
/* Stop the IDE thread */
+197
View File
@@ -0,0 +1,197 @@
Index: ioemu/xenstore.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ ioemu/xenstore.c 2007-05-03 15:17:52.000000000 +0100
@@ -0,0 +1,139 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General
+ * Public License. See the file "COPYING" in the main directory of
+ * this archive for more details.
+ *
+ * Copyright (C) 2006 Christian Limpach
+ * Copyright (C) 2006 XenSource Ltd.
+ *
+ */
+
+#include "vl.h"
+
+static struct xs_handle *xsh = NULL;
+
+static int pasprintf(char **buf, const char *fmt, ...)
+{
+ va_list ap;
+ int ret = 0;
+
+ if (*buf)
+ free(*buf);
+ va_start(ap, fmt);
+ if (vasprintf(buf, fmt, ap) == -1) {
+ buf = NULL;
+ ret = -1;
+ }
+ va_end(ap);
+ return ret;
+}
+
+void xenstore_parse_domain_config(int domid)
+{
+ char *path;
+
+ xsh = xs_daemon_open();
+ if (xsh == NULL) {
+ fprintf(logfile, "Could not contact xenstore for domain config\n");
+ return;
+ }
+
+ path = xs_get_domain_path(xsh, domid);
+ if (path == NULL) {
+ fprintf(logfile, "xs_get_domain_path() error\n");
+ goto out;
+ }
+
+ out:
+ free(path);
+ return;
+}
+
+int xenstore_fd(void)
+{
+ if (xsh)
+ return xs_fileno(xsh);
+ return -1;
+}
+
+void xenstore_process_event(void *opaque)
+{
+ char **vec;
+ unsigned int num;
+
+ vec = xs_read_watch(xsh, &num);
+ if (!vec)
+ return;
+
+ out:
+ free(vec);
+}
+
+char *xenstore_vm_read(int domid, char *key, int *len)
+{
+ char *buf = NULL, *path = NULL, *value = NULL;
+
+ if (xsh == NULL)
+ goto out;
+
+ path = xs_get_domain_path(xsh, domid);
+ if (path == NULL) {
+ fprintf(logfile, "xs_get_domain_path(%d): error\n", domid);
+ goto out;
+ }
+
+ pasprintf(&buf, "%s/vm", path);
+ free(path);
+ path = xs_read(xsh, XBT_NULL, buf, NULL);
+ if (path == NULL) {
+ fprintf(logfile, "xs_read(%s): read error\n", buf);
+ goto out;
+ }
+
+ pasprintf(&buf, "%s/%s", path, key);
+ value = xs_read(xsh, XBT_NULL, buf, len);
+ if (value == NULL) {
+ fprintf(logfile, "xs_read(%s): read error\n", buf);
+ goto out;
+ }
+
+ out:
+ free(path);
+ free(buf);
+ return value;
+}
+
+int xenstore_vm_write(int domid, char *key, char *value)
+{
+ char *buf = NULL, *path = NULL;
+ int rc = -1;
+
+ if (xsh == NULL)
+ goto out;
+
+ path = xs_get_domain_path(xsh, domid);
+ if (path == NULL) {
+ fprintf(logfile, "xs_get_domain_path: error\n");
+ goto out;
+ }
+
+ pasprintf(&buf, "%s/vm", path);
+ free(path);
+ path = xs_read(xsh, XBT_NULL, buf, NULL);
+ if (path == NULL) {
+ fprintf(logfile, "xs_read(%s): read error\n", buf);
+ goto out;
+ }
+
+ pasprintf(&buf, "%s/%s", path, key);
+ rc = xs_write(xsh, XBT_NULL, buf, value, strlen(value));
+ if (rc) {
+ fprintf(logfile, "xs_write(%s, %s): write error\n", buf, key);
+ goto out;
+ }
+
+ out:
+ free(path);
+ free(buf);
+ return rc;
+}
Index: ioemu/vl.h
===================================================================
--- ioemu.orig/vl.h 2007-05-03 15:15:40.000000000 +0100
+++ ioemu/vl.h 2007-05-03 15:18:00.000000000 +0100
@@ -1204,6 +1204,12 @@
void readline_start(const char *prompt, int is_password,
ReadLineFunc *readline_func, void *opaque);
+/* xenstore.c */
+void xenstore_parse_domain_config(int domid);
+
+int xenstore_vm_write(int domid, char *key, char *val);
+char *xenstore_vm_read(int domid, char *key, int *len);
+
void kqemu_record_dump(void);
extern char domain_name[];
Index: ioemu/Makefile.target
===================================================================
--- ioemu.orig/Makefile.target 2007-05-03 15:15:39.000000000 +0100
+++ ioemu/Makefile.target 2007-05-03 15:16:41.000000000 +0100
@@ -359,6 +359,7 @@
VL_OBJS+= cirrus_vga.o mixeng.o parallel.o acpi.o piix_pci.o
VL_OBJS+= usb-uhci.o
VL_OBJS+= piix4acpi.o
+VL_OBJS+= xenstore.o
DEFINES += -DHAS_AUDIO
endif
ifeq ($(TARGET_BASE_ARCH), ppc)
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2007-05-03 15:15:40.000000000 +0100
+++ ioemu/vl.c 2007-05-03 15:17:52.000000000 +0100
@@ -6371,6 +6371,10 @@
}
}
+#ifdef CONFIG_DM
+ xenstore_parse_domain_config(domid);
+#endif /* CONFIG_DM */
+
#ifdef USE_KQEMU
if (smp_cpus > 1)
kqemu_allowed = 0;
@@ -6624,6 +6628,8 @@
}
}
+ qemu_set_fd_handler(xenstore_fd(), xenstore_process_event, NULL, NULL);
+
machine->init(ram_size, vga_ram_size, boot_device,
ds, fd_filename, snapshot,
kernel_filename, kernel_cmdline, initrd_filename);
+186 -200
View File
@@ -1,63 +1,37 @@
Index: ioemu/Makefile.target
===================================================================
--- ioemu.orig/Makefile.target 2006-12-20 15:21:51.000000000 +0000
+++ ioemu/Makefile.target 2006-12-20 15:21:53.000000000 +0000
@@ -359,6 +359,7 @@
VL_OBJS+= cirrus_vga.o mixeng.o parallel.o acpi.o piix_pci.o
VL_OBJS+= usb-uhci.o
VL_OBJS+= piix4acpi.o
+VL_OBJS+= xenstore.o
DEFINES += -DHAS_AUDIO
endif
ifeq ($(TARGET_BASE_ARCH), ppc)
Index: ioemu/xenstore.c
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ ioemu/xenstore.c 2006-12-20 15:21:53.000000000 +0000
@@ -0,0 +1,187 @@
+/*
+ * This file is subject to the terms and conditions of the GNU General
+ * Public License. See the file "COPYING" in the main directory of
+ * this archive for more details.
+ *
+ * Copyright (C) 2006 Christian Limpach
+ * Copyright (C) 2006 XenSource Ltd.
+ *
+ */
+
+#include "vl.h"
--- ioemu.orig/xenstore.c 2007-05-03 15:17:52.000000000 +0100
+++ ioemu/xenstore.c 2007-05-03 15:18:05.000000000 +0100
@@ -9,8 +9,15 @@
*/
#include "vl.h"
+#include "block_int.h"
+
+static struct xs_handle *xsh = NULL;
+static char *hd_filename[MAX_DISKS];
+#include <unistd.h>
static struct xs_handle *xsh = NULL;
+static char *media_filename[MAX_DISKS];
+static QEMUTimer *insert_timer = NULL;
+
+static int pasprintf(char **buf, const char *fmt, ...)
+{
+ va_list ap;
+ int ret = 0;
+
+ if (*buf)
+ free(*buf);
+ va_start(ap, fmt);
+ if (vasprintf(buf, fmt, ap) == -1) {
+ buf = NULL;
+ ret = -1;
+ }
+ va_end(ap);
+ return ret;
+}
+
+#define UWAIT_MAX (30*1000000) /* thirty seconds */
+#define UWAIT (100000) /* 1/10th second */
static int pasprintf(char **buf, const char *fmt, ...)
{
@@ -28,9 +35,54 @@
return ret;
}
+static void insert_media(void *opaque)
+{
+ int i;
+
+ for (i = 0; i < MAX_DISKS; i++) {
+ if (hd_filename[i]) {
+ do_change(bs_table[i]->device_name, hd_filename[i]);
+ free(hd_filename[i]);
+ hd_filename[i] = NULL;
+ }
+ if (media_filename[i] && bs_table[i]) {
+ do_change(bs_table[i]->device_name, media_filename[i]);
+ free(media_filename[i]);
+ media_filename[i] = NULL;
+ }
+ }
+}
+
@@ -65,148 +39,176 @@ Index: ioemu/xenstore.c
+{
+
+ if (insert_timer == NULL)
+ insert_timer = qemu_new_timer(rt_clock, insert_media, NULL);
+ insert_timer = qemu_new_timer(rt_clock, insert_media, NULL);
+ qemu_mod_timer(insert_timer, qemu_get_clock(rt_clock) + timeout);
+}
+
+void xenstore_parse_domain_config(int domid)
+{
+static void waitForDevice(char *fn)
+{
+ struct stat sbuf;
+ int status;
+ int uwait = UWAIT_MAX;
+
+ do {
+ status = stat(fn, &sbuf);
+ if (!status) break;
+ usleep(UWAIT);
+ uwait -= UWAIT;
+ } while (uwait > 0);
+
+ return;
+}
+
void xenstore_parse_domain_config(int domid)
{
- char *path;
+ char **e = NULL;
+ char *buf = NULL, *path;
+ char *bpath = NULL, *dev = NULL, *params = NULL, *type = NULL;
+ char *fpath = NULL, *bpath = NULL,
+ *dev = NULL, *params = NULL, *type = NULL;
+ int i;
+ unsigned int len, num, hd_index;
+
+ for(i = 0; i < MAX_DISKS; i++)
+ hd_filename[i] = NULL;
+
+ xsh = xs_daemon_open();
+ if (xsh == NULL) {
+ fprintf(logfile, "Could not contact xenstore for domain config\n");
+ return;
+ }
+
+ path = xs_get_domain_path(xsh, domid);
+ if (path == NULL) {
+ fprintf(logfile, "xs_get_domain_path() error\n");
+ goto out;
+ }
+
+ media_filename[i] = NULL;
xsh = xs_daemon_open();
if (xsh == NULL) {
@@ -44,8 +96,91 @@
goto out;
}
+ if (pasprintf(&buf, "%s/device/vbd", path) == -1)
+ goto out;
+ goto out;
+
+ e = xs_directory(xsh, XBT_NULL, buf, &num);
+ if (e == NULL)
+ goto out;
+ goto out;
+
+ for (i = 0; i < num; i++) {
+ /* read the backend path */
+ if (pasprintf(&buf, "%s/device/vbd/%s/backend", path, e[i]) == -1)
+ continue;
+ free(bpath);
+ /* read the backend path */
+ if (pasprintf(&buf, "%s/device/vbd/%s/backend", path, e[i]) == -1)
+ continue;
+ free(bpath);
+ bpath = xs_read(xsh, XBT_NULL, buf, &len);
+ if (bpath == NULL)
+ continue;
+ /* read the name of the device */
+ if (pasprintf(&buf, "%s/dev", bpath) == -1)
+ continue;
+ free(dev);
+ dev = xs_read(xsh, XBT_NULL, buf, &len);
+ if (dev == NULL)
+ continue;
+ if (strncmp(dev, "hd", 2) || strlen(dev) != 3)
+ continue;
+ hd_index = dev[2] - 'a';
+ if (hd_index >= MAX_DISKS)
+ continue;
+ /* read the type of the device */
+ if (pasprintf(&buf, "%s/device/vbd/%s/device-type", path, e[i]) == -1)
+ continue;
+ free(type);
+ type = xs_read(xsh, XBT_NULL, buf, &len);
+ /* read params to get the patch of the image -- read it last
+ * so that we have its path in buf when setting up the
+ * watch */
+ if (pasprintf(&buf, "%s/params", bpath) == -1)
+ continue;
+ free(params);
+ params = xs_read(xsh, XBT_NULL, buf, &len);
+ if (params == NULL)
+ continue;
+ if (params[0]) {
+ hd_filename[hd_index] = params; /* strdup() */
+ params = NULL; /* don't free params on re-use */
+ }
+ bs_table[hd_index] = bdrv_new(dev);
+ /* check if it is a cdrom */
+ if (type && !strcmp(type, "cdrom")) {
+ bdrv_set_type_hint(bs_table[hd_index], BDRV_TYPE_CDROM);
+ xs_watch(xsh, buf, dev);
+ }
+ if (hd_filename[hd_index]) {
+ if (bdrv_open(bs_table[hd_index], hd_filename[hd_index],
+ 0 /* snapshot */) < 0)
+ if (bpath == NULL)
+ continue;
+ /* read the name of the device */
+ if (pasprintf(&buf, "%s/dev", bpath) == -1)
+ continue;
+ free(dev);
+ dev = xs_read(xsh, XBT_NULL, buf, &len);
+ if (dev == NULL)
+ continue;
+ if (strncmp(dev, "hd", 2) || strlen(dev) != 3)
+ continue;
+ hd_index = dev[2] - 'a';
+ if (hd_index >= MAX_DISKS)
+ continue;
+ /* read the type of the device */
+ if (pasprintf(&buf, "%s/device/vbd/%s/device-type", path, e[i]) == -1)
+ continue;
+ free(type);
+ type = xs_read(xsh, XBT_NULL, buf, &len);
+ if (pasprintf(&buf, "%s/params", bpath) == -1)
+ continue;
+ free(params);
+ params = xs_read(xsh, XBT_NULL, buf, &len);
+ if (params == NULL)
+ continue;
+ /*
+ * check if device has a phantom vbd; the phantom is hooked
+ * to the frontend device (for ease of cleanup), so lookup
+ * the frontend device, and see if there is a phantom_vbd
+ * if there is, we will use resolution as the filename
+ */
+ if (pasprintf(&buf, "%s/device/vbd/%s/phantom_vbd", path, e[i]) == -1)
+ continue;
+ free(fpath);
+ fpath = xs_read(xsh, XBT_NULL, buf, &len);
+ if (fpath) {
+ if (pasprintf(&buf, "%s/dev", fpath) == -1)
+ continue;
+ free(params);
+ params = xs_read(xsh, XBT_NULL, buf , &len);
+ if (params) {
+ /*
+ * wait for device, on timeout silently fail because we will
+ * fail to open below
+ */
+ waitForDevice(params);
+ }
+ }
+
+ bs_table[hd_index] = bdrv_new(dev);
+ /* check if it is a cdrom */
+ if (type && !strcmp(type, "cdrom")) {
+ bdrv_set_type_hint(bs_table[hd_index], BDRV_TYPE_CDROM);
+ if (pasprintf(&buf, "%s/params", bpath) != -1)
+ xs_watch(xsh, buf, dev);
+ }
+ /* open device now if media present */
+ if (params[0]) {
+ if (bdrv_open(bs_table[hd_index], params, 0 /* snapshot */) < 0)
+ fprintf(stderr, "qemu: could not open hard disk image '%s'\n",
+ hd_filename[hd_index]);
+ }
+ params);
+ }
+ }
+
+ out:
out:
+ free(type);
+ free(params);
+ free(dev);
+ free(bpath);
+ free(buf);
+ free(path);
free(path);
+ free(e);
+ return;
+}
+
+int xenstore_fd(void)
+{
+ if (xsh)
+ return xs_fileno(xsh);
+ return -1;
+}
+
+void xenstore_process_event(void *opaque)
+{
return;
}
@@ -58,14 +193,35 @@
void xenstore_process_event(void *opaque)
{
- char **vec;
- unsigned int num;
+ char **vec, *image = NULL;
+ unsigned int len, num, hd_index;
+
+ vec = xs_read_watch(xsh, &num);
+ if (!vec)
+ return;
+
vec = xs_read_watch(xsh, &num);
if (!vec)
return;
+ if (strncmp(vec[XS_WATCH_TOKEN], "hd", 2) ||
+ strlen(vec[XS_WATCH_TOKEN]) != 3)
+ goto out;
+ strlen(vec[XS_WATCH_TOKEN]) != 3)
+ goto out;
+ hd_index = vec[XS_WATCH_TOKEN][2] - 'a';
+ image = xs_read(xsh, XBT_NULL, vec[XS_WATCH_PATH], &len);
+ if (image == NULL || !strcmp(image, bs_table[hd_index]->filename))
+ goto out; /* gone or identical */
+ goto out; /* gone or identical */
+
+ do_eject(0, vec[XS_WATCH_TOKEN]);
+ bs_table[hd_index]->filename[0] = 0;
+ if (hd_filename[hd_index]) {
+ free(hd_filename[hd_index]);
+ hd_filename[hd_index] = NULL;
+ if (media_filename[hd_index]) {
+ free(media_filename[hd_index]);
+ media_filename[hd_index] = NULL;
+ }
+
+ if (image[0]) {
+ hd_filename[hd_index] = strdup(image);
+ xenstore_check_new_media_present(5000);
+ media_filename[hd_index] = strdup(image);
+ xenstore_check_new_media_present(5000);
+ }
+
+ out:
out:
+ free(image);
+ free(vec);
+}
free(vec);
}
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-12-20 15:21:52.000000000 +0000
+++ ioemu/vl.c 2006-12-20 15:21:53.000000000 +0000
@@ -5256,9 +5256,11 @@
--- ioemu.orig/vl.c 2007-05-03 15:17:52.000000000 +0100
+++ ioemu/vl.c 2007-05-03 15:18:05.000000000 +0100
@@ -5331,9 +5331,11 @@
"Standard options:\n"
"-M machine select emulated machine (-M ? for list)\n"
"-fda/-fdb file use 'file' as floppy disk 0/1 image\n"
@@ -218,7 +220,7 @@ Index: ioemu/vl.c
"-boot [a|c|d] boot on floppy (a), hard disk (c) or CD-ROM (d)\n"
"-snapshot write to temporary files instead of disk image files\n"
#ifdef TARGET_I386
@@ -5386,11 +5388,13 @@
@@ -5460,11 +5462,13 @@
QEMU_OPTION_M,
QEMU_OPTION_fda,
QEMU_OPTION_fdb,
@@ -232,7 +234,7 @@ Index: ioemu/vl.c
QEMU_OPTION_boot,
QEMU_OPTION_snapshot,
#ifdef TARGET_I386
@@ -5463,11 +5467,13 @@
@@ -5536,11 +5540,13 @@
{ "M", HAS_ARG, QEMU_OPTION_M },
{ "fda", HAS_ARG, QEMU_OPTION_fda },
{ "fdb", HAS_ARG, QEMU_OPTION_fdb },
@@ -246,7 +248,7 @@ Index: ioemu/vl.c
{ "boot", HAS_ARG, QEMU_OPTION_boot },
{ "snapshot", 0, QEMU_OPTION_snapshot },
#ifdef TARGET_I386
@@ -5801,10 +5807,16 @@
@@ -5882,10 +5888,16 @@
#ifdef CONFIG_GDBSTUB
int use_gdbstub, gdbstub_port;
#endif
@@ -265,7 +267,7 @@ Index: ioemu/vl.c
const char *kernel_filename, *kernel_cmdline;
DisplayState *ds = &display_state;
int cyls, heads, secs, translation;
@@ -5865,8 +5877,10 @@
@@ -5946,8 +5958,10 @@
initrd_filename = NULL;
for(i = 0; i < MAX_FD; i++)
fd_filename[i] = NULL;
@@ -276,7 +278,7 @@ Index: ioemu/vl.c
ram_size = DEFAULT_RAM_SIZE * 1024 * 1024;
vga_ram_size = VGA_RAM_SIZE;
bios_size = BIOS_SIZE;
@@ -5880,11 +5894,13 @@
@@ -5961,11 +5975,13 @@
vncunused = 0;
kernel_filename = NULL;
kernel_cmdline = "";
@@ -289,8 +291,8 @@ Index: ioemu/vl.c
+#endif /* !CONFIG_DM */
cyls = heads = secs = 0;
translation = BIOS_ATA_TRANSLATION_AUTO;
pstrcpy(monitor_device, sizeof(monitor_device), "vc");
@@ -5919,7 +5935,11 @@
pstrcpy(monitor_device, sizeof(monitor_device), "null");
@@ -6004,7 +6020,11 @@
break;
r = argv[optind];
if (r[0] != '-') {
@@ -302,7 +304,7 @@ Index: ioemu/vl.c
} else {
const QEMUOption *popt;
@@ -5963,6 +5983,7 @@
@@ -6048,6 +6068,7 @@
case QEMU_OPTION_initrd:
initrd_filename = optarg;
break;
@@ -310,7 +312,7 @@ Index: ioemu/vl.c
case QEMU_OPTION_hda:
case QEMU_OPTION_hdb:
case QEMU_OPTION_hdc:
@@ -5975,6 +5996,7 @@
@@ -6060,6 +6081,7 @@
cdrom_index = -1;
}
break;
@@ -318,7 +320,7 @@ Index: ioemu/vl.c
case QEMU_OPTION_snapshot:
snapshot = 1;
break;
@@ -6027,11 +6049,13 @@
@@ -6112,11 +6134,13 @@
case QEMU_OPTION_append:
kernel_cmdline = optarg;
break;
@@ -332,18 +334,15 @@ Index: ioemu/vl.c
case QEMU_OPTION_boot:
boot_device = optarg[0];
if (boot_device != 'a' &&
@@ -6289,12 +6313,18 @@
}
@@ -6372,6 +6396,7 @@
}
+#ifdef CONFIG_DM
#ifdef CONFIG_DM
+ bdrv_init();
+ xenstore_parse_domain_config(domid);
+#endif /* CONFIG_DM */
+
#ifdef USE_KQEMU
if (smp_cpus > 1)
kqemu_allowed = 0;
xenstore_parse_domain_config(domid);
#endif /* CONFIG_DM */
@@ -6381,6 +6406,7 @@
#endif
linux_boot = (kernel_filename != NULL);
@@ -351,7 +350,7 @@ Index: ioemu/vl.c
if (!linux_boot &&
hd_filename[0] == '\0' &&
(cdrom_index >= 0 && hd_filename[cdrom_index] == '\0') &&
@@ -6308,6 +6338,7 @@
@@ -6394,6 +6420,7 @@
else
boot_device = 'd';
}
@@ -359,7 +358,7 @@ Index: ioemu/vl.c
setvbuf(stdout, NULL, _IOLBF, 0);
@@ -6433,6 +6464,7 @@
@@ -6514,6 +6541,7 @@
#endif /* !CONFIG_DM */
@@ -367,7 +366,7 @@ Index: ioemu/vl.c
/* we always create the cdrom drive, even if no disk is there */
bdrv_init();
if (cdrom_index >= 0) {
@@ -6459,6 +6491,7 @@
@@ -6540,6 +6568,7 @@
}
}
}
@@ -375,19 +374,10 @@ Index: ioemu/vl.c
/* we always create at least one floppy disk */
fd_table[0] = bdrv_new("fda");
@@ -6537,6 +6570,8 @@
}
}
+ qemu_set_fd_handler(xenstore_fd(), xenstore_process_event, NULL, NULL);
+
machine->init(ram_size, vga_ram_size, boot_device,
ds, fd_filename, snapshot,
kernel_filename, kernel_cmdline, initrd_filename,
Index: ioemu/monitor.c
===================================================================
--- ioemu.orig/monitor.c 2006-12-20 15:21:47.000000000 +0000
+++ ioemu/monitor.c 2006-12-20 15:21:53.000000000 +0000
--- ioemu.orig/monitor.c 2007-05-03 15:17:52.000000000 +0100
+++ ioemu/monitor.c 2007-05-03 15:18:05.000000000 +0100
@@ -24,6 +24,7 @@
#include "vl.h"
#include "disas.h"
@@ -416,8 +406,8 @@ Index: ioemu/monitor.c
int i;
Index: ioemu/block.c
===================================================================
--- ioemu.orig/block.c 2006-12-20 15:21:31.000000000 +0000
+++ ioemu/block.c 2006-12-20 15:21:53.000000000 +0000
--- ioemu.orig/block.c 2007-05-03 15:17:52.000000000 +0100
+++ ioemu/block.c 2007-05-03 15:18:05.000000000 +0100
@@ -758,6 +758,7 @@
static void raw_close(BlockDriverState *bs)
{
@@ -428,9 +418,9 @@ Index: ioemu/block.c
Index: ioemu/vl.h
===================================================================
--- ioemu.orig/vl.h 2006-12-20 15:21:52.000000000 +0000
+++ ioemu/vl.h 2006-12-20 15:21:53.000000000 +0000
@@ -1191,6 +1191,8 @@
--- ioemu.orig/vl.h 2007-05-03 15:18:00.000000000 +0100
+++ ioemu/vl.h 2007-05-03 15:18:05.000000000 +0100
@@ -1192,6 +1192,8 @@
void term_print_help(void);
void monitor_readline(const char *prompt, int is_password,
char *buf, int buf_size);
@@ -439,25 +429,21 @@ Index: ioemu/vl.h
/* readline.c */
typedef void ReadLineFunc(void *opaque, const char *str);
@@ -1203,6 +1205,13 @@
void readline_start(const char *prompt, int is_password,
ReadLineFunc *readline_func, void *opaque);
@@ -1206,6 +1208,9 @@
+/* xenstore.c */
+void xenstore_parse_domain_config(int domid);
/* xenstore.c */
void xenstore_parse_domain_config(int domid);
+int xenstore_fd(void);
+void xenstore_process_event(void *opaque);
+void xenstore_check_new_media_present(int timeout);
+
+
void kqemu_record_dump(void);
extern char domain_name[];
int xenstore_vm_write(int domid, char *key, char *val);
char *xenstore_vm_read(int domid, char *key, int *len);
Index: ioemu/hw/ide.c
===================================================================
--- ioemu.orig/hw/ide.c 2006-12-20 15:21:49.000000000 +0000
+++ ioemu/hw/ide.c 2006-12-20 15:21:53.000000000 +0000
@@ -1158,6 +1158,7 @@
--- ioemu.orig/hw/ide.c 2007-05-03 15:17:52.000000000 +0100
+++ ioemu/hw/ide.c 2007-05-03 15:18:05.000000000 +0100
@@ -1199,6 +1199,7 @@
} else {
ide_atapi_cmd_error(s, SENSE_NOT_READY,
ASC_MEDIUM_NOT_PRESENT);
@@ -15,13 +15,12 @@ Signed-off-by: Stefan Berger <stefanb@us.ibm.com>
Index: ioemu/xenstore.c
===================================================================
--- ioemu.orig/xenstore.c 2006-12-08 18:20:53.000000000 +0000
+++ ioemu/xenstore.c 2006-12-08 18:20:53.000000000 +0000
@@ -264,3 +264,140 @@
--- ioemu.orig/xenstore.c 2007-05-03 15:21:22.000000000 +0100
+++ ioemu/xenstore.c 2007-05-03 15:22:05.000000000 +0100
@@ -304,6 +304,143 @@
return rc;
}
+
+
+/*
+ * get all device instances of a certain type
@@ -38,7 +37,7 @@ Index: ioemu/xenstore.c
+ goto out;
+
+ if (pasprintf(&buf, "%s/device/%s", path,devtype) == -1)
+ goto out;
+ goto out;
+
+ e = xs_directory(handle, XBT_NULL, buf, num);
+
@@ -91,13 +90,13 @@ Index: ioemu/xenstore.c
+
+ buf = get_device_variable_path(devtype, inst, var);
+ if (NULL == buf)
+ goto out;
+ goto out;
+
+ value = xs_read(handle, XBT_NULL, buf, &len);
+
+ free(buf);
+
+out:
+ out:
+ return value;
+}
+
@@ -158,11 +157,15 @@ Index: ioemu/xenstore.c
+
+ return rc;
+}
+
char *xenstore_vm_read(int domid, char *key, int *len)
{
char *buf = NULL, *path = NULL, *value = NULL;
Index: ioemu/vl.h
===================================================================
--- ioemu.orig/vl.h 2006-12-08 18:20:53.000000000 +0000
+++ ioemu/vl.h 2006-12-08 18:20:53.000000000 +0000
@@ -1216,6 +1216,25 @@
--- ioemu.orig/vl.h 2007-05-03 15:21:09.000000000 +0100
+++ ioemu/vl.h 2007-05-03 15:21:47.000000000 +0100
@@ -1217,6 +1217,24 @@
void xenstore_write_vncport(int vnc_display);
int xenstore_read_vncpasswd(int domid);
@@ -184,7 +187,6 @@ Index: ioemu/vl.h
+ const char *inst,
+ const char *token);
+
+
/* xen_platform.c */
void pci_xen_platform_init(PCIBus *bus);
int xenstore_vm_write(int domid, char *key, char *val);
char *xenstore_vm_read(int domid, char *key, int *len);
+19 -16
View File
@@ -1,19 +1,18 @@
Index: ioemu/xenstore.c
===================================================================
--- ioemu.orig/xenstore.c 2006-12-20 15:21:53.000000000 +0000
+++ ioemu/xenstore.c 2006-12-20 15:21:54.000000000 +0000
@@ -185,3 +185,31 @@
free(image);
--- ioemu.orig/xenstore.c 2007-05-03 15:18:05.000000000 +0100
+++ ioemu/xenstore.c 2007-05-03 15:18:17.000000000 +0100
@@ -225,6 +225,34 @@
free(vec);
}
+
+void xenstore_write_vncport(int display)
+{
+ char *buf = NULL, *path;
+ char *portstr = NULL;
+
+ if (xsh == NULL)
+ return;
+ return;
+
+ path = xs_get_domain_path(xsh, domid);
+ if (path == NULL) {
@@ -22,10 +21,10 @@ Index: ioemu/xenstore.c
+ }
+
+ if (pasprintf(&buf, "%s/console/vnc-port", path) == -1)
+ goto out;
+ goto out;
+
+ if (pasprintf(&portstr, "%d", 5900 + display) == -1)
+ goto out;
+ goto out;
+
+ if (xs_write(xsh, XBT_NULL, buf, portstr, strlen(portstr)) == 0)
+ fprintf(logfile, "xs_write() vncport failed\n");
@@ -34,11 +33,15 @@ Index: ioemu/xenstore.c
+ free(portstr);
+ free(buf);
+}
+
char *xenstore_vm_read(int domid, char *key, int *len)
{
char *buf = NULL, *path = NULL, *value = NULL;
Index: ioemu/vl.c
===================================================================
--- ioemu.orig/vl.c 2006-12-20 15:21:53.000000000 +0000
+++ ioemu/vl.c 2006-12-20 15:21:54.000000000 +0000
@@ -6527,6 +6527,7 @@
--- ioemu.orig/vl.c 2007-05-03 15:18:05.000000000 +0100
+++ ioemu/vl.c 2007-05-03 15:18:17.000000000 +0100
@@ -6604,6 +6604,7 @@
vnc_display = vnc_display_init(ds, vnc_display, vncunused, &vnclisten_addr);
if (vncviewer)
vnc_start_viewer(vnc_display);
@@ -48,13 +51,13 @@ Index: ioemu/vl.c
sdl_display_init(ds, full_screen);
Index: ioemu/vl.h
===================================================================
--- ioemu.orig/vl.h 2006-12-20 15:21:53.000000000 +0000
+++ ioemu/vl.h 2006-12-20 15:21:54.000000000 +0000
@@ -1210,6 +1210,7 @@
--- ioemu.orig/vl.h 2007-05-03 15:18:05.000000000 +0100
+++ ioemu/vl.h 2007-05-03 15:18:17.000000000 +0100
@@ -1211,6 +1211,7 @@
int xenstore_fd(void);
void xenstore_process_event(void *opaque);
void xenstore_check_new_media_present(int timeout);
+void xenstore_write_vncport(int vnc_display);
void kqemu_record_dump(void);
int xenstore_vm_write(int domid, char *key, char *val);
char *xenstore_vm_read(int domid, char *key, int *len);
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.