On Fri, Mar 29, 2013 at 10:28:07AM +0100, Paolo Bonzini wrote: > Il 29/03/2013 09:16, Hu Tao ha scritto: > > diff --git a/hw/pc.h b/hw/pc.h > > index 8e1dd4c..d42b76b 100644 > > --- a/hw/pc.h > > +++ b/hw/pc.h > > @@ -145,6 +145,12 @@ PCIBus *i440fx_init(PCII440FXState **pi440fx_state, > > int *piix_devfn, > > extern PCIDevice *piix4_dev; > > int piix4_init(PCIBus *bus, ISABus **isa_bus, int devfn); > > > > +/* pc_piix.c */ > > +extern void *fw_cfg_piix; > > + > > +/* pc_q35.c */ > > +extern void *fw_cfg_q35; > > + > > /* vga.c */ > > enum vga_retrace_method { > > VGA_RETRACE_DUMB, > > > > Hu, this is not what I suggested in the review... > > Please do not ignore comments without answer, otherwise we'll just run > in circles.
Sorry about that. I have to float up object_property_add_child() because fw_cfg has path '/machine/unattached/device[4]' (in my test) by default, the path seems to vary so we can use it. Please review, if no problem I'll post v17 shortly: >From 5071f4bc6ff640637826d8ed7af9668d7bc1a642 Mon Sep 17 00:00:00 2001 From: Hu Tao <hu...@cn.fujitsu.com> Date: Mon, 1 Apr 2013 15:51:59 +0800 Subject: [PATCH v16.1 5/5] pvpanic: pass configurable ioport to seabios This lets seabios patch the corresponding SSDT entry. Signed-off-by: Hu Tao <hu...@cn.fujitsu.com> --- hw/fw_cfg.c | 6 +++++- hw/fw_cfg.h | 2 ++ hw/pvpanic.c | 14 ++++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/hw/fw_cfg.c b/hw/fw_cfg.c index 63a1998..712856c 100644 --- a/hw/fw_cfg.c +++ b/hw/fw_cfg.c @@ -489,11 +489,15 @@ FWCfgState *fw_cfg_init(uint32_t ctl_port, uint32_t data_port, dev = qdev_create(NULL, "fw_cfg"); qdev_prop_set_uint32(dev, "ctl_iobase", ctl_port); qdev_prop_set_uint32(dev, "data_iobase", data_port); - qdev_init_nofail(dev); d = SYS_BUS_DEVICE(dev); s = DO_UPCAST(FWCfgState, busdev.qdev, dev); + if (!object_resolve_path("/machine/fw_cfg", NULL)) + object_property_add_child(qdev_get_machine(), "fw_cfg", OBJECT(s), NULL); + + qdev_init_nofail(dev); + if (ctl_addr) { sysbus_mmio_map(d, 0, ctl_addr); } diff --git a/hw/fw_cfg.h b/hw/fw_cfg.h index 05c8df1..07cc941 100644 --- a/hw/fw_cfg.h +++ b/hw/fw_cfg.h @@ -1,6 +1,8 @@ #ifndef FW_CFG_H #define FW_CFG_H +#include "exec/hwaddr.h" + #define FW_CFG_SIGNATURE 0x00 #define FW_CFG_ID 0x01 #define FW_CFG_UUID 0x02 diff --git a/hw/pvpanic.c b/hw/pvpanic.c index ff0a116..4384831 100644 --- a/hw/pvpanic.c +++ b/hw/pvpanic.c @@ -18,6 +18,8 @@ #include <sysemu/sysemu.h> #include <sysemu/kvm.h> +#include "hw/fw_cfg.h" + /* The bit of supported pv event */ #define PVPANIC_F_PANICKED 0 @@ -79,10 +81,22 @@ static const MemoryRegionOps pvpanic_ops = { static int pvpanic_isa_initfn(ISADevice *dev) { PVPanicState *s = ISA_PVPANIC_DEVICE(dev); + static bool port_configured = false; + void *fw_cfg; memory_region_init_io(&s->io, &pvpanic_ops, s, "pvpanic", 1); isa_register_ioport(dev, &s->io, s->ioport); + if (!port_configured) { + fw_cfg = object_resolve_path("/machine/fw_cfg", NULL); + if (fw_cfg) { + fw_cfg_add_file(fw_cfg, "etc/pvpanic-port", + g_memdup(&s->ioport, sizeof(s->ioport)), + sizeof(s->ioport)); + port_configured = true; + } + } + return 0; } -- 1.8.1.4