qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH V19 4/5] hw/mips: Add Loongson-3 machine support


From: Philippe Mathieu-Daudé
Subject: Re: [PATCH V19 4/5] hw/mips: Add Loongson-3 machine support
Date: Sun, 3 Jan 2021 18:04:35 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.6.0

+Paolo for question at the end.

On 12/21/20 12:05 PM, Huacai Chen wrote:
> Add Loongson-3 based machine support, it use liointc as the interrupt
> controler and use GPEX as the pci controller. Currently it can work with
> both TCG and KVM.
> 
> As the machine model is not based on any exiting physical hardware, the
> name of the machine is "loongson3-virt". It may be superseded in future
> by a real machine model. If this happens, then a regular deprecation
> procedure shall occur for "loongson3-virt" machine.
> 
> We now already have a full functional Linux kernel (based on Linux-5.4.x
> LTS) here:
> 
> https://github.com/chenhuacai/linux
> 
> Of course the upstream kernel is also usable (the kvm host side and
> guest side have both been upstream in Linux-5.9):
> 
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> 
> How to use QEMU/Loongson-3?
> 1, Download kernel source from the above URL;
> 2, Build a kernel with arch/mips/configs/loongson3_defconfig;
> 3, Boot a Loongson-3A4000 host with this kernel (for KVM mode);
> 4, Build QEMU-master with this patchset;
> 5, modprobe kvm (only necessary for KVM mode);
> 6, Use QEMU with TCG:
>        qemu-system-mips64el -M loongson3-virt,accel=tcg -cpu Loongson-3A1000 
> -kernel <path_to_kernel> -append ...
>    Use QEMU with KVM:
>        qemu-system-mips64el -M loongson3-virt,accel=kvm -cpu Loongson-3A4000 
> -kernel <path_to_kernel> -append ...
> 
>    The "-cpu" parameter is optional here and QEMU will use the correct type 
> for TCG/KVM automatically.
> 
> Signed-off-by: Huacai Chen <chenhuacai@kernel.org>
> Co-developed-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
> Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
> ---
>  MAINTAINERS                                  |   1 +
>  default-configs/devices/mips64el-softmmu.mak |   1 +
>  hw/mips/Kconfig                              |  11 +
>  hw/mips/loongson3_virt.c                     | 621 +++++++++++++++++++
>  hw/mips/meson.build                          |   2 +-
>  5 files changed, 635 insertions(+), 1 deletion(-)
>  create mode 100644 hw/mips/loongson3_virt.c
...

> +static inline void loongson3_virt_devices_init(MachineState *machine, 
> DeviceState *pic)
> +{
> +    int i;
> +    qemu_irq irq;
> +    PCIBus *pci_bus;
> +    DeviceState *dev;
> +    MemoryRegion *mmio_reg, *ecam_reg;
> +    LoongsonMachineState *s = LOONGSON_MACHINE(machine);
> +
> +    dev = qdev_new(TYPE_GPEX_HOST);
> +    sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
> +    pci_bus = PCI_HOST_BRIDGE(dev)->bus;
> +
> +    s->ecam_alias = g_new0(MemoryRegion, 1);
> +    ecam_reg = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 0);
> +    memory_region_init_alias(s->ecam_alias, OBJECT(dev), "pcie-ecam",
> +                             ecam_reg, 0, virt_memmap[VIRT_PCIE_ECAM].size);
> +    memory_region_add_subregion(get_system_memory(),
> +                                virt_memmap[VIRT_PCIE_ECAM].base, 
> s->ecam_alias);
> +
> +    s->mmio_alias = g_new0(MemoryRegion, 1);
> +    mmio_reg = sysbus_mmio_get_region(SYS_BUS_DEVICE(dev), 1);
> +    memory_region_init_alias(s->mmio_alias, OBJECT(dev), "pcie-mmio",
> +                             mmio_reg, virt_memmap[VIRT_PCIE_MMIO].base,
> +                             virt_memmap[VIRT_PCIE_MMIO].size);
> +    memory_region_add_subregion(get_system_memory(),
> +                                virt_memmap[VIRT_PCIE_MMIO].base, 
> s->mmio_alias);
> +
> +    s->pio_alias = g_new0(MemoryRegion, 1);
> +    memory_region_init_alias(s->pio_alias, OBJECT(dev), "pcie-pio",
> +                             get_system_io(), 0, 
> virt_memmap[VIRT_PCIE_PIO].size);
> +    memory_region_add_subregion(get_system_memory(),
> +                                virt_memmap[VIRT_PCIE_PIO].base, 
> s->pio_alias);
> +    sysbus_mmio_map(SYS_BUS_DEVICE(dev), 2, virt_memmap[VIRT_PCIE_PIO].base);
> +
> +    for (i = 0; i < GPEX_NUM_IRQS; i++) {
> +        irq = qdev_get_gpio_in(pic, PCIE_IRQ_BASE + i);
> +        sysbus_connect_irq(SYS_BUS_DEVICE(dev), i, irq);
> +        gpex_set_irq_num(GPEX_HOST(dev), i, PCIE_IRQ_BASE + i);
> +    }
> +    msi_nonbroken = true;
> +
> +    pci_vga_init(pci_bus);
> +
> +    if (defaults_enabled()) {
> +        pci_create_simple(pci_bus, -1, "pci-ohci");
> +        usb_create_simple(usb_bus_find(-1), "usb-kbd");
> +        usb_create_simple(usb_bus_find(-1), "usb-tablet");
> +    }

