All of lore.kernel.org
 help / color / mirror / Atom feed
* Re: [Qemu-devel] [PATCH] target/arm : add pvpanic mmio device
  2018-10-17  9:23 [Qemu-devel] [PATCH] target/arm : add pvpanic mmio device Peng Hao
@ 2018-10-17  1:32 ` Richard Henderson
  2018-10-17  1:39   ` peng.hao2
  2018-10-17  9:53 ` Philippe Mathieu-Daudé
  1 sibling, 1 reply; 7+ messages in thread
From: Richard Henderson @ 2018-10-17  1:32 UTC (permalink / raw)
  To: Peng Hao, peter.maydell; +Cc: qemu-arm, qemu-devel

On 10/17/18 2:23 AM, Peng Hao wrote:
> +++ b/hw/misc/pvpanic-mmio.c
> @@ -0,0 +1,76 @@
> +#include "qemu/osdep.h"

New file requires file header w/ copyright and license.


r~

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

* Re: [Qemu-devel] [PATCH] target/arm : add pvpanic mmio device
  2018-10-17  1:32 ` Richard Henderson
@ 2018-10-17  1:39   ` peng.hao2
  0 siblings, 0 replies; 7+ messages in thread
From: peng.hao2 @ 2018-10-17  1:39 UTC (permalink / raw)
  To: richard.henderson; +Cc: peter.maydell, qemu-arm, qemu-devel

>On 10/17/18 2:23 AM, Peng Hao wrote:
>> +++ b/hw/misc/pvpanic-mmio.c
>> @@ -0,0 +1,76 @@
>> +#include "qemu/osdep.h"
>
>New file requires file header w/ copyright and license.
I will handle it in new version .Thanks

>r~

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

* [Qemu-devel] [PATCH]  target/arm : add pvpanic mmio device
@ 2018-10-17  9:23 Peng Hao
  2018-10-17  1:32 ` Richard Henderson
  2018-10-17  9:53 ` Philippe Mathieu-Daudé
  0 siblings, 2 replies; 7+ messages in thread
From: Peng Hao @ 2018-10-17  9:23 UTC (permalink / raw)
  To: peter.maydell; +Cc: qemu-devel, qemu-arm, Peng Hao

Add pvpanic mmio device that is similar to x86's pvpanic device.

Signed-off-by: Peng Hao <peng.hao2@zte.com.cn>
---
 default-configs/arm-softmmu.mak |  2 +-
 hw/arm/virt.c                   | 21 ++++++++++++
 hw/misc/Makefile.objs           |  1 +
 hw/misc/pvpanic-mmio.c          | 76 +++++++++++++++++++++++++++++++++++++++++
 include/hw/arm/virt.h           |  1 +
 include/hw/misc/pvpanic-mmio.h  | 12 +++++++
 6 files changed, 112 insertions(+), 1 deletion(-)
 create mode 100644 hw/misc/pvpanic-mmio.c
 create mode 100644 include/hw/misc/pvpanic-mmio.h

diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.mak
index 2420491..4713c92 100644
--- a/default-configs/arm-softmmu.mak
+++ b/default-configs/arm-softmmu.mak
@@ -43,7 +43,7 @@ CONFIG_USB_MUSB=y
 CONFIG_USB_EHCI_SYSBUS=y
 CONFIG_PLATFORM_BUS=y
 CONFIG_VIRTIO_MMIO=y
-
+CONFIG_PVPANIC_MMIO=y
 CONFIG_ARM11MPCORE=y
 CONFIG_A9MPCORE=y
 CONFIG_A15MPCORE=y
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index a472566..ab41128 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -140,6 +140,7 @@ static const MemMapEntry a15memmap[] = {
     [VIRT_UART] =               { 0x09000000, 0x00001000 },
     [VIRT_RTC] =                { 0x09010000, 0x00001000 },
     [VIRT_FW_CFG] =             { 0x09020000, 0x00000018 },
+    [VIRT_PVPANIC_MMIO] =       { 0x09020018, 0x00000002 },
     [VIRT_GPIO] =               { 0x09030000, 0x00001000 },
     [VIRT_SECURE_UART] =        { 0x09040000, 0x00001000 },
     [VIRT_SMMU] =               { 0x09050000, 0x00020000 },
@@ -798,6 +799,24 @@ static void create_gpio(const VirtMachineState *vms, qemu_irq *pic)
     g_free(nodename);
 }
 
+static void create_pvpanic_device(const VirtMachineState *vms)
+{
+    char *nodename;
+    hwaddr base = vms->memmap[VIRT_PVPANIC_MMIO].base;
+    hwaddr size = vms->memmap[VIRT_PVPANIC_MMIO].size;
+
+    sysbus_create_simple("pvpanic-mmio", base, NULL);
+
+    nodename = g_strdup_printf("/pvpanic-mmio@%" PRIx64, base);
+    qemu_fdt_add_subnode(vms->fdt, nodename);
+    qemu_fdt_setprop_string(vms->fdt, nodename,
+                            "compatible", "pvpanic,mmio");
+    qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
+                                 2, base, 2, size);
+    g_free(nodename);
+
+}
+
 static void create_virtio_devices(const VirtMachineState *vms, qemu_irq *pic)
 {
     int i;
@@ -1544,6 +1563,8 @@ static void machvirt_init(MachineState *machine)
 
     create_pcie(vms, pic);
 
+    create_pvpanic_device(vms);
+
     create_gpio(vms, pic);
 
     /* Create mmio transports, so the user can create virtio backends
diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs
index 6d50b03..6326260 100644
--- a/hw/misc/Makefile.objs
+++ b/hw/misc/Makefile.objs
@@ -71,6 +71,7 @@ obj-$(CONFIG_IOTKIT_SYSCTL) += iotkit-sysctl.o
 obj-$(CONFIG_IOTKIT_SYSINFO) += iotkit-sysinfo.o
 
 obj-$(CONFIG_PVPANIC) += pvpanic.o
+obj-$(CONFIG_PVPANIC_MMIO) += pvpanic-mmio.o
 obj-$(CONFIG_HYPERV_TESTDEV) += hyperv_testdev.o
 obj-$(CONFIG_AUX) += auxbus.o
 obj-$(CONFIG_ASPEED_SOC) += aspeed_scu.o aspeed_sdmc.o
diff --git a/hw/misc/pvpanic-mmio.c b/hw/misc/pvpanic-mmio.c
new file mode 100644
index 0000000..c7f373e
--- /dev/null
+++ b/hw/misc/pvpanic-mmio.c
@@ -0,0 +1,76 @@
+#include "qemu/osdep.h"
+#include "sysemu/sysemu.h"
+#include "qemu/log.h"
+#include "hw/misc/pvpanic-mmio.h"
+
+#define PVPANIC_MMIO_FEAT_CRASHED      0
+
+#define PVPANIC_MMIO_CRASHED        (1 << PVPANIC_MMIO_FEAT_CRASHED)
+
+static void handle_mmio_event(int event)
+{
+    static bool logged;
+
+    if (event & ~PVPANIC_MMIO_CRASHED && !logged) {
+        qemu_log_mask(LOG_GUEST_ERROR, "pvpanic-mmio: unknown event %#x.\n", event);
+        logged = true;
+    }
+
+    if (event & PVPANIC_MMIO_CRASHED) {
+        qemu_system_guest_panicked(NULL);
+        return;
+    }
+}
+
+static uint64_t pvpanic_mmio_read(void *opaque, hwaddr addr, unsigned size)
+{
+    return -1;
+}
+
+static void pvpanic_mmio_write(void *opaque, hwaddr addr, uint64_t value,
+                                 unsigned size)
+{
+   handle_mmio_event(value);
+}
+
+static const MemoryRegionOps pvpanic_mmio_ops = {
+    .read = pvpanic_mmio_read,
+    .write = pvpanic_mmio_write,
+    .impl = {
+        .min_access_size = 1,
+        .max_access_size = 2,
+    },
+};
+
+
+static void pvpanic_mmio_initfn(Object *obj)
+{
+    PVPanicState *s = PVPANIC_MMIO_DEVICE(obj);
+    SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
+
+    memory_region_init_io(&s->mmio, OBJECT(s), &pvpanic_mmio_ops, s,
+                          "pvpanic-mmio", 2);
+    sysbus_init_mmio(sbd, &s->mmio);
+}
+
+static void pvpanic_mmio_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+
+    set_bit(DEVICE_CATEGORY_MISC, dc->categories);
+}
+
+static TypeInfo pvpanic_mmio_info = {
+    .name          = TYPE_PVPANIC_MMIO,
+    .parent        = TYPE_SYS_BUS_DEVICE,
+    .instance_size = sizeof(PVPanicState),
+    .instance_init = pvpanic_mmio_initfn,
+    .class_init    = pvpanic_mmio_class_init,
+};
+
+static void pvpanic_mmio_register_types(void)
+{
+    type_register_static(&pvpanic_mmio_info);
+}
+
+type_init(pvpanic_mmio_register_types)
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
index 4cc57a7..61cc310 100644
--- a/include/hw/arm/virt.h
+++ b/include/hw/arm/virt.h
@@ -70,6 +70,7 @@ enum {
     VIRT_MMIO,
     VIRT_RTC,
     VIRT_FW_CFG,
+    VIRT_PVPANIC_MMIO,
     VIRT_PCIE,
     VIRT_PCIE_MMIO,
     VIRT_PCIE_PIO,
diff --git a/include/hw/misc/pvpanic-mmio.h b/include/hw/misc/pvpanic-mmio.h
new file mode 100644
index 0000000..2e6bec3
--- /dev/null
+++ b/include/hw/misc/pvpanic-mmio.h
@@ -0,0 +1,12 @@
+#ifndef HW_MISC_PVPANIC_H
+#define HW_MISC_PVPANIC_H
+#include "hw/sysbus.h"
+#define TYPE_PVPANIC_MMIO "pvpanic-mmio"
+#define PVPANIC_MMIO_DEVICE(obj)    \
+    OBJECT_CHECK(PVPanicState, (obj), TYPE_PVPANIC_MMIO)
+#endif
+
+typedef struct PVPanicState {
+    SysBusDevice parent_obj;
+    MemoryRegion mmio;
+} PVPanicState;
-- 
1.8.3.1

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

* Re: [Qemu-devel] [PATCH] target/arm : add pvpanic mmio device
  2018-10-17  9:23 [Qemu-devel] [PATCH] target/arm : add pvpanic mmio device Peng Hao
  2018-10-17  1:32 ` Richard Henderson
