* [Qemu-devel] [PATCH 0/8] misc acpi updates and test devices
@ 2012-12-19 8:46 Gerd Hoffmann
2012-12-19 8:46 ` [Qemu-devel] [PATCH 1/8] configure: also symlink *.aml files Gerd Hoffmann
` (7 more replies)
0 siblings, 8 replies; 9+ messages in thread
From: Gerd Hoffmann @ 2012-12-19 8:46 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
Hi,
Next round of the minor acpi update patch series. The acpi bits are
actually unchanged.
The debug-exit device got updates. It handles byte, word + dword
access. Also the io region size is configurable now.
While being at it I also picked up the pc-testdev, polished it a bit
(portio list is gone, some QOM cleanups), and sticked it into the
series.
Git tree for pulling is available in case no one objects, but especially
patches 5+6 should get some review first (all others have been on the
list before and are unmodified reposts).
cheers,
Gerd
The following changes since commit 914606d26e654d4c01bd5186f4d05e3fd445e219:
Merge remote-tracking branch 'stefanha/trivial-patches' into staging (2012-12-18 15:41:43 -0600)
are available in the git repository at:
git://git.kraxel.org/qemu acpi.1
Gerd Hoffmann (7):
configure: also symlink *.aml files
acpi: autoload dsdt
apci: assign memory regions to piix4 acpi device
apci: assign memory regions to ich9 lpc device
switch debugcon to memory api
add isa-debug-exit device.
pc: remove bochs bios debug ports
Lucas Meneghel Rodrigues (1):
hw: Add test device for unittests execution
configure | 1 +
hw/acpi_ich9.c | 6 +-
hw/acpi_ich9.h | 4 +-
hw/acpi_piix4.c | 20 ++++--
hw/debugcon.c | 31 +++++++--
hw/debugexit.c | 75 ++++++++++++++++++++
hw/i386/Makefile.objs | 3 +-
hw/lpc_ich9.c | 2 +-
hw/pc-testdev.c | 183 +++++++++++++++++++++++++++++++++++++++++++++++++
hw/pc.c | 64 ++++++-----------
hw/pc.h | 1 +
hw/pc_piix.c | 1 +
hw/pc_q35.c | 1 +
13 files changed, 332 insertions(+), 60 deletions(-)
create mode 100644 hw/debugexit.c
create mode 100644 hw/pc-testdev.c
^ permalink raw reply [flat|nested] 9+ messages in thread
* [Qemu-devel] [PATCH 1/8] configure: also symlink *.aml files
2012-12-19 8:46 [Qemu-devel] [PATCH 0/8] misc acpi updates and test devices Gerd Hoffmann
@ 2012-12-19 8:46 ` Gerd Hoffmann
2012-12-19 8:46 ` [Qemu-devel] [PATCH 2/8] acpi: autoload dsdt Gerd Hoffmann
` (6 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Gerd Hoffmann @ 2012-12-19 8:46 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
configure | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/configure b/configure
index 728caca..ec6f961 100755
--- a/configure
+++ b/configure
@@ -4197,6 +4197,7 @@ FILES="$FILES pc-bios/spapr-rtas/Makefile"
FILES="$FILES roms/seabios/Makefile roms/vgabios/Makefile"
for bios_file in \
$source_path/pc-bios/*.bin \
+ $source_path/pc-bios/*.aml \
$source_path/pc-bios/*.rom \
$source_path/pc-bios/*.dtb \
$source_path/pc-bios/openbios-* \
--
1.7.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [Qemu-devel] [PATCH 2/8] acpi: autoload dsdt
2012-12-19 8:46 [Qemu-devel] [PATCH 0/8] misc acpi updates and test devices Gerd Hoffmann
2012-12-19 8:46 ` [Qemu-devel] [PATCH 1/8] configure: also symlink *.aml files Gerd Hoffmann
@ 2012-12-19 8:46 ` Gerd Hoffmann
2012-12-19 8:46 ` [Qemu-devel] [PATCH 3/8] apci: assign memory regions to piix4 acpi device Gerd Hoffmann
` (5 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Gerd Hoffmann @ 2012-12-19 8:46 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
hw/pc.c | 23 +++++++++++++++++++++++
hw/pc.h | 1 +
hw/pc_piix.c | 1 +
hw/pc_q35.c | 1 +
4 files changed, 26 insertions(+), 0 deletions(-)
diff --git a/hw/pc.c b/hw/pc.c
index b11e7c4..cc4b260 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -886,6 +886,29 @@ void pc_cpus_init(const char *cpu_model)
}
}
+void pc_acpi_init(const char *default_dsdt)
+{
+ char *filename = NULL, *arg = NULL;
+
+ if (acpi_tables != NULL) {
+ /* manually set via -acpitable, leave it alone */
+ return;
+ }
+
+ filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, default_dsdt);
+ if (filename == NULL) {
+ fprintf(stderr, "WARNING: failed to find %s\n", default_dsdt);
+ return;
+ }
+
+ arg = g_strdup_printf("file=%s", filename);
+ if (acpi_table_add(arg) != 0) {
+ fprintf(stderr, "WARNING: failed to load %s\n", filename);
+ }
+ g_free(arg);
+ g_free(filename);
+}
+
void *pc_memory_init(MemoryRegion *system_memory,
const char *kernel_filename,
const char *kernel_cmdline,
diff --git a/hw/pc.h b/hw/pc.h
index 2237e86..9ecccbb 100644
--- a/hw/pc.h
+++ b/hw/pc.h
@@ -79,6 +79,7 @@ void pc_register_ferr_irq(qemu_irq irq);
void pc_acpi_smi_interrupt(void *opaque, int irq, int level);
void pc_cpus_init(const char *cpu_model);
+void pc_acpi_init(const char *default_dsdt);
void *pc_memory_init(MemoryRegion *system_memory,
const char *kernel_filename,
const char *kernel_cmdline,
diff --git a/hw/pc_piix.c b/hw/pc_piix.c
index 19e342a..e032474 100644
--- a/hw/pc_piix.c
+++ b/hw/pc_piix.c
@@ -87,6 +87,7 @@ static void pc_init1(MemoryRegion *system_memory,
void *fw_cfg = NULL;
pc_cpus_init(cpu_model);
+ pc_acpi_init("acpi-dsdt.aml");
if (kvmclock_enabled) {
kvmclock_create();
diff --git a/hw/pc_q35.c b/hw/pc_q35.c
index 3429a9a..7a8d6fe 100644
--- a/hw/pc_q35.c
+++ b/hw/pc_q35.c
@@ -87,6 +87,7 @@ static void pc_q35_init(QEMUMachineInitArgs *args)
qemu_irq *cmos_s3;
pc_cpus_init(cpu_model);
+ pc_acpi_init("q35-acpi-dsdt.aml");
kvmclock_create();
--
1.7.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [Qemu-devel] [PATCH 3/8] apci: assign memory regions to piix4 acpi device
2012-12-19 8:46 [Qemu-devel] [PATCH 0/8] misc acpi updates and test devices Gerd Hoffmann
2012-12-19 8:46 ` [Qemu-devel] [PATCH 1/8] configure: also symlink *.aml files Gerd Hoffmann
2012-12-19 8:46 ` [Qemu-devel] [PATCH 2/8] acpi: autoload dsdt Gerd Hoffmann
@ 2012-12-19 8:46 ` Gerd Hoffmann
2012-12-19 8:46 ` [Qemu-devel] [PATCH 4/8] apci: assign memory regions to ich9 lpc device Gerd Hoffmann
` (4 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Gerd Hoffmann @ 2012-12-19 8:46 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
Get rid of get_system_io() usage.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
hw/acpi_piix4.c | 20 +++++++++++++-------
1 files changed, 13 insertions(+), 7 deletions(-)
diff --git a/hw/acpi_piix4.c b/hw/acpi_piix4.c
index 0b5b0d3..30bafb6 100644
--- a/hw/acpi_piix4.c
+++ b/hw/acpi_piix4.c
@@ -57,6 +57,7 @@ struct pci_status {
typedef struct PIIX4PMState {
PCIDevice dev;
+
MemoryRegion io;
MemoryRegion io_gpe;
MemoryRegion io_pci;
@@ -83,7 +84,8 @@ typedef struct PIIX4PMState {
uint8_t s4_val;
} PIIX4PMState;
-static void piix4_acpi_system_hot_add_init(PCIBus *bus, PIIX4PMState *s);
+static void piix4_acpi_system_hot_add_init(MemoryRegion *parent,
+ PCIBus *bus, PIIX4PMState *s);
#define ACPI_ENABLE 0xf1
#define ACPI_DISABLE 0xf0
@@ -406,11 +408,13 @@ static int piix4_pm_initfn(PCIDevice *dev)
pci_conf[0xd2] = 0x09;
pm_smbus_init(&s->dev.qdev, &s->smb);
memory_region_set_enabled(&s->smb.io, pci_conf[0xd2] & 1);
- memory_region_add_subregion(get_system_io(), s->smb_io_base, &s->smb.io);
+ memory_region_add_subregion(pci_address_space_io(dev),
+ s->smb_io_base, &s->smb.io);
memory_region_init(&s->io, "piix4-pm", 64);
memory_region_set_enabled(&s->io, false);
- memory_region_add_subregion(get_system_io(), 0, &s->io);
+ memory_region_add_subregion(pci_address_space_io(dev),
+ 0, &s->io);
acpi_pm_tmr_init(&s->ar, pm_tmr_timer, &s->io);
acpi_pm1_evt_init(&s->ar, pm_tmr_timer, &s->io);
@@ -423,7 +427,8 @@ static int piix4_pm_initfn(PCIDevice *dev)
s->machine_ready.notify = piix4_pm_machine_ready;
qemu_add_machine_init_done_notifier(&s->machine_ready);
qemu_register_reset(piix4_reset, s);
- piix4_acpi_system_hot_add_init(dev->bus, s);
+
+ piix4_acpi_system_hot_add_init(pci_address_space_io(dev), dev->bus, s);
return 0;
}
@@ -593,15 +598,16 @@ static const MemoryRegionOps piix4_pci_ops = {
static int piix4_device_hotplug(DeviceState *qdev, PCIDevice *dev,
PCIHotplugState state);
-static void piix4_acpi_system_hot_add_init(PCIBus *bus, PIIX4PMState *s)
+static void piix4_acpi_system_hot_add_init(MemoryRegion *parent,
+ PCIBus *bus, PIIX4PMState *s)
{
memory_region_init_io(&s->io_gpe, &piix4_gpe_ops, s, "apci-gpe0",
GPE_LEN);
- memory_region_add_subregion(get_system_io(), GPE_BASE, &s->io_gpe);
+ memory_region_add_subregion(parent, GPE_BASE, &s->io_gpe);
memory_region_init_io(&s->io_pci, &piix4_pci_ops, s, "apci-pci-hotplug",
PCI_HOTPLUG_SIZE);
- memory_region_add_subregion(get_system_io(), PCI_HOTPLUG_ADDR,
+ memory_region_add_subregion(parent, PCI_HOTPLUG_ADDR,
&s->io_pci);
pci_bus_hotplug(bus, piix4_device_hotplug, &s->dev.qdev);
}
--
1.7.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [Qemu-devel] [PATCH 4/8] apci: assign memory regions to ich9 lpc device
2012-12-19 8:46 [Qemu-devel] [PATCH 0/8] misc acpi updates and test devices Gerd Hoffmann
` (2 preceding siblings ...)
2012-12-19 8:46 ` [Qemu-devel] [PATCH 3/8] apci: assign memory regions to piix4 acpi device Gerd Hoffmann
@ 2012-12-19 8:46 ` Gerd Hoffmann
2012-12-19 8:46 ` [Qemu-devel] [PATCH 5/8] switch debugcon to memory api Gerd Hoffmann
` (3 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Gerd Hoffmann @ 2012-12-19 8:46 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
Get rid of get_system_io() usage.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
hw/acpi_ich9.c | 6 ++++--
hw/acpi_ich9.h | 4 +++-
hw/lpc_ich9.c | 2 +-
3 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/hw/acpi_ich9.c b/hw/acpi_ich9.c
index c5978d3..b895422 100644
--- a/hw/acpi_ich9.c
+++ b/hw/acpi_ich9.c
@@ -201,11 +201,13 @@ static void pm_powerdown_req(Notifier *n, void *opaque)
acpi_pm1_evt_power_down(&pm->acpi_regs);
}
-void ich9_pm_init(ICH9LPCPMRegs *pm, qemu_irq sci_irq, qemu_irq cmos_s3)
+void ich9_pm_init(PCIDevice *lpc_pci, ICH9LPCPMRegs *pm,
+ qemu_irq sci_irq, qemu_irq cmos_s3)
{
memory_region_init(&pm->io, "ich9-pm", ICH9_PMIO_SIZE);
memory_region_set_enabled(&pm->io, false);
- memory_region_add_subregion(get_system_io(), 0, &pm->io);
+ memory_region_add_subregion(pci_address_space_io(lpc_pci),
+ 0, &pm->io);
acpi_pm_tmr_init(&pm->acpi_regs, ich9_pm_update_sci_fn, &pm->io);
acpi_pm1_evt_init(&pm->acpi_regs, ich9_pm_update_sci_fn, &pm->io);
diff --git a/hw/acpi_ich9.h b/hw/acpi_ich9.h
index bc221d3..ecb82ab 100644
--- a/hw/acpi_ich9.h
+++ b/hw/acpi_ich9.h
@@ -30,9 +30,11 @@ typedef struct ICH9LPCPMRegs {
* PM1a_CNT_BLK = 2 in FADT so it is defined as uint16_t.
*/
ACPIREGS acpi_regs;
+
MemoryRegion io;
MemoryRegion io_gpe;
MemoryRegion io_smi;
+
uint32_t smi_en;
uint32_t smi_sts;
@@ -42,7 +44,7 @@ typedef struct ICH9LPCPMRegs {
Notifier powerdown_notifier;
} ICH9LPCPMRegs;
-void ich9_pm_init(ICH9LPCPMRegs *pm,
+void ich9_pm_init(PCIDevice *lpc_pci, ICH9LPCPMRegs *pm,
qemu_irq sci_irq, qemu_irq cmos_s3_resume);
void ich9_pm_iospace_update(ICH9LPCPMRegs *pm, uint32_t pm_io_base);
extern const VMStateDescription vmstate_ich9_pm;
diff --git a/hw/lpc_ich9.c b/hw/lpc_ich9.c
index 878a43e..dd67b61 100644
--- a/hw/lpc_ich9.c
+++ b/hw/lpc_ich9.c
@@ -352,7 +352,7 @@ void ich9_lpc_pm_init(PCIDevice *lpc_pci, qemu_irq cmos_s3)
qemu_irq *sci_irq;
sci_irq = qemu_allocate_irqs(ich9_set_sci, lpc, 1);
- ich9_pm_init(&lpc->pm, sci_irq[0], cmos_s3);
+ ich9_pm_init(lpc_pci, &lpc->pm, sci_irq[0], cmos_s3);
ich9_lpc_reset(&lpc->d.qdev);
}
--
1.7.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [Qemu-devel] [PATCH 5/8] switch debugcon to memory api
2012-12-19 8:46 [Qemu-devel] [PATCH 0/8] misc acpi updates and test devices Gerd Hoffmann
` (3 preceding siblings ...)
2012-12-19 8:46 ` [Qemu-devel] [PATCH 4/8] apci: assign memory regions to ich9 lpc device Gerd Hoffmann
@ 2012-12-19 8:46 ` Gerd Hoffmann
2012-12-19 8:46 ` [Qemu-devel] [PATCH 6/8] add isa-debug-exit device Gerd Hoffmann
` (2 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Gerd Hoffmann @ 2012-12-19 8:46 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
Also some QOM glue while being at it.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
hw/debugcon.c | 31 ++++++++++++++++++++++++-------
1 files changed, 24 insertions(+), 7 deletions(-)
diff --git a/hw/debugcon.c b/hw/debugcon.c
index 14ab326..3cde16c 100644
--- a/hw/debugcon.c
+++ b/hw/debugcon.c
@@ -29,20 +29,27 @@
#include "isa.h"
#include "pc.h"
+#define TYPE_ISA_DEBUGCON_DEVICE "isa-debugcon"
+#define ISA_DEBUGCON_DEVICE(obj) \
+ OBJECT_CHECK(ISADebugconState, (obj), TYPE_ISA_DEBUGCON_DEVICE)
+
//#define DEBUG_DEBUGCON
typedef struct DebugconState {
+ MemoryRegion io;
CharDriverState *chr;
uint32_t readback;
} DebugconState;
typedef struct ISADebugconState {
- ISADevice dev;
+ ISADevice parent_obj;
+
uint32_t iobase;
DebugconState state;
} ISADebugconState;
-static void debugcon_ioport_write(void *opaque, uint32_t addr, uint32_t val)
+static void debugcon_ioport_write(void *opaque, hwaddr addr, uint64_t val,
+ unsigned width)
{
DebugconState *s = opaque;
unsigned char ch = val;
@@ -55,7 +62,7 @@ static void debugcon_ioport_write(void *opaque, uint32_t addr, uint32_t val)
}
-static uint32_t debugcon_ioport_read(void *opaque, uint32_t addr)
+static uint64_t debugcon_ioport_read(void *opaque, hwaddr addr, unsigned width)
{
DebugconState *s = opaque;
@@ -66,6 +73,14 @@ static uint32_t debugcon_ioport_read(void *opaque, uint32_t addr)
return s->readback;
}
+static const MemoryRegionOps debugcon_ops = {
+ .read = debugcon_ioport_read,
+ .write = debugcon_ioport_write,
+ .valid.min_access_size = 1,
+ .valid.max_access_size = 1,
+ .endianness = DEVICE_LITTLE_ENDIAN,
+};
+
static void debugcon_init_core(DebugconState *s)
{
if (!s->chr) {
@@ -78,12 +93,14 @@ static void debugcon_init_core(DebugconState *s)
static int debugcon_isa_initfn(ISADevice *dev)
{
- ISADebugconState *isa = DO_UPCAST(ISADebugconState, dev, dev);
+ ISADebugconState *isa = ISA_DEBUGCON_DEVICE(dev);
DebugconState *s = &isa->state;
debugcon_init_core(s);
- register_ioport_write(isa->iobase, 1, 1, debugcon_ioport_write, s);
- register_ioport_read(isa->iobase, 1, 1, debugcon_ioport_read, s);
+ memory_region_init_io(&s->io, &debugcon_ops, s,
+ TYPE_ISA_DEBUGCON_DEVICE, 1);
+ memory_region_add_subregion(isa_address_space_io(dev),
+ isa->iobase, &s->io);
return 0;
}
@@ -103,7 +120,7 @@ static void debugcon_isa_class_initfn(ObjectClass *klass, void *data)
}
static TypeInfo debugcon_isa_info = {
- .name = "isa-debugcon",
+ .name = TYPE_ISA_DEBUGCON_DEVICE,
.parent = TYPE_ISA_DEVICE,
.instance_size = sizeof(ISADebugconState),
.class_init = debugcon_isa_class_initfn,
--
1.7.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [Qemu-devel] [PATCH 6/8] add isa-debug-exit device.
2012-12-19 8:46 [Qemu-devel] [PATCH 0/8] misc acpi updates and test devices Gerd Hoffmann
` (4 preceding siblings ...)
2012-12-19 8:46 ` [Qemu-devel] [PATCH 5/8] switch debugcon to memory api Gerd Hoffmann
@ 2012-12-19 8:46 ` Gerd Hoffmann
2012-12-19 8:46 ` [Qemu-devel] [PATCH 7/8] hw: Add test device for unittests execution Gerd Hoffmann
2012-12-19 8:46 ` [Qemu-devel] [PATCH 8/8] pc: remove bochs bios debug ports Gerd Hoffmann
7 siblings, 0 replies; 9+ messages in thread
From: Gerd Hoffmann @ 2012-12-19 8:46 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
When present it makes qemu exit on any write.
Mapped to port 0x501 by default.
Without this patch Anthony doesn't allow me to
remove the bochs bios debug ports because his
test suite uses this.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
hw/debugexit.c | 75 +++++++++++++++++++++++++++++++++++++++++++++++++
hw/i386/Makefile.objs | 2 +-
2 files changed, 76 insertions(+), 1 deletions(-)
create mode 100644 hw/debugexit.c
diff --git a/hw/debugexit.c b/hw/debugexit.c
new file mode 100644
index 0000000..90642eb
--- /dev/null
+++ b/hw/debugexit.c
@@ -0,0 +1,75 @@
+/*
+ * debug exit port emulation
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 or
+ * (at your option) any later version.
+ */
+
+#include "hw.h"
+#include "isa.h"
+
+#define TYPE_ISA_DEBUG_EXIT_DEVICE "isa-debug-exit"
+#define ISA_DEBUG_EXIT_DEVICE(obj) \
+ OBJECT_CHECK(ISADebugExitState, (obj), TYPE_ISA_DEBUG_EXIT_DEVICE)
+
+typedef struct ISADebugExitState {
+ ISADevice parent_obj;
+
+ uint32_t iobase;
+ uint32_t iosize;
+ MemoryRegion io;
+} ISADebugExitState;
+
+static void debug_exit_write(void *opaque, hwaddr addr, uint64_t val,
+ unsigned width)
+{
+ exit((val << 1) | 1);
+}
+
+static const MemoryRegionOps debug_exit_ops = {
+ .write = debug_exit_write,
+ .valid.min_access_size = 1,
+ .valid.max_access_size = 4,
+ .endianness = DEVICE_LITTLE_ENDIAN,
+};
+
+static int debug_exit_initfn(ISADevice *dev)
+{
+ ISADebugExitState *isa = ISA_DEBUG_EXIT_DEVICE(dev);
+
+ memory_region_init_io(&isa->io, &debug_exit_ops, isa,
+ TYPE_ISA_DEBUG_EXIT_DEVICE, isa->iosize);
+ memory_region_add_subregion(isa_address_space_io(dev),
+ isa->iobase, &isa->io);
+ return 0;
+}
+
+static Property debug_exit_properties[] = {
+ DEFINE_PROP_HEX32("iobase", ISADebugExitState, iobase, 0x501),
+ DEFINE_PROP_HEX32("iosize", ISADebugExitState, iosize, 0x02),
+ DEFINE_PROP_END_OF_LIST(),
+};
+
+static void debug_exit_class_initfn(ObjectClass *klass, void *data)
+{
+ DeviceClass *dc = DEVICE_CLASS(klass);
+ ISADeviceClass *ic = ISA_DEVICE_CLASS(klass);
+ ic->init = debug_exit_initfn;
+ dc->props = debug_exit_properties;
+}
+
+static TypeInfo debug_exit_info = {
+ .name = TYPE_ISA_DEBUG_EXIT_DEVICE,
+ .parent = TYPE_ISA_DEVICE,
+ .instance_size = sizeof(ISADebugExitState),
+ .class_init = debug_exit_class_initfn,
+};
+
+static void debug_exit_register_types(void)
+{
+ type_register_static(&debug_exit_info);
+}
+
+type_init(debug_exit_register_types)
diff --git a/hw/i386/Makefile.objs b/hw/i386/Makefile.objs
index 0d3f6a8..56aaa9d 100644
--- a/hw/i386/Makefile.objs
+++ b/hw/i386/Makefile.objs
@@ -3,7 +3,7 @@ obj-y += apic_common.o apic.o kvmvapic.o
obj-y += sga.o ioapic_common.o ioapic.o piix_pci.o
obj-y += vmport.o
obj-y += pci-hotplug.o smbios.o wdt_ib700.o
-obj-y += debugcon.o multiboot.o
+obj-y += debugcon.o debugexit.o multiboot.o
obj-y += pc_piix.o
obj-y += pc_sysfw.o
obj-y += lpc_ich9.o q35.o pc_q35.o
--
1.7.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [Qemu-devel] [PATCH 7/8] hw: Add test device for unittests execution
2012-12-19 8:46 [Qemu-devel] [PATCH 0/8] misc acpi updates and test devices Gerd Hoffmann
` (5 preceding siblings ...)
2012-12-19 8:46 ` [Qemu-devel] [PATCH 6/8] add isa-debug-exit device Gerd Hoffmann
@ 2012-12-19 8:46 ` Gerd Hoffmann
2012-12-19 8:46 ` [Qemu-devel] [PATCH 8/8] pc: remove bochs bios debug ports Gerd Hoffmann
7 siblings, 0 replies; 9+ messages in thread
From: Gerd Hoffmann @ 2012-12-19 8:46 UTC (permalink / raw)
To: qemu-devel
Cc: Lucas Meneghel Rodrigues, Paolo Bonzini, Marcelo Tosatti,
Alexander Graf, Gerd Hoffmann
From: Lucas Meneghel Rodrigues <lmr@redhat.com>
Add a test device which supports the kvmctl ioports,
so one can run the KVM unittest suite.
Intended Usage:
qemu-system-x86_64 -nographic \
-device pc-testdev \
-device isa-debug-exit,iobase=0xf4,iosize=0x04 \
-kernel /path/to/kvm/unittests/msr.flat
Where msr.flat is one of the KVM unittests, present on a
separate repo,
git://git.kernel.org/pub/scm/virt/kvm/kvm-unit-tests.git
[ kraxel: more memory api + qom fixes ]
CC: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Lucas Meneghel Rodrigues <lmr@redhat.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
hw/i386/Makefile.objs | 1 +
hw/pc-testdev.c | 183 +++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 184 insertions(+), 0 deletions(-)
create mode 100644 hw/pc-testdev.c
diff --git a/hw/i386/Makefile.objs b/hw/i386/Makefile.objs
index 56aaa9d..1ac5fc5 100644
--- a/hw/i386/Makefile.objs
+++ b/hw/i386/Makefile.objs
@@ -12,5 +12,6 @@ obj-$(CONFIG_XEN_PCI_PASSTHROUGH) += xen-host-pci-device.o
obj-$(CONFIG_XEN_PCI_PASSTHROUGH) += xen_pt.o xen_pt_config_init.o xen_pt_msi.o
obj-y += kvm/
obj-$(CONFIG_SPICE) += qxl.o qxl-logger.o qxl-render.o
+obj-y += pc-testdev.o
obj-y := $(addprefix ../,$(obj-y))
diff --git a/hw/pc-testdev.c b/hw/pc-testdev.c
new file mode 100644
index 0000000..1ea3c1c
--- /dev/null
+++ b/hw/pc-testdev.c
@@ -0,0 +1,183 @@
+/*
+ * QEMU x86 ISA testdev
+ *
+ * Copyright (c) 2012 Avi Kivity, Gerd Hoffmann, Marcelo Tosatti
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/*
+ * This device is used to test KVM features specific to the x86 port, such
+ * as emulation, power management, interrupt routing, among others. It's meant
+ * to be used like:
+ *
+ * qemu-system-x86_64 -device pc-testdev -serial stdio \
+ * -device isa-debug-exit,iobase=0xf4,iosize=0x4 \
+ * -kernel /home/lmr/Code/virt-test.git/kvm/unittests/msr.flat
+ *
+ * Where msr.flat is one of the KVM unittests, present on a separate repo,
+ * git://git.kernel.org/pub/scm/virt/kvm/kvm-unit-tests.git
+*/
+
+#include <sys/mman.h>
+#include "hw.h"
+#include "qdev.h"
+#include "isa.h"
+#include "exec-memory.h"
+
+#define IOMEM_LEN 0x10000
+
+typedef struct PCTestdev {
+ ISADevice parent_obj;
+
+ MemoryRegion ioport;
+ MemoryRegion flush;
+ MemoryRegion irq;
+ MemoryRegion iomem;
+ uint32_t ioport_data;
+ char iomem_buf[IOMEM_LEN];
+} PCTestdev;
+
+#define TYPE_TESTDEV "pc-testdev"
+#define TESTDEV(obj) \
+ OBJECT_CHECK(struct PCTestdev, (obj), TYPE_TESTDEV)
+
+static void test_irq_line(void *opaque, hwaddr addr, uint64_t data,
+ unsigned len)
+{
+ struct PCTestdev *dev = opaque;
+ struct ISADevice *isa = ISA_DEVICE(dev);
+
+ qemu_set_irq(isa_get_irq(isa, addr), !!data);
+}
+
+static const MemoryRegionOps test_irq_ops = {
+ .write = test_irq_line,
+ .valid.min_access_size = 1,
+ .valid.max_access_size = 1,
+ .endianness = DEVICE_LITTLE_ENDIAN,
+};
+
+static void test_ioport_write(void *opaque, hwaddr addr, uint64_t data,
+ unsigned len)
+{
+ struct PCTestdev *dev = opaque;
+ dev->ioport_data = data;
+}
+
+static uint64_t test_ioport_read(void *opaque, hwaddr addr, unsigned len)
+{
+ struct PCTestdev *dev = opaque;
+ return dev->ioport_data;
+}
+
+static const MemoryRegionOps test_ioport_ops = {
+ .read = test_ioport_read,
+ .write = test_ioport_write,
+ .endianness = DEVICE_LITTLE_ENDIAN,
+};
+
+static void test_flush_page(void *opaque, hwaddr addr, uint64_t data,
+ unsigned len)
+{
+ hwaddr page = 4096;
+ void *a = cpu_physical_memory_map(data & ~0xffful, &page, 0);
+
+ /* We might not be able to get the full page, only mprotect what we actually
+ have mapped */
+ mprotect(a, page, PROT_NONE);
+ mprotect(a, page, PROT_READ|PROT_WRITE);
+ cpu_physical_memory_unmap(a, page, 0, 0);
+}
+
+static const MemoryRegionOps test_flush_ops = {
+ .write = test_flush_page,
+ .valid.min_access_size = 4,
+ .valid.max_access_size = 4,
+ .endianness = DEVICE_LITTLE_ENDIAN,
+};
+
+static uint64_t test_iomem_read(void *opaque, hwaddr addr, unsigned len)
+{
+ struct PCTestdev *dev = opaque;
+ uint64_t ret = 0;
+ memcpy(&ret, &dev->iomem_buf[addr], len);
+ ret = le64_to_cpu(ret);
+
+ return ret;
+}
+
+static void test_iomem_write(void *opaque, hwaddr addr, uint64_t val,
+ unsigned len)
+{
+ struct PCTestdev *dev = opaque;
+ val = cpu_to_le64(val);
+ memcpy(&dev->iomem_buf[addr], &val, len);
+ dev->iomem_buf[addr] = val;
+}
+
+static const MemoryRegionOps test_iomem_ops = {
+ .read = test_iomem_read,
+ .write = test_iomem_write,
+ .endianness = DEVICE_LITTLE_ENDIAN,
+};
+
+static int init_test_device(ISADevice *isa)
+{
+ struct PCTestdev *dev = TESTDEV(isa);
+ MemoryRegion *mem = isa_address_space(isa);
+ MemoryRegion *io = isa_address_space_io(isa);
+
+ memory_region_init_io(&dev->ioport, &test_ioport_ops, dev,
+ "pc-testdev-ioport", 4);
+ memory_region_init_io(&dev->flush, &test_flush_ops, dev,
+ "pc-testdev-flush-page", 4);
+ memory_region_init_io(&dev->irq, &test_irq_ops, dev,
+ "pc-testdev-irq-line", 24);
+ memory_region_init_io(&dev->iomem, &test_iomem_ops, dev,
+ "pc-testdev-iomem", IOMEM_LEN);
+
+ memory_region_add_subregion(io, 0xe0, &dev->ioport);
+ memory_region_add_subregion(io, 0xe4, &dev->flush);
+ memory_region_add_subregion(io, 0x2000, &dev->irq);
+ memory_region_add_subregion(mem, 0xff000000, &dev->iomem);
+
+ return 0;
+}
+
+static void testdev_class_init(ObjectClass *klass, void *data)
+{
+ ISADeviceClass *k = ISA_DEVICE_CLASS(klass);
+
+ k->init = init_test_device;
+}
+
+static TypeInfo testdev_info = {
+ .name = TYPE_TESTDEV,
+ .parent = TYPE_ISA_DEVICE,
+ .instance_size = sizeof(struct PCTestdev),
+ .class_init = testdev_class_init,
+};
+
+static void testdev_register_types(void)
+{
+ type_register_static(&testdev_info);
+}
+
+type_init(testdev_register_types)
--
1.7.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [Qemu-devel] [PATCH 8/8] pc: remove bochs bios debug ports
2012-12-19 8:46 [Qemu-devel] [PATCH 0/8] misc acpi updates and test devices Gerd Hoffmann
` (6 preceding siblings ...)
2012-12-19 8:46 ` [Qemu-devel] [PATCH 7/8] hw: Add test device for unittests execution Gerd Hoffmann
@ 2012-12-19 8:46 ` Gerd Hoffmann
7 siblings, 0 replies; 9+ messages in thread
From: Gerd Hoffmann @ 2012-12-19 8:46 UTC (permalink / raw)
To: qemu-devel; +Cc: Gerd Hoffmann
Prehistoric leftover, zap it. We poweroff via acpi these days.
And having a port (0x501,0x502) where any random guest write will make
qemu exit -- with no way to turn it off -- is a bad joke anyway.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
hw/pc.c | 41 -----------------------------------------
1 files changed, 0 insertions(+), 41 deletions(-)
diff --git a/hw/pc.c b/hw/pc.c
index cc4b260..0997c72 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -524,34 +524,6 @@ static void handle_a20_line_change(void *opaque, int irq, int level)
cpu_x86_set_a20(cpu, level);
}
-/***********************************************************/
-/* Bochs BIOS debug ports */
-
-static void bochs_bios_write(void *opaque, uint32_t addr, uint32_t val)
-{
- static const char shutdown_str[8] = "Shutdown";
- static int shutdown_index = 0;
-
- switch(addr) {
- case 0x8900:
- /* same as Bochs power off */
- if (val == shutdown_str[shutdown_index]) {
- shutdown_index++;
- if (shutdown_index == 8) {
- shutdown_index = 0;
- qemu_system_shutdown_request();
- }
- } else {
- shutdown_index = 0;
- }
- break;
-
- case 0x501:
- case 0x502:
- exit((val << 1) | 1);
- }
-}
-
int e820_add_entry(uint64_t address, uint64_t length, uint32_t type)
{
int index = le32_to_cpu(e820_table.count);
@@ -569,14 +541,6 @@ int e820_add_entry(uint64_t address, uint64_t length, uint32_t type)
return index;
}
-static const MemoryRegionPortio bochs_bios_portio_list[] = {
- { 0x500, 1, 1, .write = bochs_bios_write, }, /* 0x500 */
- { 0x501, 1, 1, .write = bochs_bios_write, }, /* 0x501 */
- { 0x501, 2, 2, .write = bochs_bios_write, }, /* 0x501 */
- { 0x8900, 1, 1, .write = bochs_bios_write, }, /* 0x8900 */
- PORTIO_END_OF_LIST(),
-};
-
static void *bochs_bios_init(void)
{
void *fw_cfg;
@@ -584,11 +548,6 @@ static void *bochs_bios_init(void)
size_t smbios_len;
uint64_t *numa_fw_cfg;
int i, j;
- PortioList *bochs_bios_port_list = g_new(PortioList, 1);
-
- portio_list_init(bochs_bios_port_list, bochs_bios_portio_list,
- NULL, "bochs-bios");
- portio_list_add(bochs_bios_port_list, get_system_io(), 0x0);
fw_cfg = fw_cfg_init(BIOS_CFG_IOPORT, BIOS_CFG_IOPORT + 1, 0, 0);
--
1.7.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
end of thread, other threads:[~2012-12-19 8:46 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-12-19 8:46 [Qemu-devel] [PATCH 0/8] misc acpi updates and test devices Gerd Hoffmann
2012-12-19 8:46 ` [Qemu-devel] [PATCH 1/8] configure: also symlink *.aml files Gerd Hoffmann
2012-12-19 8:46 ` [Qemu-devel] [PATCH 2/8] acpi: autoload dsdt Gerd Hoffmann
2012-12-19 8:46 ` [Qemu-devel] [PATCH 3/8] apci: assign memory regions to piix4 acpi device Gerd Hoffmann
2012-12-19 8:46 ` [Qemu-devel] [PATCH 4/8] apci: assign memory regions to ich9 lpc device Gerd Hoffmann
2012-12-19 8:46 ` [Qemu-devel] [PATCH 5/8] switch debugcon to memory api Gerd Hoffmann
2012-12-19 8:46 ` [Qemu-devel] [PATCH 6/8] add isa-debug-exit device Gerd Hoffmann
2012-12-19 8:46 ` [Qemu-devel] [PATCH 7/8] hw: Add test device for unittests execution Gerd Hoffmann
2012-12-19 8:46 ` [Qemu-devel] [PATCH 8/8] pc: remove bochs bios debug ports Gerd Hoffmann
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).