Message ID | 8b654f7ac999a3594f117fcf3b2da1c4cfe4cc65.1606853298.git.jag.raman@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Initial support for multi-process Qemu | expand |
On Wed, Dec 2, 2020 at 12:23 AM Jagannathan Raman <jag.raman@oracle.com> wrote: > x-remote-machine object sets up various subsystems of the remote > device process. Instantiate PCI host bridge object and initialize RAM, IO & > PCI memory regions. > > Signed-off-by: John G Johnson <john.g.johnson@oracle.com> > Signed-off-by: Jagannathan Raman <jag.raman@oracle.com> > Signed-off-by: Elena Ufimtseva <elena.ufimtseva@oracle.com> > Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> > --- > include/hw/pci-host/remote.h | 1 + > include/hw/remote/machine.h | 28 ++++++++++++++++++ > hw/remote/machine.c | 69 > ++++++++++++++++++++++++++++++++++++++++++++ > MAINTAINERS | 2 ++ > hw/meson.build | 1 + > hw/remote/meson.build | 5 ++++ > 6 files changed, 106 insertions(+) > create mode 100644 include/hw/remote/machine.h > create mode 100644 hw/remote/machine.c > create mode 100644 hw/remote/meson.build > > diff --git a/include/hw/pci-host/remote.h b/include/hw/pci-host/remote.h > index bab6d3c..cc0fff4 100644 > --- a/include/hw/pci-host/remote.h > +++ b/include/hw/pci-host/remote.h > @@ -25,6 +25,7 @@ typedef struct RemotePCIHost { > > MemoryRegion *mr_pci_mem; > MemoryRegion *mr_sys_io; > + MemoryRegion *mr_sys_mem; > Why is this not part of the previous patch? } RemotePCIHost; > > #endif > diff --git a/include/hw/remote/machine.h b/include/hw/remote/machine.h > new file mode 100644 > index 0000000..d312972 > --- /dev/null > +++ b/include/hw/remote/machine.h > @@ -0,0 +1,28 @@ > +/* > + * Remote machine configuration > + * > + * Copyright © 2018, 2020 Oracle and/or its affiliates. > + * > + * This work is licensed under the terms of the GNU GPL, version 2 or > later. > + * See the COPYING file in the top-level directory. > + * > + */ > + > +#ifndef REMOTE_MACHINE_H > +#define REMOTE_MACHINE_H > + > +#include "qom/object.h" > +#include "hw/boards.h" > +#include "hw/pci-host/remote.h" > + > +typedef struct RemoteMachineState { > + MachineState parent_obj; > + > + RemotePCIHost *host; > +} RemoteMachineState; > + > +#define TYPE_REMOTE_MACHINE "x-remote-machine" > +#define REMOTE_MACHINE(obj) \ > + OBJECT_CHECK(RemoteMachineState, (obj), TYPE_REMOTE_MACHINE) > + > +#endif > diff --git a/hw/remote/machine.c b/hw/remote/machine.c > new file mode 100644 > index 0000000..c5658bf > --- /dev/null > +++ b/hw/remote/machine.c > @@ -0,0 +1,69 @@ > +/* > + * Machine for remote device > + * > + * This machine type is used by the remote device process in > multi-process > + * QEMU. QEMU device models depend on parent busses, interrupt > controllers, > + * memory regions, etc. The remote machine type offers this environment > so > + * that QEMU device models can be used as remote devices. > + * > + * Copyright © 2018, 2020 Oracle and/or its affiliates. > + * > + * This work is licensed under the terms of the GNU GPL, version 2 or > later. > + * See the COPYING file in the top-level directory. > + * > + */ > + > +#include "qemu/osdep.h" > +#include "qemu-common.h" > + > +#include "hw/remote/machine.h" > +#include "exec/address-spaces.h" > +#include "exec/memory.h" > +#include "qapi/error.h" > + > +static void remote_machine_init(MachineState *machine) > +{ > + MemoryRegion *system_memory, *system_io, *pci_memory; > + RemoteMachineState *s = REMOTE_MACHINE(machine); > + RemotePCIHost *rem_host; > + > + system_memory = get_system_memory(); > + system_io = get_system_io(); > + > + pci_memory = g_new(MemoryRegion, 1); > + memory_region_init(pci_memory, NULL, "pci", UINT64_MAX); > + > + rem_host = REMOTE_HOST_DEVICE(qdev_new(TYPE_REMOTE_HOST_DEVICE)); > + > + rem_host->mr_pci_mem = pci_memory; > + rem_host->mr_sys_mem = system_memory; > + rem_host->mr_sys_io = system_io; > + > + s->host = rem_host; > + > + object_property_add_child(OBJECT(s), "remote-device", > OBJECT(rem_host)); > "remote-pcihost" instead ? + memory_region_add_subregion_overlap(system_memory, 0x0, pci_memory, > -1); > + > + qdev_realize(DEVICE(rem_host), sysbus_get_default(), &error_fatal); > +} > + > +static void remote_machine_class_init(ObjectClass *oc, void *data) > +{ > + MachineClass *mc = MACHINE_CLASS(oc); > + > + mc->init = remote_machine_init; > Set mc->desc = "Experimental remote machine" ? +} > + > +static const TypeInfo remote_machine = { > + .name = TYPE_REMOTE_MACHINE, > + .parent = TYPE_MACHINE, > + .instance_size = sizeof(RemoteMachineState), > + .class_init = remote_machine_class_init, > +}; > + > +static void remote_machine_register_types(void) > +{ > + type_register_static(&remote_machine); > +} > + > +type_init(remote_machine_register_types); > diff --git a/MAINTAINERS b/MAINTAINERS > index 4515476..c45ac1d 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -3139,6 +3139,8 @@ F: docs/devel/multi-process.rst > F: tests/multiprocess/multiprocess-lsi53c895a.py > F: hw/pci-host/remote.c > F: include/hw/pci-host/remote.h > +F: hw/remote/machine.c > +F: include/hw/remote/machine.h > > Build and test automation > ------------------------- > diff --git a/hw/meson.build b/hw/meson.build > index 010de72..e615d72 100644 > --- a/hw/meson.build > +++ b/hw/meson.build > @@ -56,6 +56,7 @@ subdir('moxie') > subdir('nios2') > subdir('openrisc') > subdir('ppc') > +subdir('remote') > subdir('riscv') > subdir('rx') > subdir('s390x') > diff --git a/hw/remote/meson.build b/hw/remote/meson.build > new file mode 100644 > index 0000000..197b038 > --- /dev/null > +++ b/hw/remote/meson.build > @@ -0,0 +1,5 @@ > +remote_ss = ss.source_set() > + > +remote_ss.add(when: 'CONFIG_MULTIPROCESS', if_true: files('machine.c')) > + > +softmmu_ss.add_all(when: 'CONFIG_MULTIPROCESS', if_true: remote_ss) > -- > 1.8.3.1 > >
> On Dec 4, 2020, at 9:35 AM, Marc-André Lureau <marcandre.lureau@gmail.com> wrote: > > > > On Wed, Dec 2, 2020 at 12:23 AM Jagannathan Raman <jag.raman@oracle.com> wrote: > x-remote-machine object sets up various subsystems of the remote > device process. Instantiate PCI host bridge object and initialize RAM, IO & > PCI memory regions. > > Signed-off-by: John G Johnson <john.g.johnson@oracle.com> > Signed-off-by: Jagannathan Raman <jag.raman@oracle.com> > Signed-off-by: Elena Ufimtseva <elena.ufimtseva@oracle.com> > Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> > --- > include/hw/pci-host/remote.h | 1 + > include/hw/remote/machine.h | 28 ++++++++++++++++++ > hw/remote/machine.c | 69 ++++++++++++++++++++++++++++++++++++++++++++ > MAINTAINERS | 2 ++ > hw/meson.build | 1 + > hw/remote/meson.build | 5 ++++ > 6 files changed, 106 insertions(+) > create mode 100644 include/hw/remote/machine.h > create mode 100644 hw/remote/machine.c > create mode 100644 hw/remote/meson.build > > diff --git a/include/hw/pci-host/remote.h b/include/hw/pci-host/remote.h > index bab6d3c..cc0fff4 100644 > --- a/include/hw/pci-host/remote.h > +++ b/include/hw/pci-host/remote.h > @@ -25,6 +25,7 @@ typedef struct RemotePCIHost { > > MemoryRegion *mr_pci_mem; > MemoryRegion *mr_sys_io; > + MemoryRegion *mr_sys_mem; > > Why is this not part of the previous patch? Hi Marc-Andre, We originally defined this variable in a previous patch. But we were not using it in that patch. Based on feedback we previously received, we moved it to this patch as it is used for the first time here. Thank you! — Jag > > } RemotePCIHost; > > #endif > diff --git a/include/hw/remote/machine.h b/include/hw/remote/machine.h > new file mode 100644 > index 0000000..d312972 > --- /dev/null > +++ b/include/hw/remote/machine.h > @@ -0,0 +1,28 @@ > +/* > + * Remote machine configuration > + * > + * Copyright © 2018, 2020 Oracle and/or its affiliates. > + * > + * This work is licensed under the terms of the GNU GPL, version 2 or later. > + * See the COPYING file in the top-level directory. > + * > + */ > + > +#ifndef REMOTE_MACHINE_H > +#define REMOTE_MACHINE_H > + > +#include "qom/object.h" > +#include "hw/boards.h" > +#include "hw/pci-host/remote.h" > + > +typedef struct RemoteMachineState { > + MachineState parent_obj; > + > + RemotePCIHost *host; > +} RemoteMachineState; > + > +#define TYPE_REMOTE_MACHINE "x-remote-machine" > +#define REMOTE_MACHINE(obj) \ > + OBJECT_CHECK(RemoteMachineState, (obj), TYPE_REMOTE_MACHINE) > + > +#endif > diff --git a/hw/remote/machine.c b/hw/remote/machine.c > new file mode 100644 > index 0000000..c5658bf > --- /dev/null > +++ b/hw/remote/machine.c > @@ -0,0 +1,69 @@ > +/* > + * Machine for remote device > + * > + * This machine type is used by the remote device process in multi-process > + * QEMU. QEMU device models depend on parent busses, interrupt controllers, > + * memory regions, etc. The remote machine type offers this environment so > + * that QEMU device models can be used as remote devices. > + * > + * Copyright © 2018, 2020 Oracle and/or its affiliates. > + * > + * This work is licensed under the terms of the GNU GPL, version 2 or later. > + * See the COPYING file in the top-level directory. > + * > + */ > + > +#include "qemu/osdep.h" > +#include "qemu-common.h" > + > +#include "hw/remote/machine.h" > +#include "exec/address-spaces.h" > +#include "exec/memory.h" > +#include "qapi/error.h" > + > +static void remote_machine_init(MachineState *machine) > +{ > + MemoryRegion *system_memory, *system_io, *pci_memory; > + RemoteMachineState *s = REMOTE_MACHINE(machine); > + RemotePCIHost *rem_host; > + > + system_memory = get_system_memory(); > + system_io = get_system_io(); > + > + pci_memory = g_new(MemoryRegion, 1); > + memory_region_init(pci_memory, NULL, "pci", UINT64_MAX); > + > + rem_host = REMOTE_HOST_DEVICE(qdev_new(TYPE_REMOTE_HOST_DEVICE)); > + > + rem_host->mr_pci_mem = pci_memory; > + rem_host->mr_sys_mem = system_memory; > + rem_host->mr_sys_io = system_io; > + > + s->host = rem_host; > + > + object_property_add_child(OBJECT(s), "remote-device", OBJECT(rem_host)); > > "remote-pcihost" instead ? > > + memory_region_add_subregion_overlap(system_memory, 0x0, pci_memory, -1); > + > + qdev_realize(DEVICE(rem_host), sysbus_get_default(), &error_fatal); > +} > + > +static void remote_machine_class_init(ObjectClass *oc, void *data) > +{ > + MachineClass *mc = MACHINE_CLASS(oc); > + > + mc->init = remote_machine_init; > > Set mc->desc = "Experimental remote machine" ? > > +} > + > +static const TypeInfo remote_machine = { > + .name = TYPE_REMOTE_MACHINE, > + .parent = TYPE_MACHINE, > + .instance_size = sizeof(RemoteMachineState), > + .class_init = remote_machine_class_init, > +}; > + > +static void remote_machine_register_types(void) > +{ > + type_register_static(&remote_machine); > +} > + > +type_init(remote_machine_register_types); > diff --git a/MAINTAINERS b/MAINTAINERS > index 4515476..c45ac1d 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -3139,6 +3139,8 @@ F: docs/devel/multi-process.rst > F: tests/multiprocess/multiprocess-lsi53c895a.py > F: hw/pci-host/remote.c > F: include/hw/pci-host/remote.h > +F: hw/remote/machine.c > +F: include/hw/remote/machine.h > > Build and test automation > ------------------------- > diff --git a/hw/meson.build b/hw/meson.build > index 010de72..e615d72 100644 > --- a/hw/meson.build > +++ b/hw/meson.build > @@ -56,6 +56,7 @@ subdir('moxie') > subdir('nios2') > subdir('openrisc') > subdir('ppc') > +subdir('remote') > subdir('riscv') > subdir('rx') > subdir('s390x') > diff --git a/hw/remote/meson.build b/hw/remote/meson.build > new file mode 100644 > index 0000000..197b038 > --- /dev/null > +++ b/hw/remote/meson.build > @@ -0,0 +1,5 @@ > +remote_ss = ss.source_set() > + > +remote_ss.add(when: 'CONFIG_MULTIPROCESS', if_true: files('machine.c')) > + > +softmmu_ss.add_all(when: 'CONFIG_MULTIPROCESS', if_true: remote_ss) > -- > 1.8.3.1 > > > > -- > Marc-André Lureau
diff --git a/include/hw/pci-host/remote.h b/include/hw/pci-host/remote.h index bab6d3c..cc0fff4 100644 --- a/include/hw/pci-host/remote.h +++ b/include/hw/pci-host/remote.h @@ -25,6 +25,7 @@ typedef struct RemotePCIHost { MemoryRegion *mr_pci_mem; MemoryRegion *mr_sys_io; + MemoryRegion *mr_sys_mem; } RemotePCIHost; #endif diff --git a/include/hw/remote/machine.h b/include/hw/remote/machine.h new file mode 100644 index 0000000..d312972 --- /dev/null +++ b/include/hw/remote/machine.h @@ -0,0 +1,28 @@ +/* + * Remote machine configuration + * + * Copyright © 2018, 2020 Oracle and/or its affiliates. + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + * + */ + +#ifndef REMOTE_MACHINE_H +#define REMOTE_MACHINE_H + +#include "qom/object.h" +#include "hw/boards.h" +#include "hw/pci-host/remote.h" + +typedef struct RemoteMachineState { + MachineState parent_obj; + + RemotePCIHost *host; +} RemoteMachineState; + +#define TYPE_REMOTE_MACHINE "x-remote-machine" +#define REMOTE_MACHINE(obj) \ + OBJECT_CHECK(RemoteMachineState, (obj), TYPE_REMOTE_MACHINE) + +#endif diff --git a/hw/remote/machine.c b/hw/remote/machine.c new file mode 100644 index 0000000..c5658bf --- /dev/null +++ b/hw/remote/machine.c @@ -0,0 +1,69 @@ +/* + * Machine for remote device + * + * This machine type is used by the remote device process in multi-process + * QEMU. QEMU device models depend on parent busses, interrupt controllers, + * memory regions, etc. The remote machine type offers this environment so + * that QEMU device models can be used as remote devices. + * + * Copyright © 2018, 2020 Oracle and/or its affiliates. + * + * This work is licensed under the terms of the GNU GPL, version 2 or later. + * See the COPYING file in the top-level directory. + * + */ + +#include "qemu/osdep.h" +#include "qemu-common.h" + +#include "hw/remote/machine.h" +#include "exec/address-spaces.h" +#include "exec/memory.h" +#include "qapi/error.h" + +static void remote_machine_init(MachineState *machine) +{ + MemoryRegion *system_memory, *system_io, *pci_memory; + RemoteMachineState *s = REMOTE_MACHINE(machine); + RemotePCIHost *rem_host; + + system_memory = get_system_memory(); + system_io = get_system_io(); + + pci_memory = g_new(MemoryRegion, 1); + memory_region_init(pci_memory, NULL, "pci", UINT64_MAX); + + rem_host = REMOTE_HOST_DEVICE(qdev_new(TYPE_REMOTE_HOST_DEVICE)); + + rem_host->mr_pci_mem = pci_memory; + rem_host->mr_sys_mem = system_memory; + rem_host->mr_sys_io = system_io; + + s->host = rem_host; + + object_property_add_child(OBJECT(s), "remote-device", OBJECT(rem_host)); + memory_region_add_subregion_overlap(system_memory, 0x0, pci_memory, -1); + + qdev_realize(DEVICE(rem_host), sysbus_get_default(), &error_fatal); +} + +static void remote_machine_class_init(ObjectClass *oc, void *data) +{ + MachineClass *mc = MACHINE_CLASS(oc); + + mc->init = remote_machine_init; +} + +static const TypeInfo remote_machine = { + .name = TYPE_REMOTE_MACHINE, + .parent = TYPE_MACHINE, + .instance_size = sizeof(RemoteMachineState), + .class_init = remote_machine_class_init, +}; + +static void remote_machine_register_types(void) +{ + type_register_static(&remote_machine); +} + +type_init(remote_machine_register_types); diff --git a/MAINTAINERS b/MAINTAINERS index 4515476..c45ac1d 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -3139,6 +3139,8 @@ F: docs/devel/multi-process.rst F: tests/multiprocess/multiprocess-lsi53c895a.py F: hw/pci-host/remote.c F: include/hw/pci-host/remote.h +F: hw/remote/machine.c +F: include/hw/remote/machine.h Build and test automation ------------------------- diff --git a/hw/meson.build b/hw/meson.build index 010de72..e615d72 100644 --- a/hw/meson.build +++ b/hw/meson.build @@ -56,6 +56,7 @@ subdir('moxie') subdir('nios2') subdir('openrisc') subdir('ppc') +subdir('remote') subdir('riscv') subdir('rx') subdir('s390x') diff --git a/hw/remote/meson.build b/hw/remote/meson.build new file mode 100644 index 0000000..197b038 --- /dev/null +++ b/hw/remote/meson.build @@ -0,0 +1,5 @@ +remote_ss = ss.source_set() + +remote_ss.add(when: 'CONFIG_MULTIPROCESS', if_true: files('machine.c')) + +softmmu_ss.add_all(when: 'CONFIG_MULTIPROCESS', if_true: remote_ss)