Configured using --without-default-devices I get:

$ qemu-system-mips64el -M loongson3-virt -accel qtest
**
ERROR:qom/object.c:711:object_new_with_type: assertion failed: (type !=
NULL)
Bail out! ERROR:qom/object.c:711:object_new_with_type: assertion failed:
(type != NULL)
Aborted (core dumped)

(gdb) bt
#0  0x00007f97d73de9e5 in raise () at /lib64/libc.so.6
#1  0x00007f97d73c7895 in abort () at /lib64/libc.so.6
#2  0x00007f97d95aab6c in g_assertion_message_expr.cold () at
/lib64/libglib-2.0.so.0
#3  0x00007f97d96089ff in g_assertion_message_expr () at
/lib64/libglib-2.0.so.0
#4  0x00005563b44cb391 in object_new_with_type (type=<optimized out>) at
qom/object.c:711
#5  0x00005563b44cb3e9 in object_new
(typename=typename@entry=0x5563b469e139 "pci-ohci") at qom/object.c:744
#6  0x00005563b4570d86 in qdev_new (name=name@entry=0x5563b469e139
"pci-ohci") at hw/core/qdev.c:153
#7  0x00005563b4323d51 in pci_new_multifunction (devfn=devfn@entry=-1,
multifunction=multifunction@entry=false, name=name@entry=0x5563b469e139
"pci-ohci") at hw/pci/pci.c:2178
#8  0x00005563b4324167 in pci_create_simple_multifunction
(bus=bus@entry=0x5563b5150640, devfn=devfn@entry=-1,
multifunction=multifunction@entry=false, name=name@entry=0x5563b469e139
"pci-ohci")
    at hw/pci/pci.c:2198
#9  0x00005563b432419a in pci_create_simple
(bus=bus@entry=0x5563b5150640, devfn=devfn@entry=-1,
name=name@entry=0x5563b469e139 "pci-ohci") at hw/pci/pci.c:2205
#10 0x00005563b436dc4c in loongson3_virt_devices_init
(pic=0x5563b5100200, machine=<optimized out>) at
hw/mips/loongson3_virt.c:455
#11 mips_loongson3_virt_init (machine=<optimized out>) at
hw/mips/loongson3_virt.c:612
#12 0x00005563b42e9ebb in machine_run_board_init
(machine=machine@entry=0x5563b4c80400) at hw/core/machine.c:1169
#13 0x00005563b44ab639 in qemu_init_board () at softmmu/vl.c:2455
#14 qmp_x_exit_preconfig (errp=<optimized out>) at softmmu/vl.c:2526
#15 qmp_x_exit_preconfig (errp=<optimized out>) at softmmu/vl.c:2519
#16 0x00005563b44af199 in qemu_init (argc=<optimized out>,
argv=<optimized out>, envp=<optimized out>) at softmmu/vl.c:3534
#17 0x00005563b41d0549 in main (argc=<optimized out>, argv=<optimized
out>, envp=<optimized out>) at softmmu/main.c:49

But this works:

$ qemu-system-mips64el -M loongson3-virt -accel qtest -nodefaults

So I guess we are good.

Paolo, shouldn't we abort() if configured using
--without-default-devices but not using -nodefaults? That would avoid
this kind of
debugging.

Thanks,

Phil.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]