@ 2018-10-17  9:53 ` Philippe Mathieu-Daudé
  2018-10-18  0:55   ` peng.hao2
  1 sibling, 1 reply; 7+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-10-17  9:53 UTC (permalink / raw)
  To: Peng Hao; +Cc: peter.maydell, qemu-arm, qemu-devel

Hi Peng,

On 17/10/2018 11:23, Peng Hao wrote:
> Add pvpanic mmio device that is similar to x86's pvpanic device.

> 
> Signed-off-by: Peng Hao <peng.hao2@zte.com.cn>
> ---
>  default-configs/arm-softmmu.mak |  2 +-
>  hw/arm/virt.c                   | 21 ++++++++++++
>  hw/misc/Makefile.objs           |  1 +
>  hw/misc/pvpanic-mmio.c          | 76 +++++++++++++++++++++++++++++++++++++++++
>  include/hw/arm/virt.h           |  1 +
>  include/hw/misc/pvpanic-mmio.h  | 12 +++++++
>  6 files changed, 112 insertions(+), 1 deletion(-)
>  create mode 100644 hw/misc/pvpanic-mmio.c
>  create mode 100644 include/hw/misc/pvpanic-mmio.h
> 
> diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.mak
> index 2420491..4713c92 100644
> --- a/default-configs/arm-softmmu.mak
> +++ b/default-configs/arm-softmmu.mak
> @@ -43,7 +43,7 @@ CONFIG_USB_MUSB=y
>  CONFIG_USB_EHCI_SYSBUS=y
>  CONFIG_PLATFORM_BUS=y
>  CONFIG_VIRTIO_MMIO=y
> -
> +CONFIG_PVPANIC_MMIO=y
>  CONFIG_ARM11MPCORE=y
>  CONFIG_A9MPCORE=y
>  CONFIG_A15MPCORE=y
> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
> index a472566..ab41128 100644
> --- a/hw/arm/virt.c
> +++ b/hw/arm/virt.c
> @@ -140,6 +140,7 @@ static const MemMapEntry a15memmap[] = {
>      [VIRT_UART] =               { 0x09000000, 0x00001000 },
>      [VIRT_RTC] =                { 0x09010000, 0x00001000 },
>      [VIRT_FW_CFG] =             { 0x09020000, 0x00000018 },
> +    [VIRT_PVPANIC_MMIO] =       { 0x09020018, 0x00000002 },
>      [VIRT_GPIO] =               { 0x09030000, 0x00001000 },
>      [VIRT_SECURE_UART] =        { 0x09040000, 0x00001000 },
>      [VIRT_SMMU] =               { 0x09050000, 0x00020000 },
> @@ -798,6 +799,24 @@ static void create_gpio(const VirtMachineState *vms, qemu_irq *pic)
>      g_free(nodename);
>  }
>  
> +static void create_pvpanic_device(const VirtMachineState *vms)
> +{
> +    char *nodename;
> +    hwaddr base = vms->memmap[VIRT_PVPANIC_MMIO].base;
> +    hwaddr size = vms->memmap[VIRT_PVPANIC_MMIO].size;
> +
> +    sysbus_create_simple("pvpanic-mmio", base, NULL);
> +
> +    nodename = g_strdup_printf("/pvpanic-mmio@%" PRIx64, base);
> +    qemu_fdt_add_subnode(vms->fdt, nodename);
> +    qemu_fdt_setprop_string(vms->fdt, nodename,
> +                            "compatible", "pvpanic,mmio");
> +    qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
> +                                 2, base, 2, size);
> +    g_free(nodename);
> +
> +}
> +
>  static void create_virtio_devices(const VirtMachineState *vms, qemu_irq *pic)
>  {
>      int i;
> @@ -1544,6 +1563,8 @@ static void machvirt_init(MachineState *machine)
>  
>      create_pcie(vms, pic);
>  
> +    create_pvpanic_device(vms);
> +
>      create_gpio(vms, pic);
>  
>      /* Create mmio transports, so the user can create virtio backends
> diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs
> index 6d50b03..6326260 100644
> --- a/hw/misc/Makefile.objs
> +++ b/hw/misc/Makefile.objs
> @@ -71,6 +71,7 @@ obj-$(CONFIG_IOTKIT_SYSCTL) += iotkit-sysctl.o
>  obj-$(CONFIG_IOTKIT_SYSINFO) += iotkit-sysinfo.o
>  
>  obj-$(CONFIG_PVPANIC) += pvpanic.o
> +obj-$(CONFIG_PVPANIC_MMIO) += pvpanic-mmio.o
>  obj-$(CONFIG_HYPERV_TESTDEV) += hyperv_testdev.o
>  obj-$(CONFIG_AUX) += auxbus.o
>  obj-$(CONFIG_ASPEED_SOC) += aspeed_scu.o aspeed_sdmc.o
> diff --git a/hw/misc/pvpanic-mmio.c b/hw/misc/pvpanic-mmio.c
> new file mode 100644
> index 0000000..c7f373e
> --- /dev/null
> +++ b/hw/misc/pvpanic-mmio.c
> @@ -0,0 +1,76 @@
> +#include "qemu/osdep.h"
> +#include "sysemu/sysemu.h"
> +#include "qemu/log.h"
> +#include "hw/misc/pvpanic-mmio.h"
> +
> +#define PVPANIC_MMIO_FEAT_CRASHED      0
> +
> +#define PVPANIC_MMIO_CRASHED        (1 << PVPANIC_MMIO_FEAT_CRASHED)
> +
> +static void handle_mmio_event(int event)
> +{
> +    static bool logged;
> +
> +    if (event & ~PVPANIC_MMIO_CRASHED && !logged) {
> +        qemu_log_mask(LOG_GUEST_ERROR, "pvpanic-mmio: unknown event %#x.\n", event);
> +        logged = true;
> +    }
> +
> +    if (event & PVPANIC_MMIO_CRASHED) {
> +        qemu_system_guest_panicked(NULL);
> +        return;
> +    }

It would be easier to maintain a single pvpanic device. There is no
improvement here, it is the same handler than 'pvpanic.c'.

The current pvpanic device is not x86-only, it only implements the
ioport API.
If you want to use the mmio API, please add it there.
Basically you don't have to write any more code that in this patch, but
just move it in the pvpanic.c file.

Thanks,

Phil.

> +}
> +
> +static uint64_t pvpanic_mmio_read(void *opaque, hwaddr addr, unsigned size)
> +{
> +    return -1;
> +}
> +
> +static void pvpanic_mmio_write(void *opaque, hwaddr addr, uint64_t value,
> +                                 unsigned size)
> +{
> +   handle_mmio_event(value);
> +}
> +
> +static const MemoryRegionOps pvpanic_mmio_ops = {
> +    .read = pvpanic_mmio_read,
> +    .write = pvpanic_mmio_write,
> +    .impl = {
> +        .min_access_size = 1,
> +        .max_access_size = 2,
> +    },
> +};
> +
> +
> +static void pvpanic_mmio_initfn(Object *obj)
> +{
> +    PVPanicState *s = PVPANIC_MMIO_DEVICE(obj);
> +    SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
> +
> +    memory_region_init_io(&s->mmio, OBJECT(s), &pvpanic_mmio_ops, s,
> +                          "pvpanic-mmio", 2);
> +    sysbus_init_mmio(sbd, &s->mmio);
> +}
> +
> +static void pvpanic_mmio_class_init(ObjectClass *klass, void *data)
> +{
> +    DeviceClass *dc = DEVICE_CLASS(klass);
> +
> +    set_bit(DEVICE_CATEGORY_MISC, dc->categories);
> +}
> +
> +static TypeInfo pvpanic_mmio_info = {
> +    .name          = TYPE_PVPANIC_MMIO,
> +    .parent        = TYPE_SYS_BUS_DEVICE,
> +    .instance_size = sizeof(PVPanicState),
> +    .instance_init = pvpanic_mmio_initfn,
> +    .class_init    = pvpanic_mmio_class_init,
> +};
> +
> +static void pvpanic_mmio_register_types(void)
> +{
> +    type_register_static(&pvpanic_mmio_info);
> +}
> +
> +type_init(pvpanic_mmio_register_types)
> diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
> index 4cc57a7..61cc310 100644
> --- a/include/hw/arm/virt.h
> +++ b/include/hw/arm/virt.h
> @@ -70,6 +70,7 @@ enum {
>      VIRT_MMIO,
>      VIRT_RTC,
>      VIRT_FW_CFG,
> +    VIRT_PVPANIC_MMIO,
>      VIRT_PCIE,
>      VIRT_PCIE_MMIO,
>      VIRT_PCIE_PIO,
> diff --git a/include/hw/misc/pvpanic-mmio.h b/include/hw/misc/pvpanic-mmio.h
> new file mode 100644
> index 0000000..2e6bec3
> --- /dev/null
> +++ b/include/hw/misc/pvpanic-mmio.h
> @@ -0,0 +1,12 @@
> +#ifndef HW_MISC_PVPANIC_H
> +#define HW_MISC_PVPANIC_H
> +#include "hw/sysbus.h"
> +#define TYPE_PVPANIC_MMIO "pvpanic-mmio"
> +#define PVPANIC_MMIO_DEVICE(obj)    \
> +    OBJECT_CHECK(PVPanicState, (obj), TYPE_PVPANIC_MMIO)
> +#endif
> +
> +typedef struct PVPanicState {
> +    SysBusDevice parent_obj;
> +    MemoryRegion mmio;
> +} PVPanicState;
> 

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

* Re: [Qemu-devel] [PATCH] target/arm : add pvpanic mmio device
  2018-10-17  9:53 ` Philippe Mathieu-Daudé
@ 2018-10-18  0:55   ` peng.hao2
  2018-10-18 12:49     ` Philippe Mathieu-Daudé
  0 siblings, 1 reply; 7+ messages in thread
From: peng.hao2 @ 2018-10-18  0:55 UTC (permalink / raw)
  To: philmd; +Cc: peter.maydell, qemu-arm, qemu-devel

>Hi Peng,
>
>On 17/10/2018 11:23, Peng Hao wrote:
>> Add pvpanic mmio device that is similar to x86's pvpanic device.
>
>>
>> Signed-off-by: Peng Hao <peng.hao2@zte.com.cn>
>> ---
>>  default-configs/arm-softmmu.mak |  2 +-
>>  hw/arm/virt.c                   | 21 ++++++++++++
>>  hw/misc/Makefile.objs           |  1 +
>>  hw/misc/pvpanic-mmio.c          | 76 +++++++++++++++++++++++++++++++++++++++++
>>  include/hw/arm/virt.h           |  1 +
>>  include/hw/misc/pvpanic-mmio.h  | 12 +++++++
>>  6 files changed, 112 insertions(+), 1 deletion(-)
>>  create mode 100644 hw/misc/pvpanic-mmio.c
>>  create mode 100644 include/hw/misc/pvpanic-mmio.h
>>
>> diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.mak
>> index 2420491..4713c92 100644
>> --- a/default-configs/arm-softmmu.mak
>> +++ b/default-configs/arm-softmmu.mak
>> @@ -43,7 +43,7 @@ CONFIG_USB_MUSB=y
>>  CONFIG_USB_EHCI_SYSBUS=y
>>  CONFIG_PLATFORM_BUS=y
>>  CONFIG_VIRTIO_MMIO=y
>> -
>> +CONFIG_PVPANIC_MMIO=y
>>  CONFIG_ARM11MPCORE=y
>>  CONFIG_A9MPCORE=y
>>  CONFIG_A15MPCORE=y
>> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
>> index a472566..ab41128 100644
>> --- a/hw/arm/virt.c
>> +++ b/hw/arm/virt.c
>> @@ -140,6 +140,7 @@ static const MemMapEntry a15memmap[] = {
>>      [VIRT_UART] =               { 0x09000000, 0x00001000 },
>>      [VIRT_RTC] =                { 0x09010000, 0x00001000 },
>>      [VIRT_FW_CFG] =             { 0x09020000, 0x00000018 },
>> +    [VIRT_PVPANIC_MMIO] =       { 0x09020018, 0x00000002 },
>>      [VIRT_GPIO] =               { 0x09030000, 0x00001000 },
>>      [VIRT_SECURE_UART] =        { 0x09040000, 0x00001000 },
>>      [VIRT_SMMU] =               { 0x09050000, 0x00020000 },
>> @@ -798,6 +799,24 @@ static void create_gpio(const VirtMachineState *vms, qemu_irq *pic)
>>      g_free(nodename);
>>  }
>>
>> +static void create_pvpanic_device(const VirtMachineState *vms)
>> +{
>> +    char *nodename;
>> +    hwaddr base = vms->memmap[VIRT_PVPANIC_MMIO].base;
>> +    hwaddr size = vms->memmap[VIRT_PVPANIC_MMIO].size;
>> +
>> +    sysbus_create_simple("pvpanic-mmio", base, NULL);
>> +
>> +    nodename = g_strdup_printf("/pvpanic-mmio@%" PRIx64, base);
>> +    qemu_fdt_add_subnode(vms->fdt, nodename);
>> +    qemu_fdt_setprop_string(vms->fdt, nodename,
>> +                            "compatible", "pvpanic,mmio");
>> +    qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
>> +                                 2, base, 2, size);
>> +    g_free(nodename);
>> +
>> +}
>> +
>>  static void create_virtio_devices(const VirtMachineState *vms, qemu_irq *pic)
>>  {
>>      int i;
>> @@ -1544,6 +1563,8 @@ static void machvirt_init(MachineState *machine)
>>
>>      create_pcie(vms, pic);
>>
>> +    create_pvpanic_device(vms);
>> +
>>      create_gpio(vms, pic);
>>
>>      /* Create mmio transports, so the user can create virtio backends
>> diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs
>> index 6d50b03..6326260 100644
>> --- a/hw/misc/Makefile.objs
>> +++ b/hw/misc/Makefile.objs
>> @@ -71,6 +71,7 @@ obj-$(CONFIG_IOTKIT_SYSCTL) += iotkit-sysctl.o
>>  obj-$(CONFIG_IOTKIT_SYSINFO) += iotkit-sysinfo.o
>>
>>  obj-$(CONFIG_PVPANIC) += pvpanic.o
>> +obj-$(CONFIG_PVPANIC_MMIO) += pvpanic-mmio.o
>>  obj-$(CONFIG_HYPERV_TESTDEV) += hyperv_testdev.o
>>  obj-$(CONFIG_AUX) += auxbus.o
>>  obj-$(CONFIG_ASPEED_SOC) += aspeed_scu.o aspeed_sdmc.o
>> diff --git a/hw/misc/pvpanic-mmio.c b/hw/misc/pvpanic-mmio.c
>> new file mode 100644
>> index 0000000..c7f373e
>> --- /dev/null
>> +++ b/hw/misc/pvpanic-mmio.c
>> @@ -0,0 +1,76 @@
>> +#include "qemu/osdep.h"
>> +#include "sysemu/sysemu.h"
>> +#include "qemu/log.h"
>> +#include "hw/misc/pvpanic-mmio.h"
>> +
>> +#define PVPANIC_MMIO_FEAT_CRASHED      0
>> +
>> +#define PVPANIC_MMIO_CRASHED        (1 << PVPANIC_MMIO_FEAT_CRASHED)
>> +
>> +static void handle_mmio_event(int event)
>> +{
>> +    static bool logged;
>> +
>> +    if (event & ~PVPANIC_MMIO_CRASHED && !logged) {
>> +        qemu_log_mask(LOG_GUEST_ERROR, "pvpanic-mmio: unknown event %#x.\n", event);
>> +        logged = true;
>> +    }
>> +
>> +    if (event & PVPANIC_MMIO_CRASHED) {
>> +        qemu_system_guest_panicked(NULL);
>> +        return;
>> +    }
>
>It would be easier to maintain a single pvpanic device. There is no
>improvement here, it is the same handler than 'pvpanic.c'.
>
>The current pvpanic device is not x86-only, it only implements the
>ioport API.
But in linux kernel the driver of pvpanic device is x86-only.

>If you want to use the mmio API, please add it there.
>Basically you don't have to write any more code that in this patch, but
>just move it in the pvpanic.c file.
I want to use pvpanic directly instead of adding a new device emulation.
But I can't use it. Firstly pvpanic use ioport, but arm don't support ioport.
secondly pvpanic device is emulated as a isa bus device, but arm don't support
isa bus.
thirdly the realization of pvpanic device is depends on ACPI in linux kernel driver and in qemu
the port info is passed through ACPI , but It is not necessary to configure ACPI for arm guest. 

Thanks.
>
>Thanks,
>
>Phil.

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

* Re: [Qemu-devel] [PATCH] target/arm : add pvpanic mmio device
  2018-10-18  0:55   ` peng.hao2
@ 2018-10-18 12:49     ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 7+ messages in thread
From: Philippe Mathieu-Daudé @ 2018-10-18 12:49 UTC (permalink / raw)
  To: peng.hao2; +Cc: peter.maydell, qemu-arm, qemu-devel

On 18/10/2018 02:55, peng.hao2@zte.com.cn wrote:
>> Hi Peng,
>>
>> On 17/10/2018 11:23, Peng Hao wrote:
>>> Add pvpanic mmio device that is similar to x86's pvpanic device.
>>
>>>
>>> Signed-off-by: Peng Hao <peng.hao2@zte.com.cn>
>>> ---
>>>  default-configs/arm-softmmu.mak |  2 +-
>>>  hw/arm/virt.c                   | 21 ++++++++++++
>>>  hw/misc/Makefile.objs           |  1 +
>>>  hw/misc/pvpanic-mmio.c          | 76 +++++++++++++++++++++++++++++++++++++++++
>>>  include/hw/arm/virt.h           |  1 +
>>>  include/hw/misc/pvpanic-mmio.h  | 12 +++++++
>>>  6 files changed, 112 insertions(+), 1 deletion(-)
>>>  create mode 100644 hw/misc/pvpanic-mmio.c
>>>  create mode 100644 include/hw/misc/pvpanic-mmio.h
>>>
>>> diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.mak
>>> index 2420491..4713c92 100644
>>> --- a/default-configs/arm-softmmu.mak
>>> +++ b/default-configs/arm-softmmu.mak
>>> @@ -43,7 +43,7 @@ CONFIG_USB_MUSB=y
>>>  CONFIG_USB_EHCI_SYSBUS=y
>>>  CONFIG_PLATFORM_BUS=y
>>>  CONFIG_VIRTIO_MMIO=y
>>> -
>>> +CONFIG_PVPANIC_MMIO=y
>>>  CONFIG_ARM11MPCORE=y
>>>  CONFIG_A9MPCORE=y
>>>  CONFIG_A15MPCORE=y
>>> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
>>> index a472566..ab41128 100644
>>> --- a/hw/arm/virt.c
>>> +++ b/hw/arm/virt.c
>>> @@ -140,6 +140,7 @@ static const MemMapEntry a15memmap[] = {
>>>      [VIRT_UART] =               { 0x09000000, 0x00001000 },
>>>      [VIRT_RTC] =                { 0x09010000, 0x00001000 },
>>>      [VIRT_FW_CFG] =             { 0x09020000, 0x00000018 },
>>> +    [VIRT_PVPANIC_MMIO] =       { 0x09020018, 0x00000002 },
>>>      [VIRT_GPIO] =               { 0x09030000, 0x00001000 },
>>>      [VIRT_SECURE_UART] =        { 0x09040000, 0x00001000 },
>>>      [VIRT_SMMU] =               { 0x09050000, 0x00020000 },
>>> @@ -798,6 +799,24 @@ static void create_gpio(const VirtMachineState *vms, qemu_irq *pic)
>>>      g_free(nodename);
>>>  }
>>>
>>> +static void create_pvpanic_device(const VirtMachineState *vms)
>>> +{
>>> +    char *nodename;
>>> +    hwaddr base = vms->memmap[VIRT_PVPANIC_MMIO].base;
>>> +    hwaddr size = vms->memmap[VIRT_PVPANIC_MMIO].size;
>>> +
>>> +    sysbus_create_simple("pvpanic-mmio", base, NULL);
>>> +
>>> +    nodename = g_strdup_printf("/pvpanic-mmio@%" PRIx64, base);
>>> +    qemu_fdt_add_subnode(vms->fdt, nodename);
>>> +    qemu_fdt_setprop_string(vms->fdt, nodename,
>>> +                            "compatible", "pvpanic,mmio");
>>> +    qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
>>> +                                 2, base, 2, size);
>>> +    g_free(nodename);
>>> +
>>> +}
>>> +
>>>  static void create_virtio_devices(const VirtMachineState *vms, qemu_irq *pic)
>>>  {
>>>      int i;
>>> @@ -1544,6 +1563,8 @@ static void machvirt_init(MachineState *machine)
>>>
>>>      create_pcie(vms, pic);
>>>
>>> +    create_pvpanic_device(vms);
>>> +
>>>      create_gpio(vms, pic);
>>>
>>>      /* Create mmio transports, so the user can create virtio backends
>>> diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs
>>> index 6d50b03..6326260 100644
>>> --- a/hw/misc/Makefile.objs
>>> +++ b/hw/misc/Makefile.objs
>>> @@ -71,6 +71,7 @@ obj-$(CONFIG_IOTKIT_SYSCTL) += iotkit-sysctl.o
>>>  obj-$(CONFIG_IOTKIT_SYSINFO) += iotkit-sysinfo.o
>>>
>>>  obj-$(CONFIG_PVPANIC) += pvpanic.o
>>> +obj-$(CONFIG_PVPANIC_MMIO) += pvpanic-mmio.o
>>>  obj-$(CONFIG_HYPERV_TESTDEV) += hyperv_testdev.o
>>>  obj-$(CONFIG_AUX) += auxbus.o
>>>  obj-$(CONFIG_ASPEED_SOC) += aspeed_scu.o aspeed_sdmc.o
>>> diff --git a/hw/misc/pvpanic-mmio.c b/hw/misc/pvpanic-mmio.c
>>> new file mode 100644
>>> index 0000000..c7f373e
>>> --- /dev/null
>>> +++ b/hw/misc/pvpanic-mmio.c
>>> @@ -0,0 +1,76 @@
>>> +#include "qemu/osdep.h"
>>> +#include "sysemu/sysemu.h"
>>> +#include "qemu/log.h"
>>> +#include "hw/misc/pvpanic-mmio.h"
>>> +
>>> +#define PVPANIC_MMIO_FEAT_CRASHED      0
>>> +
>>> +#define PVPANIC_MMIO_CRASHED        (1 << PVPANIC_MMIO_FEAT_CRASHED)
>>> +
>>> +static void handle_mmio_event(int event)
>>> +{
>>> +    static bool logged;
>>> +
>>> +    if (event & ~PVPANIC_MMIO_CRASHED && !logged) {
>>> +        qemu_log_mask(LOG_GUEST_ERROR, "pvpanic-mmio: unknown event %#x.\n", event);
>>> +        logged = true;
>>> +    }
>>> +
>>> +    if (event & PVPANIC_MMIO_CRASHED) {
>>> +        qemu_system_guest_panicked(NULL);
>>> +        return;
>>> +    }
>>
>> It would be easier to maintain a single pvpanic device. There is no
>> improvement here, it is the same handler than 'pvpanic.c'.
>>
>> The current pvpanic device is not x86-only, it only implements the
>> ioport API.
> But in linux kernel the driver of pvpanic device is x86-only.
> 
>> If you want to use the mmio API, please add it there.
>> Basically you don't have to write any more code that in this patch, but
>> just move it in the pvpanic.c file.
> I want to use pvpanic directly instead of adding a new device emulation.
> But I can't use it. Firstly pvpanic use ioport, but arm don't support ioport.
> secondly pvpanic device is emulated as a isa bus device, but arm don't support
> isa bus.

I tried to explain how to do it, but it was easier to just refactor your
patch to show what I was expecting, so I'll send a series instead.

> thirdly the realization of pvpanic device is depends on ACPI in linux kernel driver and in qemu
> the port info is passed through ACPI , but It is not necessary to configure ACPI for arm guest. 
> 
> Thanks.
>>
>> Thanks,
>>
>> Phil.

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

* [Qemu-devel] [PATCH]  target/arm : add pvpanic mmio device
@ 2018-10-17  9:20 Peng Hao
  0 siblings, 0 replies; 7+ messages in thread
From: Peng Hao @ 2018-10-17  9:20 UTC (permalink / raw)
  To: peter.maydell; +Cc: qemu-devel, qemu-arm, root, Peng Hao

From: root <root@host121.localdomain>

Add pvpanic mmio device that is similar to x86's pvpanic device.

Signed-off-by: Peng Hao <peng.hao2@zte.com.cn>
---
 default-configs/arm-softmmu.mak |  2 +-
 hw/arm/virt.c                   | 21 ++++++++++++
 hw/misc/Makefile.objs           |  1 +
 hw/misc/pvpanic-mmio.c          | 76 +++++++++++++++++++++++++++++++++++++++++
 include/hw/arm/virt.h           |  1 +
 include/hw/misc/pvpanic-mmio.h  | 12 +++++++
 6 files changed, 112 insertions(+), 1 deletion(-)
 create mode 100644 hw/misc/pvpanic-mmio.c
 create mode 100644 include/hw/misc/pvpanic-mmio.h

diff --git a/default-configs/arm-softmmu.mak b/default-configs/arm-softmmu.mak
index 2420491..4713c92 100644
--- a/default-configs/arm-softmmu.mak
+++ b/default-configs/arm-softmmu.mak
@@ -43,7 +43,7 @@ CONFIG_USB_MUSB=y
 CONFIG_USB_EHCI_SYSBUS=y
 CONFIG_PLATFORM_BUS=y
 CONFIG_VIRTIO_MMIO=y
-
+CONFIG_PVPANIC_MMIO=y
 CONFIG_ARM11MPCORE=y
 CONFIG_A9MPCORE=y
 CONFIG_A15MPCORE=y
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index a472566..ab41128 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -140,6 +140,7 @@ static const MemMapEntry a15memmap[] = {
     [VIRT_UART] =               { 0x09000000, 0x00001000 },
     [VIRT_RTC] =                { 0x09010000, 0x00001000 },
     [VIRT_FW_CFG] =             { 0x09020000, 0x00000018 },
+    [VIRT_PVPANIC_MMIO] =       { 0x09020018, 0x00000002 },
     [VIRT_GPIO] =               { 0x09030000, 0x00001000 },
     [VIRT_SECURE_UART] =        { 0x09040000, 0x00001000 },
     [VIRT_SMMU] =               { 0x09050000, 0x00020000 },
@@ -798,6 +799,24 @@ static void create_gpio(const VirtMachineState *vms, qemu_irq *pic)
     g_free(nodename);
 }
 
+static void create_pvpanic_device(const VirtMachineState *vms)
+{
+    char *nodename;
+    hwaddr base = vms->memmap[VIRT_PVPANIC_MMIO].base;
+    hwaddr size = vms->memmap[VIRT_PVPANIC_MMIO].size;
+
+    sysbus_create_simple("pvpanic-mmio", base, NULL);
+
+    nodename = g_strdup_printf("/pvpanic-mmio@%" PRIx64, base);
+    qemu_fdt_add_subnode(vms->fdt, nodename);
+    qemu_fdt_setprop_string(vms->fdt, nodename,
+                            "compatible", "pvpanic,mmio");
+    qemu_fdt_setprop_sized_cells(vms->fdt, nodename, "reg",
+                                 2, base, 2, size);
+    g_free(nodename);
+
+}
+
 static void create_virtio_devices(const VirtMachineState *vms, qemu_irq *pic)
 {
     int i;
@@ -1544,6 +1563,8 @@ static void machvirt_init(MachineState *machine)
 
     create_pcie(vms, pic);
 
+    create_pvpanic_device(vms);
+
     create_gpio(vms, pic);
 
     /* Create mmio transports, so the user can create virtio backends
diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs
index 6d50b03..6326260 100644
--- a/hw/misc/Makefile.objs
+++ b/hw/misc/Makefile.objs
@@ -71,6 +71,7 @@ obj-$(CONFIG_IOTKIT_SYSCTL) += iotkit-sysctl.o
 obj-$(CONFIG_IOTKIT_SYSINFO) += iotkit-sysinfo.o
 
 obj-$(CONFIG_PVPANIC) += pvpanic.o
+obj-$(CONFIG_PVPANIC_MMIO) += pvpanic-mmio.o
 obj-$(CONFIG_HYPERV_TESTDEV) += hyperv_testdev.o
 obj-$(CONFIG_AUX) += auxbus.o
 obj-$(CONFIG_ASPEED_SOC) += aspeed_scu.o aspeed_sdmc.o
diff --git a/hw/misc/pvpanic-mmio.c b/hw/misc/pvpanic-mmio.c
new file mode 100644
index 0000000..c7f373e
--- /dev/null
+++ b/hw/misc/pvpanic-mmio.c
@@ -0,0 +1,76 @@
+#include "qemu/osdep.h"
+#include "sysemu/sysemu.h"
+#include "qemu/log.h"
+#include "hw/misc/pvpanic-mmio.h"
+
+#define PVPANIC_MMIO_FEAT_CRASHED      0
+
+#define PVPANIC_MMIO_CRASHED        (1 << PVPANIC_MMIO_FEAT_CRASHED)
+
+static void handle_mmio_event(int event)
+{
+    static bool logged;
+
+    if (event & ~PVPANIC_MMIO_CRASHED && !logged) {
+        qemu_log_mask(LOG_GUEST_ERROR, "pvpanic-mmio: unknown event %#x.\n", event);
+        logged = true;
+    }
+
+    if (event & PVPANIC_MMIO_CRASHED) {
+        qemu_system_guest_panicked(NULL);
+        return;
+    }
+}
+
+static uint64_t pvpanic_mmio_read(void *opaque, hwaddr addr, unsigned size)
+{
+    return -1;
+}
+
+static void pvpanic_mmio_write(void *opaque, hwaddr addr, uint64_t value,
+                                 unsigned size)
+{
+   handle_mmio_event(value);
+}
+
+static const MemoryRegionOps pvpanic_mmio_ops = {
+    .read = pvpanic_mmio_read,
+    .write = pvpanic_mmio_write,
+    .impl = {
+        .min_access_size = 1,
+        .max_access_size = 2,
+    },
+};
+
+
+static void pvpanic_mmio_initfn(Object *obj)
+{
+    PVPanicState *s = PVPANIC_MMIO_DEVICE(obj);
+    SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
+
+    memory_region_init_io(&s->mmio, OBJECT(s), &pvpanic_mmio_ops, s,
+                          "pvpanic-mmio", 2);
+    sysbus_init_mmio(sbd, &s->mmio);
+}
+
+static void pvpanic_mmio_class_init(ObjectClass *klass, void *data)
+{
+    DeviceClass *dc = DEVICE_CLASS(klass);
+
+    set_bit(DEVICE_CATEGORY_MISC, dc->categories);
+}
+
+static TypeInfo pvpanic_mmio_info = {
+    .name          = TYPE_PVPANIC_MMIO,
+    .parent        = TYPE_SYS_BUS_DEVICE,
+    .instance_size = sizeof(PVPanicState),
+    .instance_init = pvpanic_mmio_initfn,
+    .class_init    = pvpanic_mmio_class_init,
+};
+
+static void pvpanic_mmio_register_types(void)
+{
+    type_register_static(&pvpanic_mmio_info);
+}
+
+type_init(pvpanic_mmio_register_types)
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
index 4cc57a7..61cc310 100644
--- a/include/hw/arm/virt.h
+++ b/include/hw/arm/virt.h
@@ -70,6 +70,7 @@ enum {
     VIRT_MMIO,
     VIRT_RTC,
     VIRT_FW_CFG,
+    VIRT_PVPANIC_MMIO,
     VIRT_PCIE,
     VIRT_PCIE_MMIO,
     VIRT_PCIE_PIO,
diff --git a/include/hw/misc/pvpanic-mmio.h b/include/hw/misc/pvpanic-mmio.h
new file mode 100644
index 0000000..2e6bec3
--- /dev/null
+++ b/include/hw/misc/pvpanic-mmio.h
@@ -0,0 +1,12 @@
+#ifndef HW_MISC_PVPANIC_H
+#define HW_MISC_PVPANIC_H
+#include "hw/sysbus.h"
+#define TYPE_PVPANIC_MMIO "pvpanic-mmio"
+#define PVPANIC_MMIO_DEVICE(obj)    \
+    OBJECT_CHECK(PVPanicState, (obj), TYPE_PVPANIC_MMIO)
+#endif
+
+typedef struct PVPanicState {
+    SysBusDevice parent_obj;
+    MemoryRegion mmio;
+} PVPanicState;
-- 
1.8.3.1

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

end of thread, other threads:[~2018-10-18 12:49 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-10-17  9:23 [Qemu-devel] [PATCH] target/arm : add pvpanic mmio device Peng Hao
2018-10-17  1:32 ` Richard Henderson
2018-10-17  1:39   ` peng.hao2
2018-10-17  9:53 ` Philippe Mathieu-Daudé
2018-10-18  0:55   ` peng.hao2
2018-10-18 12:49     ` Philippe Mathieu-Daudé
  -- strict thread matches above, loose matches on Subject: below --
2018-10-17  9:20 Peng Hao

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.