diff mbox series

[v5,01/10] hw/virtio: Factorize virtio-mmio headers

Message ID 20191002113103.45023-2-slp@redhat.com
State New
Headers show
Series Introduce the microvm machine type | expand

Commit Message

Sergio Lopez Oct. 2, 2019, 11:30 a.m. UTC
Put QOM and main struct definition in a separate header file, so it
can be accessed from other components.

Signed-off-by: Sergio Lopez <slp@redhat.com>
---
 hw/virtio/virtio-mmio.c         | 48 +---------------------
 include/hw/virtio/virtio-mmio.h | 73 +++++++++++++++++++++++++++++++++
 2 files changed, 74 insertions(+), 47 deletions(-)
 create mode 100644 include/hw/virtio/virtio-mmio.h

Comments

Philippe Mathieu-Daudé Oct. 3, 2019, 10:15 a.m. UTC | #1
On 10/2/19 1:30 PM, Sergio Lopez wrote:
> Put QOM and main struct definition in a separate header file, so it
> can be accessed from other components.
> 
> Signed-off-by: Sergio Lopez <slp@redhat.com>
> ---
>   hw/virtio/virtio-mmio.c         | 48 +---------------------
>   include/hw/virtio/virtio-mmio.h | 73 +++++++++++++++++++++++++++++++++
>   2 files changed, 74 insertions(+), 47 deletions(-)
>   create mode 100644 include/hw/virtio/virtio-mmio.h
> 
> diff --git a/hw/virtio/virtio-mmio.c b/hw/virtio/virtio-mmio.c
> index 3d5ca0f667..94d934c44b 100644
> --- a/hw/virtio/virtio-mmio.c
> +++ b/hw/virtio/virtio-mmio.c
> @@ -29,57 +29,11 @@
>   #include "qemu/host-utils.h"
>   #include "qemu/module.h"
>   #include "sysemu/kvm.h"
> -#include "hw/virtio/virtio-bus.h"
> +#include "hw/virtio/virtio-mmio.h"
>   #include "qemu/error-report.h"
>   #include "qemu/log.h"
>   #include "trace.h"
>   
> -/* QOM macros */
> -/* virtio-mmio-bus */
> -#define TYPE_VIRTIO_MMIO_BUS "virtio-mmio-bus"
> -#define VIRTIO_MMIO_BUS(obj) \
> -        OBJECT_CHECK(VirtioBusState, (obj), TYPE_VIRTIO_MMIO_BUS)
> -#define VIRTIO_MMIO_BUS_GET_CLASS(obj) \
> -        OBJECT_GET_CLASS(VirtioBusClass, (obj), TYPE_VIRTIO_MMIO_BUS)
> -#define VIRTIO_MMIO_BUS_CLASS(klass) \
> -        OBJECT_CLASS_CHECK(VirtioBusClass, (klass), TYPE_VIRTIO_MMIO_BUS)
> -
> -/* virtio-mmio */
> -#define TYPE_VIRTIO_MMIO "virtio-mmio"
> -#define VIRTIO_MMIO(obj) \
> -        OBJECT_CHECK(VirtIOMMIOProxy, (obj), TYPE_VIRTIO_MMIO)
> -
> -#define VIRT_MAGIC 0x74726976 /* 'virt' */
> -#define VIRT_VERSION 2
> -#define VIRT_VERSION_LEGACY 1
> -#define VIRT_VENDOR 0x554D4551 /* 'QEMU' */
> -
> -typedef struct VirtIOMMIOQueue {
> -    uint16_t num;
> -    bool enabled;
> -    uint32_t desc[2];
> -    uint32_t avail[2];
> -    uint32_t used[2];
> -} VirtIOMMIOQueue;
> -
> -typedef struct {
> -    /* Generic */
> -    SysBusDevice parent_obj;
> -    MemoryRegion iomem;
> -    qemu_irq irq;
> -    bool legacy;
> -    /* Guest accessible state needing migration and reset */
> -    uint32_t host_features_sel;
> -    uint32_t guest_features_sel;
> -    uint32_t guest_page_shift;
> -    /* virtio-bus */
> -    VirtioBusState bus;
> -    bool format_transport_address;
> -    /* Fields only used for non-legacy (v2) devices */
> -    uint32_t guest_features[2];
> -    VirtIOMMIOQueue vqs[VIRTIO_QUEUE_MAX];
> -} VirtIOMMIOProxy;
> -
>   static bool virtio_mmio_ioeventfd_enabled(DeviceState *d)
>   {
>       return kvm_eventfds_enabled();
> diff --git a/include/hw/virtio/virtio-mmio.h b/include/hw/virtio/virtio-mmio.h
> new file mode 100644
> index 0000000000..c8a6ef20de
> --- /dev/null
> +++ b/include/hw/virtio/virtio-mmio.h
> @@ -0,0 +1,73 @@
> +/*
> + * Virtio MMIO bindings
> + *
> + * Copyright (c) 2011 Linaro Limited
> + *
> + * Author:
> + *  Peter Maydell <peter.maydell@linaro.org>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License; either version 2
> + * of the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License along
> + * with this program; if not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#ifndef QEMU_VIRTIO_MMIO_H
> +#define QEMU_VIRTIO_MMIO_H

I'd rather use HW_VIRTIO_MMIO_H

Regardless:
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> +
> +#include "hw/virtio/virtio-bus.h"
> +
> +/* QOM macros */
> +/* virtio-mmio-bus */
> +#define TYPE_VIRTIO_MMIO_BUS "virtio-mmio-bus"
> +#define VIRTIO_MMIO_BUS(obj) \
> +        OBJECT_CHECK(VirtioBusState, (obj), TYPE_VIRTIO_MMIO_BUS)
> +#define VIRTIO_MMIO_BUS_GET_CLASS(obj) \
> +        OBJECT_GET_CLASS(VirtioBusClass, (obj), TYPE_VIRTIO_MMIO_BUS)
> +#define VIRTIO_MMIO_BUS_CLASS(klass) \
> +        OBJECT_CLASS_CHECK(VirtioBusClass, (klass), TYPE_VIRTIO_MMIO_BUS)
> +
> +/* virtio-mmio */
> +#define TYPE_VIRTIO_MMIO "virtio-mmio"
> +#define VIRTIO_MMIO(obj) \
> +        OBJECT_CHECK(VirtIOMMIOProxy, (obj), TYPE_VIRTIO_MMIO)
> +
> +#define VIRT_MAGIC 0x74726976 /* 'virt' */
> +#define VIRT_VERSION 2
> +#define VIRT_VERSION_LEGACY 1
> +#define VIRT_VENDOR 0x554D4551 /* 'QEMU' */
> +
> +typedef struct VirtIOMMIOQueue {
> +    uint16_t num;
> +    bool enabled;
> +    uint32_t desc[2];
> +    uint32_t avail[2];
> +    uint32_t used[2];
> +} VirtIOMMIOQueue;
> +
> +typedef struct {
> +    /* Generic */
> +    SysBusDevice parent_obj;
> +    MemoryRegion iomem;
> +    qemu_irq irq;
> +    bool legacy;
> +    /* Guest accessible state needing migration and reset */
> +    uint32_t host_features_sel;
> +    uint32_t guest_features_sel;
> +    uint32_t guest_page_shift;
> +    /* virtio-bus */
> +    VirtioBusState bus;
> +    bool format_transport_address;
> +    /* Fields only used for non-legacy (v2) devices */
> +    uint32_t guest_features[2];
> +    VirtIOMMIOQueue vqs[VIRTIO_QUEUE_MAX];
> +} VirtIOMMIOProxy;
> +
> +#endif
>
Sergio Lopez Oct. 3, 2019, 11:26 a.m. UTC | #2
Philippe Mathieu-Daudé <philmd@redhat.com> writes:

> On 10/2/19 1:30 PM, Sergio Lopez wrote:
>> Put QOM and main struct definition in a separate header file, so it
>> can be accessed from other components.
>>
>> Signed-off-by: Sergio Lopez <slp@redhat.com>
>> ---
>>   hw/virtio/virtio-mmio.c         | 48 +---------------------
>>   include/hw/virtio/virtio-mmio.h | 73 +++++++++++++++++++++++++++++++++
>>   2 files changed, 74 insertions(+), 47 deletions(-)
>>   create mode 100644 include/hw/virtio/virtio-mmio.h
>>
>> diff --git a/hw/virtio/virtio-mmio.c b/hw/virtio/virtio-mmio.c
>> index 3d5ca0f667..94d934c44b 100644
>> --- a/hw/virtio/virtio-mmio.c
>> +++ b/hw/virtio/virtio-mmio.c
>> @@ -29,57 +29,11 @@
>>   #include "qemu/host-utils.h"
>>   #include "qemu/module.h"
>>   #include "sysemu/kvm.h"
>> -#include "hw/virtio/virtio-bus.h"
>> +#include "hw/virtio/virtio-mmio.h"
>>   #include "qemu/error-report.h"
>>   #include "qemu/log.h"
>>   #include "trace.h"
>>   -/* QOM macros */
>> -/* virtio-mmio-bus */
>> -#define TYPE_VIRTIO_MMIO_BUS "virtio-mmio-bus"
>> -#define VIRTIO_MMIO_BUS(obj) \
>> -        OBJECT_CHECK(VirtioBusState, (obj), TYPE_VIRTIO_MMIO_BUS)
>> -#define VIRTIO_MMIO_BUS_GET_CLASS(obj) \
>> -        OBJECT_GET_CLASS(VirtioBusClass, (obj), TYPE_VIRTIO_MMIO_BUS)
>> -#define VIRTIO_MMIO_BUS_CLASS(klass) \
>> -        OBJECT_CLASS_CHECK(VirtioBusClass, (klass), TYPE_VIRTIO_MMIO_BUS)
>> -
>> -/* virtio-mmio */
>> -#define TYPE_VIRTIO_MMIO "virtio-mmio"
>> -#define VIRTIO_MMIO(obj) \
>> -        OBJECT_CHECK(VirtIOMMIOProxy, (obj), TYPE_VIRTIO_MMIO)
>> -
>> -#define VIRT_MAGIC 0x74726976 /* 'virt' */
>> -#define VIRT_VERSION 2
>> -#define VIRT_VERSION_LEGACY 1
>> -#define VIRT_VENDOR 0x554D4551 /* 'QEMU' */
>> -
>> -typedef struct VirtIOMMIOQueue {
>> -    uint16_t num;
>> -    bool enabled;
>> -    uint32_t desc[2];
>> -    uint32_t avail[2];
>> -    uint32_t used[2];
>> -} VirtIOMMIOQueue;
>> -
>> -typedef struct {
>> -    /* Generic */
>> -    SysBusDevice parent_obj;
>> -    MemoryRegion iomem;
>> -    qemu_irq irq;
>> -    bool legacy;
>> -    /* Guest accessible state needing migration and reset */
>> -    uint32_t host_features_sel;
>> -    uint32_t guest_features_sel;
>> -    uint32_t guest_page_shift;
>> -    /* virtio-bus */
>> -    VirtioBusState bus;
>> -    bool format_transport_address;
>> -    /* Fields only used for non-legacy (v2) devices */
>> -    uint32_t guest_features[2];
>> -    VirtIOMMIOQueue vqs[VIRTIO_QUEUE_MAX];
>> -} VirtIOMMIOProxy;
>> -
>>   static bool virtio_mmio_ioeventfd_enabled(DeviceState *d)
>>   {
>>       return kvm_eventfds_enabled();
>> diff --git a/include/hw/virtio/virtio-mmio.h b/include/hw/virtio/virtio-mmio.h
>> new file mode 100644
>> index 0000000000..c8a6ef20de
>> --- /dev/null
>> +++ b/include/hw/virtio/virtio-mmio.h
>> @@ -0,0 +1,73 @@
>> +/*
>> + * Virtio MMIO bindings
>> + *
>> + * Copyright (c) 2011 Linaro Limited
>> + *
>> + * Author:
>> + *  Peter Maydell <peter.maydell@linaro.org>
>> + *
>> + * This program is free software; you can redistribute it and/or modify
>> + * it under the terms of the GNU General Public License; either version 2
>> + * of the License, or (at your option) any later version.
>> + *
>> + * This program is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License along
>> + * with this program; if not, see <http://www.gnu.org/licenses/>.
>> + */
>> +
>> +#ifndef QEMU_VIRTIO_MMIO_H
>> +#define QEMU_VIRTIO_MMIO_H
>
> I'd rather use HW_VIRTIO_MMIO_H

Looks like there isn't a consensus in this regard:

$ grep "ifndef" *
vhost-backend.h:#ifndef VHOST_BACKEND_H
vhost.h:#ifndef VHOST_H
vhost-scsi-common.h:#ifndef VHOST_SCSI_COMMON_H
vhost-scsi.h:#ifndef VHOST_SCSI_H
vhost-user-blk.h:#ifndef VHOST_USER_BLK_H
vhost-user.h:#ifndef HW_VIRTIO_VHOST_USER_H
vhost-user-scsi.h:#ifndef VHOST_USER_SCSI_H
vhost-vsock.h:#ifndef QEMU_VHOST_VSOCK_H
virtio-access.h:#ifndef QEMU_VIRTIO_ACCESS_H
virtio-balloon.h:#ifndef QEMU_VIRTIO_BALLOON_H
virtio-balloon.h.orig:#ifndef QEMU_VIRTIO_BALLOON_H
virtio-blk.h:#ifndef QEMU_VIRTIO_BLK_H
virtio-bus.h:#ifndef VIRTIO_BUS_H
virtio-crypto.h:#ifndef QEMU_VIRTIO_CRYPTO_H
virtio-gpu-bswap.h:#ifndef HW_VIRTIO_GPU_BSWAP_H
virtio-gpu.h:#ifndef HW_VIRTIO_GPU_H
virtio-gpu-pci.h:#ifndef HW_VIRTIO_GPU_PCI_H
virtio-gpu-pixman.h:#ifndef HW_VIRTIO_GPU_PIXMAN_H
virtio.h:#ifndef QEMU_VIRTIO_H
virtio-input.h:#ifndef QEMU_VIRTIO_INPUT_H
virtio-mmio.h:#ifndef QEMU_VIRTIO_MMIO_H
virtio-net.h:#ifndef QEMU_VIRTIO_NET_H
virtio-pmem.h:#ifndef HW_VIRTIO_PMEM_H
virtio-rng.h:#ifndef QEMU_VIRTIO_RNG_H
virtio-scsi.h:#ifndef QEMU_VIRTIO_SCSI_H
virtio-serial.h:#ifndef QEMU_VIRTIO_SERIAL_H

Do we have an actual policy written somewhere?

> Regardless:
> Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
> Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>
>
>> +
>> +#include "hw/virtio/virtio-bus.h"
>> +
>> +/* QOM macros */
>> +/* virtio-mmio-bus */
>> +#define TYPE_VIRTIO_MMIO_BUS "virtio-mmio-bus"
>> +#define VIRTIO_MMIO_BUS(obj) \
>> +        OBJECT_CHECK(VirtioBusState, (obj), TYPE_VIRTIO_MMIO_BUS)
>> +#define VIRTIO_MMIO_BUS_GET_CLASS(obj) \
>> +        OBJECT_GET_CLASS(VirtioBusClass, (obj), TYPE_VIRTIO_MMIO_BUS)
>> +#define VIRTIO_MMIO_BUS_CLASS(klass) \
>> +        OBJECT_CLASS_CHECK(VirtioBusClass, (klass), TYPE_VIRTIO_MMIO_BUS)
>> +
>> +/* virtio-mmio */
>> +#define TYPE_VIRTIO_MMIO "virtio-mmio"
>> +#define VIRTIO_MMIO(obj) \
>> +        OBJECT_CHECK(VirtIOMMIOProxy, (obj), TYPE_VIRTIO_MMIO)
>> +
>> +#define VIRT_MAGIC 0x74726976 /* 'virt' */
>> +#define VIRT_VERSION 2
>> +#define VIRT_VERSION_LEGACY 1
>> +#define VIRT_VENDOR 0x554D4551 /* 'QEMU' */
>> +
>> +typedef struct VirtIOMMIOQueue {
>> +    uint16_t num;
>> +    bool enabled;
>> +    uint32_t desc[2];
>> +    uint32_t avail[2];
>> +    uint32_t used[2];
>> +} VirtIOMMIOQueue;
>> +
>> +typedef struct {
>> +    /* Generic */
>> +    SysBusDevice parent_obj;
>> +    MemoryRegion iomem;
>> +    qemu_irq irq;
>> +    bool legacy;
>> +    /* Guest accessible state needing migration and reset */
>> +    uint32_t host_features_sel;
>> +    uint32_t guest_features_sel;
>> +    uint32_t guest_page_shift;
>> +    /* virtio-bus */
>> +    VirtioBusState bus;
>> +    bool format_transport_address;
>> +    /* Fields only used for non-legacy (v2) devices */
>> +    uint32_t guest_features[2];
>> +    VirtIOMMIOQueue vqs[VIRTIO_QUEUE_MAX];
>> +} VirtIOMMIOProxy;
>> +
>> +#endif
>>
Eric Blake Oct. 3, 2019, 1:11 p.m. UTC | #3
On 10/3/19 6:26 AM, Sergio Lopez wrote:
> 
> Philippe Mathieu-Daudé <philmd@redhat.com> writes:
> 
>> On 10/2/19 1:30 PM, Sergio Lopez wrote:
>>> Put QOM and main struct definition in a separate header file, so it
>>> can be accessed from other components.
>>>
>>> Signed-off-by: Sergio Lopez <slp@redhat.com>

>>> +
>>> +#ifndef QEMU_VIRTIO_MMIO_H
>>> +#define QEMU_VIRTIO_MMIO_H
>>
>> I'd rather use HW_VIRTIO_MMIO_H
> 
> Looks like there isn't a consensus in this regard:
> 
> $ grep "ifndef" *

> 
> Do we have an actual policy written somewhere?

Past history shows several cleanups near commit fe2611b016, including 
commit c0a9956b which mentions scripts/clean-header-guards specifically 
for this purpose.  So yes, we have a policy, although it is not always 
enforced in a timely manner.
Philippe Mathieu-Daudé Oct. 3, 2019, 1:47 p.m. UTC | #4
On 10/3/19 3:11 PM, Eric Blake wrote:
> On 10/3/19 6:26 AM, Sergio Lopez wrote:
>> Philippe Mathieu-Daudé <philmd@redhat.com> writes:
>>> On 10/2/19 1:30 PM, Sergio Lopez wrote:
>>>> Put QOM and main struct definition in a separate header file, so it
>>>> can be accessed from other components.
>>>>
>>>> Signed-off-by: Sergio Lopez <slp@redhat.com>
> 
>>>> +
>>>> +#ifndef QEMU_VIRTIO_MMIO_H
>>>> +#define QEMU_VIRTIO_MMIO_H
>>>
>>> I'd rather use HW_VIRTIO_MMIO_H
>>
>> Looks like there isn't a consensus in this regard:
>>
>> $ grep "ifndef" *
> 
>>
>> Do we have an actual policy written somewhere?
> 
> Past history shows several cleanups near commit fe2611b016, including 
> commit c0a9956b which mentions scripts/clean-header-guards specifically 
> for this purpose.  So yes, we have a policy, although it is not always 
> enforced in a timely manner.

Paul Brook started to use the HW_ prefix introducing the hw/ directory 
in commit 87ecb68bd (12 years ago). Most of the headers added out of hw/ 
and moved there later do not use this pattern.
Markus Armbruster Oct. 7, 2019, 9:32 a.m. UTC | #5
Eric Blake <eblake@redhat.com> writes:

> On 10/3/19 6:26 AM, Sergio Lopez wrote:
>>
>> Philippe Mathieu-Daudé <philmd@redhat.com> writes:
>>
>>> On 10/2/19 1:30 PM, Sergio Lopez wrote:
>>>> Put QOM and main struct definition in a separate header file, so it
>>>> can be accessed from other components.
>>>>
>>>> Signed-off-by: Sergio Lopez <slp@redhat.com>
>
>>>> +
>>>> +#ifndef QEMU_VIRTIO_MMIO_H
>>>> +#define QEMU_VIRTIO_MMIO_H
>>>
>>> I'd rather use HW_VIRTIO_MMIO_H
>>
>> Looks like there isn't a consensus in this regard:
>>
>> $ grep "ifndef" *
>
>>
>> Do we have an actual policy written somewhere?
>
> Past history shows several cleanups near commit fe2611b016, including
> commit c0a9956b which mentions scripts/clean-header-guards
> specifically for this purpose.  So yes, we have a policy, although it
> is not always enforced in a timely manner.

We haven't adopted a strict policy.

I created clean-header-guards.pl to help me tidy up the resulting mess
somewhat.  The script can clean up "untidy" header guards.  This may
involve replacing the guard symbol.  It derives the replacement symbol
from the file name the obvious way: convert a-z to A_Z, replace any
character that isn't okay in an identifier by '_'.  Guard symbols chosen
that way are fairly unlikely to collide.

Existing guard symbols often omit directories, and the script tolerates
that.  For instance, in sub/dir/base.h, anything ending in BASE_H is
considered tidy enough.  Might be a bad idea.

I wouldn't go as far as calling this a policy.  Perhaps it should be.


commit 2dbc4ebc1712a5cf9e6a36327dce0b465abd5bbe
Author: Markus Armbruster <armbru@redhat.com>
Date:   Tue Jun 28 13:07:36 2016 +0200

    scripts: New clean-header-guards.pl
    
    The conventional way to ensure a header can be included multiple times
    is to bracket it like this:
    
        #ifndef HEADER_NAME_H
        #define HEADER_NAME_H
        ...
        #endif
    
    where HEADER_NAME_H is a symbol unique to this header.
    
    The endif may be optionally decorated like this:
    
        #endif /* HEADER_NAME_H */
    
    Unconventional ways present in our code:
    
    * Identifiers reserved for any use:
        #define _FILEOP_H
    
    * Lowercase (bad idea for object-like macros):
        #define __linux_video_vga_h__
    
    * Roundabout ways to say the same thing (and hide from grep):
        #if !defined(__PPC_MAC_H__)
        #endif /* !defined(__PPC_MAC_H__) */
    
    * Redundant values:
        #define HW_ALPHA_H 1
    
    * Funny redundant values:
        # define PXA_H                 "pxa.h"
    
    * Decorations with bangs:
    
        #endif /* !QEMU_ARM_GIC_INTERNAL_H */
    
      The negation actually makes sense, but almost all our header guard
      #endif decorations don't negate.
    
    * Useless decorations:
    
       #endif  /* audio.h */
    
    Header guards are not the place to show off creativity.  This script
    normalizes them to the conventional way, and cleans up whitespace
    while there.  It warns when it renames guard symbols, and explains how
    to find occurences of these symbols that may have to be updated
    manually.
    
    Another issue is use of the same guard symbol in multiple headers.
    That's okay only for headers that cannot be used together, such as the
    *-user/*/target_syscall.h.  This script can't tell, so it warns when
    it sees a reuse.
    
    The script also warns when preprocessing a header with its guard
    symbol defined produces anything but whitespace.
    
    The next commits will put the script to use.
    
    Signed-off-by: Markus Armbruster <armbru@redhat.com>
    Reviewed-by: Richard Henderson <rth@twiddle.net>
diff mbox series

Patch

diff --git a/hw/virtio/virtio-mmio.c b/hw/virtio/virtio-mmio.c
index 3d5ca0f667..94d934c44b 100644
--- a/hw/virtio/virtio-mmio.c
+++ b/hw/virtio/virtio-mmio.c
@@ -29,57 +29,11 @@ 
 #include "qemu/host-utils.h"
 #include "qemu/module.h"
 #include "sysemu/kvm.h"
-#include "hw/virtio/virtio-bus.h"
+#include "hw/virtio/virtio-mmio.h"
 #include "qemu/error-report.h"
 #include "qemu/log.h"
 #include "trace.h"
 
-/* QOM macros */
-/* virtio-mmio-bus */
-#define TYPE_VIRTIO_MMIO_BUS "virtio-mmio-bus"
-#define VIRTIO_MMIO_BUS(obj) \
-        OBJECT_CHECK(VirtioBusState, (obj), TYPE_VIRTIO_MMIO_BUS)
-#define VIRTIO_MMIO_BUS_GET_CLASS(obj) \
-        OBJECT_GET_CLASS(VirtioBusClass, (obj), TYPE_VIRTIO_MMIO_BUS)
-#define VIRTIO_MMIO_BUS_CLASS(klass) \
-        OBJECT_CLASS_CHECK(VirtioBusClass, (klass), TYPE_VIRTIO_MMIO_BUS)
-
-/* virtio-mmio */
-#define TYPE_VIRTIO_MMIO "virtio-mmio"
-#define VIRTIO_MMIO(obj) \
-        OBJECT_CHECK(VirtIOMMIOProxy, (obj), TYPE_VIRTIO_MMIO)
-
-#define VIRT_MAGIC 0x74726976 /* 'virt' */
-#define VIRT_VERSION 2
-#define VIRT_VERSION_LEGACY 1
-#define VIRT_VENDOR 0x554D4551 /* 'QEMU' */
-
-typedef struct VirtIOMMIOQueue {
-    uint16_t num;
-    bool enabled;
-    uint32_t desc[2];
-    uint32_t avail[2];
-    uint32_t used[2];
-} VirtIOMMIOQueue;
-
-typedef struct {
-    /* Generic */
-    SysBusDevice parent_obj;
-    MemoryRegion iomem;
-    qemu_irq irq;
-    bool legacy;
-    /* Guest accessible state needing migration and reset */
-    uint32_t host_features_sel;
-    uint32_t guest_features_sel;
-    uint32_t guest_page_shift;
-    /* virtio-bus */
-    VirtioBusState bus;
-    bool format_transport_address;
-    /* Fields only used for non-legacy (v2) devices */
-    uint32_t guest_features[2];
-    VirtIOMMIOQueue vqs[VIRTIO_QUEUE_MAX];
-} VirtIOMMIOProxy;
-
 static bool virtio_mmio_ioeventfd_enabled(DeviceState *d)
 {
     return kvm_eventfds_enabled();
diff --git a/include/hw/virtio/virtio-mmio.h b/include/hw/virtio/virtio-mmio.h
new file mode 100644
index 0000000000..c8a6ef20de
--- /dev/null
+++ b/include/hw/virtio/virtio-mmio.h
@@ -0,0 +1,73 @@ 
+/*
+ * Virtio MMIO bindings
+ *
+ * Copyright (c) 2011 Linaro Limited
+ *
+ * Author:
+ *  Peter Maydell <peter.maydell@linaro.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef QEMU_VIRTIO_MMIO_H
+#define QEMU_VIRTIO_MMIO_H
+
+#include "hw/virtio/virtio-bus.h"
+
+/* QOM macros */
+/* virtio-mmio-bus */
+#define TYPE_VIRTIO_MMIO_BUS "virtio-mmio-bus"
+#define VIRTIO_MMIO_BUS(obj) \
+        OBJECT_CHECK(VirtioBusState, (obj), TYPE_VIRTIO_MMIO_BUS)
+#define VIRTIO_MMIO_BUS_GET_CLASS(obj) \
+        OBJECT_GET_CLASS(VirtioBusClass, (obj), TYPE_VIRTIO_MMIO_BUS)
+#define VIRTIO_MMIO_BUS_CLASS(klass) \
+        OBJECT_CLASS_CHECK(VirtioBusClass, (klass), TYPE_VIRTIO_MMIO_BUS)
+
+/* virtio-mmio */
+#define TYPE_VIRTIO_MMIO "virtio-mmio"
+#define VIRTIO_MMIO(obj) \
+        OBJECT_CHECK(VirtIOMMIOProxy, (obj), TYPE_VIRTIO_MMIO)
+
+#define VIRT_MAGIC 0x74726976 /* 'virt' */
+#define VIRT_VERSION 2
+#define VIRT_VERSION_LEGACY 1
+#define VIRT_VENDOR 0x554D4551 /* 'QEMU' */
+
+typedef struct VirtIOMMIOQueue {
+    uint16_t num;
+    bool enabled;
+    uint32_t desc[2];
+    uint32_t avail[2];
+    uint32_t used[2];
+} VirtIOMMIOQueue;
+
+typedef struct {
+    /* Generic */
+    SysBusDevice parent_obj;
+    MemoryRegion iomem;
+    qemu_irq irq;
+    bool legacy;
+    /* Guest accessible state needing migration and reset */
+    uint32_t host_features_sel;
+    uint32_t guest_features_sel;
+    uint32_t guest_page_shift;
+    /* virtio-bus */
+    VirtioBusState bus;
+    bool format_transport_address;
+    /* Fields only used for non-legacy (v2) devices */
+    uint32_t guest_features[2];
+    VirtIOMMIOQueue vqs[VIRTIO_QUEUE_MAX];
+} VirtIOMMIOProxy;
+
+#endif