[{"id":3674955,"web_url":"http://patchwork.ozlabs.org/comment/3674955/","msgid":"<CAJpW4SULdJ=zWw+ir3FBaVFvidzwTiHhGZ361A1BETHADThteQ@mail.gmail.com>","list_archive_url":null,"date":"2026-04-08T19:22:09","subject":"Re: [PATCH v4 8/9] hw/hexagon: Define hexagon \"virt\" machine","submitter":{"id":93092,"url":"http://patchwork.ozlabs.org/api/people/93092/","name":"Sid Manning","email":"sid.manning@oss.qualcomm.com"},"content":"On Tue, Apr 7, 2026 at 11:22 PM Brian Cain <brian.cain@oss.qualcomm.com>\nwrote:\n\n> From: Brian Cain <bcain@quicinc.com>\n>\n> Signed-off-by: Brian Cain <brian.cain@oss.qualcomm.com>\n> ---\n>  configs/devices/hexagon-softmmu/default.mak |   1 +\n>  configs/targets/hexagon-softmmu.mak         |   1 +\n>  include/hw/hexagon/virt.h                   |  43 ++\n>  hw/hexagon/virt.c                           | 456 ++++++++++++++++++++\n>  target/hexagon/cpu.c                        |   2 +\n>  hw/hexagon/Kconfig                          |  10 +\n>  hw/hexagon/meson.build                      |   2 +\n>  tests/qemu-iotests/testenv.py               |   1 +\n>  8 files changed, 516 insertions(+)\n>  create mode 100644 include/hw/hexagon/virt.h\n>  create mode 100644 hw/hexagon/virt.c\n>\n> diff --git a/configs/devices/hexagon-softmmu/default.mak\n> b/configs/devices/hexagon-softmmu/default.mak\n> index 08e709aea72..37b4f9f3237 100644\n> --- a/configs/devices/hexagon-softmmu/default.mak\n> +++ b/configs/devices/hexagon-softmmu/default.mak\n> @@ -3,5 +3,6 @@\n>  # Uncomment the following lines to disable these optional devices:\n>\n>  # Boards are selected by default, uncomment to keep out of the build.\n> +# CONFIG_HEX_VIRT=y\n>  # CONFIG_HEX_DSP=y\n>  # CONFIG_L2VIC=y\n> diff --git a/configs/targets/hexagon-softmmu.mak\n> b/configs/targets/hexagon-softmmu.mak\n> index fdfa29b4f39..a77c100f0c5 100644\n> --- a/configs/targets/hexagon-softmmu.mak\n> +++ b/configs/targets/hexagon-softmmu.mak\n> @@ -5,3 +5,4 @@ TARGET_XML_FILES=hexagon-core.xml hexagon-hvx.xml\n>  TARGET_LONG_BITS=32\n>  TARGET_NOT_USING_LEGACY_LDST_PHYS_API=y\n>  TARGET_NOT_USING_LEGACY_NATIVE_ENDIAN_API=y\n> +TARGET_NEED_FDT=y\n> diff --git a/include/hw/hexagon/virt.h b/include/hw/hexagon/virt.h\n> new file mode 100644\n> index 00000000000..a54eac5cf00\n> --- /dev/null\n> +++ b/include/hw/hexagon/virt.h\n> @@ -0,0 +1,43 @@\n> +/*\n> + * Definitions for hexagon virt board.\n> + *\n> + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.\n> + * SPDX-License-Identifier: GPL-2.0-or-later\n> + */\n> +\n> +#ifndef HW_HEXAGONVIRT_H\n> +#define HW_HEXAGONVIRT_H\n> +\n> +#include \"hw/core/boards.h\"\n> +#include \"target/hexagon/cpu.h\"\n> +\n> +struct HexagonVirtMachineState {\n> +    /*< private >*/\n> +    MachineState parent_obj;\n> +\n> +    int fdt_size;\n> +    MemoryRegion *sys;\n> +    MemoryRegion cfgtable;\n> +    MemoryRegion ram;\n> +    MemoryRegion tcm;\n> +    MemoryRegion vtcm;\n> +    MemoryRegion bios;\n> +    DeviceState *l2vic;\n> +    Clock *apb_clk;\n> +};\n> +\n> +void hexagon_load_fdt(const struct HexagonVirtMachineState *vms);\n> +\n> +enum {\n> +    VIRT_UART0,\n> +    VIRT_QTMR0,\n> +    VIRT_QTMR1,\n> +    VIRT_GPT,\n> +    VIRT_MMIO,\n> +    VIRT_FDT,\n> +};\n> +\n> +#define TYPE_HEXAGON_VIRT_MACHINE MACHINE_TYPE_NAME(\"virt\")\n> +OBJECT_DECLARE_SIMPLE_TYPE(HexagonVirtMachineState, HEXAGON_VIRT_MACHINE)\n> +\n> +#endif /* HW_HEXAGONVIRT_H */\n> diff --git a/hw/hexagon/virt.c b/hw/hexagon/virt.c\n> new file mode 100644\n> index 00000000000..49ee1aad2fe\n> --- /dev/null\n> +++ b/hw/hexagon/virt.c\n> @@ -0,0 +1,456 @@\n> +/*\n> + * Hexagon virt emulation\n> + *\n> + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.\n> + * SPDX-License-Identifier: GPL-2.0-or-later\n> + */\n> +\n> +#include \"qemu/osdep.h\"\n> +#include \"qapi/error.h\"\n> +#include \"hw/hexagon/virt.h\"\n> +#include \"elf.h\"\n> +#include \"hw/char/pl011.h\"\n> +#include \"hw/core/clock.h\"\n> +#include \"hw/core/sysbus-fdt.h\"\n> +#include \"hw/hexagon/hexagon.h\"\n> +#include \"hw/hexagon/hexagon_globalreg.h\"\n> +#include \"hw/hexagon/hexagon_tlb.h\"\n> +#include \"hw/core/loader.h\"\n> +#include \"hw/core/qdev-properties.h\"\n> +#include \"hw/core/qdev-clock.h\"\n> +#include \"hw/core/register.h\"\n> +#include \"qemu/error-report.h\"\n> +#include \"qemu/guest-random.h\"\n> +#include \"qemu/units.h\"\n> +#include \"elf.h\"\n> +#include \"machine_cfg_v68n_1024.h.inc\"\n> +#include \"system/address-spaces.h\"\n> +#include \"system/device_tree.h\"\n> +#include \"system/reset.h\"\n> +#include \"system/system.h\"\n> +#include <libfdt.h>\n> +\n> +static const int VIRTIO_DEV_COUNT = 8;\n> +\n> +static const MemMapEntry base_memmap[] = {\n> +    [VIRT_UART0] = { 0x10000000, 0x00000200 },\n> +    [VIRT_MMIO] = { 0x11000000, 0x1000000, },\n> +    [VIRT_GPT] = { 0xab000000, 0x00001000 },\n> +    [VIRT_FDT] = { 0x99800000, 0x00400000 },\n> +};\n> +\n> +static const int irqmap[] = {\n> +    [VIRT_MMIO] = 18, /* ...to 18 + VIRTIO_DEV_COUNT - 1 */\n> +    [VIRT_GPT] = 12,\n> +    [VIRT_UART0] = 15,\n> +    [VIRT_QTMR0] = 2,\n> +    [VIRT_QTMR1] = 4,\n> +};\n> +\n> +\n> +static void create_fdt(HexagonVirtMachineState *vms)\n> +{\n> +    MachineState *ms = MACHINE(vms);\n> +    void *fdt = create_device_tree(&vms->fdt_size);\n> +    uint8_t rng_seed[32];\n> +\n> +    if (!fdt) {\n> +        error_report(\"create_device_tree() failed\");\n> +        exit(1);\n> +    }\n> +\n> +    ms->fdt = fdt;\n> +\n> +    qemu_fdt_setprop_cell(fdt, \"/\", \"#address-cells\", 0x2);\n> +    qemu_fdt_setprop_cell(fdt, \"/\", \"#size-cells\", 0x1);\n> +    qemu_fdt_setprop_string(fdt, \"/\", \"model\", \"hexagon-virt,qemu\");\n> +    qemu_fdt_setprop_string(fdt, \"/\", \"compatible\", \"qcom,sm8150\");\n> +\n> +    qemu_fdt_add_subnode(fdt, \"/soc\");\n> +    qemu_fdt_setprop_cell(fdt, \"/soc\", \"#address-cells\", 0x2);\n> +    qemu_fdt_setprop_cell(fdt, \"/soc\", \"#size-cells\", 0x1);\n> +    qemu_fdt_setprop(fdt, \"/soc\", \"ranges\", NULL, 0);\n> +\n> +    qemu_fdt_add_subnode(fdt, \"/chosen\");\n> +    qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed));\n> +    qemu_fdt_setprop(fdt, \"/chosen\", \"rng-seed\", rng_seed,\n> sizeof(rng_seed));\n> +}\n> +\n> +static void fdt_add_hvx(HexagonVirtMachineState *vms,\n> +                        const struct hexagon_machine_config *m_cfg,\n> +                        Error **errp)\n> +{\n> +    const MachineState *ms = MACHINE(vms);\n> +    uint32_t vtcm_size_bytes = m_cfg->cfgtable.vtcm_size_kb * 1024;\n> +    if (vtcm_size_bytes > 0) {\n> +        memory_region_init_ram(&vms->vtcm, NULL, \"vtcm.ram\",\n> vtcm_size_bytes,\n> +                               errp);\n> +        memory_region_add_subregion(vms->sys, m_cfg->cfgtable.vtcm_base\n> << 16,\n> +                                    &vms->vtcm);\n> +\n> +        qemu_fdt_add_subnode(ms->fdt, \"/soc/vtcm\");\n> +        qemu_fdt_setprop_string(ms->fdt, \"/soc/vtcm\", \"compatible\",\n> +                                \"qcom,hexagon_vtcm\");\n> +\n> +        assert(sizeof(m_cfg->cfgtable.vtcm_base) == sizeof(uint32_t));\n> +        qemu_fdt_setprop_cells(ms->fdt, \"/soc/vtcm\", \"reg\", 0,\n> +                               m_cfg->cfgtable.vtcm_base << 16,\n> +                               vtcm_size_bytes);\n> +    }\n> +\n> +    if (m_cfg->cfgtable.ext_contexts > 0) {\n> +        qemu_fdt_add_subnode(ms->fdt, \"/soc/hvx\");\n> +        qemu_fdt_setprop_string(ms->fdt, \"/soc/hvx\", \"compatible\",\n> +                                \"qcom,hexagon-hvx\");\n> +        qemu_fdt_setprop_cells(ms->fdt, \"/soc/hvx\", \"qcom,hvx-max-ctxts\",\n> +                               m_cfg->cfgtable.ext_contexts);\n> +        qemu_fdt_setprop_cells(ms->fdt, \"/soc/hvx\", \"qcom,hvx-vlength\",\n> +                               m_cfg->cfgtable.hvx_vec_log_length);\n> +    }\n> +}\n> +\n> +static int32_t irq_hvm_ic_phandle = -1;\n> +static void fdt_add_hvm_pic_node(HexagonVirtMachineState *vms,\n> +                                 const struct hexagon_machine_config\n> *m_cfg)\n> +{\n> +    MachineState *ms = MACHINE(vms);\n> +    irq_hvm_ic_phandle = qemu_fdt_alloc_phandle(ms->fdt);\n> +\n> +    qemu_fdt_setprop_cell(ms->fdt, \"/soc\", \"interrupt-parent\",\n> +                          irq_hvm_ic_phandle);\n> +\n> +    qemu_fdt_add_subnode(ms->fdt, \"/soc/interrupt-controller\");\n> +    qemu_fdt_setprop_cell(ms->fdt, \"/soc/interrupt-controller\",\n> +                          \"#address-cells\", 2);\n> +    qemu_fdt_setprop_cell(ms->fdt, \"/soc/interrupt-controller\",\n> +                          \"#interrupt-cells\", 2);\n> +    qemu_fdt_setprop_string(ms->fdt, \"/soc/interrupt-controller\",\n> \"compatible\",\n> +                            \"qcom,h2-pic,hvm-pic\");\n> +    qemu_fdt_setprop(ms->fdt, \"/soc/interrupt-controller\",\n> +                     \"interrupt-controller\", NULL, 0);\n> +    qemu_fdt_setprop_cell(ms->fdt, \"/soc/interrupt-controller\", \"phandle\",\n> +                          irq_hvm_ic_phandle);\n> +\n> +    sysbus_mmio_map(SYS_BUS_DEVICE(vms->l2vic), 1,\n> +                    m_cfg->cfgtable.fastl2vic_base << 16);\n> +}\n> +\n> +\n> +static void fdt_add_gpt_node(HexagonVirtMachineState *vms)\n> +{\n> +    g_autofree char *name = NULL;\n> +    MachineState *ms = MACHINE(vms);\n> +\n> +    name = g_strdup_printf(\"/soc/gpt@%\" PRIx64,\n> +                           (int64_t)base_memmap[VIRT_GPT].base);\n> +    qemu_fdt_add_subnode(ms->fdt, name);\n> +    qemu_fdt_setprop_string(ms->fdt, name, \"compatible\",\n> +                            \"qcom,h2-timer,hvm-timer\");\n> +    qemu_fdt_setprop_cells(ms->fdt, name, \"interrupts\", irqmap[VIRT_GPT],\n> 0);\n> +    qemu_fdt_setprop_cells(ms->fdt, name, \"reg\", 0x0,\n> +                           base_memmap[VIRT_GPT].base,\n> +                           base_memmap[VIRT_GPT].size);\n> +}\n> +\n> +static int32_t clock_phandle = -1;\n> +static void fdt_add_clocks(const HexagonVirtMachineState *vms)\n> +{\n> +    MachineState *ms = MACHINE(vms);\n> +    clock_phandle = qemu_fdt_alloc_phandle(ms->fdt);\n> +    qemu_fdt_add_subnode(ms->fdt, \"/apb-pclk\");\n> +    qemu_fdt_setprop_string(ms->fdt, \"/apb-pclk\", \"compatible\",\n> \"fixed-clock\");\n> +    qemu_fdt_setprop_cell(ms->fdt, \"/apb-pclk\", \"#clock-cells\", 0x0);\n> +    qemu_fdt_setprop_cell(ms->fdt, \"/apb-pclk\", \"clock-frequency\",\n> 24000000);\n> +    qemu_fdt_setprop_string(ms->fdt, \"/apb-pclk\", \"clock-output-names\",\n> +                            \"clk24mhz\");\n> +    qemu_fdt_setprop_cell(ms->fdt, \"/apb-pclk\", \"phandle\", clock_phandle);\n> +}\n> +\n> +static void fdt_add_uart(const HexagonVirtMachineState *vms, int uart)\n> +{\n> +    char *nodename;\n> +    hwaddr base = base_memmap[uart].base;\n> +    hwaddr size = base_memmap[uart].size;\n> +    assert(uart == 0);\n> +    int irq = irqmap[VIRT_UART0 + uart];\n> +    const char compat[] = \"arm,pl011\\0arm,primecell\";\n> +    const char clocknames[] = \"uartclk\\0apb_pclk\";\n> +    MachineState *ms = MACHINE(vms);\n> +    DeviceState *dev;\n> +    SysBusDevice *s;\n> +\n> +    dev = qdev_new(TYPE_PL011);\n> +    s = SYS_BUS_DEVICE(dev);\n> +    qdev_prop_set_chr(dev, \"chardev\", serial_hd(0));\n> +    qdev_connect_clock_in(dev, \"clk\", vms->apb_clk);\n> +    sysbus_realize_and_unref(s, &error_fatal);\n> +    sysbus_mmio_map(s, 0, base);\n> +    if (vms->l2vic) {\n> +        sysbus_connect_irq(s, 0, qdev_get_gpio_in(vms->l2vic, irq));\n> +    }\n> +\n> +    nodename = g_strdup_printf(\"/pl011@%\" PRIx64, base);\n> +    qemu_fdt_add_subnode(ms->fdt, nodename);\n> +\n> +    /* Note that we can't use setprop_string because of the embedded NUL\n> */\n> +    qemu_fdt_setprop(ms->fdt, nodename, \"compatible\", compat,\n> sizeof(compat));\n> +    qemu_fdt_setprop_cells(ms->fdt, nodename, \"reg\", 0, base, size);\n> +    if (vms->l2vic) {\n> +        qemu_fdt_setprop_cells(ms->fdt, nodename, \"interrupts\",\n> +                               32 + irq, 0);\n> +        qemu_fdt_setprop_cell(ms->fdt, nodename, \"interrupt-parent\",\n> +                              irq_hvm_ic_phandle);\n> +    }\n> +    qemu_fdt_setprop_cells(ms->fdt, nodename, \"clocks\", clock_phandle,\n> +                           clock_phandle);\n> +    qemu_fdt_setprop(ms->fdt, nodename, \"clock-names\", clocknames,\n> +                     sizeof(clocknames));\n> +\n> +    qemu_fdt_setprop_string(ms->fdt, \"/chosen\", \"stdout-path\", nodename);\n> +    qemu_fdt_add_subnode(ms->fdt, \"/aliases\");\n> +    qemu_fdt_setprop_string(ms->fdt, \"/aliases\", \"serial0\", nodename);\n> +\n> +    g_free(nodename);\n> +}\n> +\n> +static void fdt_add_cpu_nodes(const HexagonVirtMachineState *vms)\n> +{\n> +    MachineState *ms = MACHINE(vms);\n> +    qemu_fdt_add_subnode(ms->fdt, \"/cpus\");\n> +    qemu_fdt_setprop_cell(ms->fdt, \"/cpus\", \"#address-cells\", 0x1);\n> +    qemu_fdt_setprop_cell(ms->fdt, \"/cpus\", \"#size-cells\", 0x0);\n> +\n> +    /* cpu nodes */\n> +    for (int num = ms->smp.cpus - 1; num >= 0; num--) {\n> +        char *nodename = g_strdup_printf(\"/cpus/cpu@%d\", num);\n> +        qemu_fdt_add_subnode(ms->fdt, nodename);\n> +        qemu_fdt_setprop_string(ms->fdt, nodename, \"device_type\", \"cpu\");\n> +        qemu_fdt_setprop_cell(ms->fdt, nodename, \"reg\", num);\n> +        qemu_fdt_setprop_cell(ms->fdt, nodename, \"phandle\",\n> +                              qemu_fdt_alloc_phandle(ms->fdt));\n> +        g_free(nodename);\n> +    }\n> +}\n> +\n> +\n> +static void fdt_add_virtio_devices(const HexagonVirtMachineState *vms)\n> +{\n> +    MachineState *ms = MACHINE(vms);\n> +    /* VirtIO MMIO devices */\n> +    for (int i = 0; i < VIRTIO_DEV_COUNT; i++) {\n> +        char *nodename;\n> +        int irq = irqmap[VIRT_MMIO] + i;\n> +        size_t size = base_memmap[VIRT_MMIO].size;\n> +        hwaddr base = base_memmap[VIRT_MMIO].base + i * size;\n> +\n> +        nodename = g_strdup_printf(\"/virtio_mmio@%\" PRIx64, base);\n> +        qemu_fdt_add_subnode(ms->fdt, nodename);\n> +        qemu_fdt_setprop_string(ms->fdt, nodename, \"compatible\",\n> \"virtio,mmio\");\n> +        qemu_fdt_setprop_sized_cells(ms->fdt, nodename, \"reg\", 2, base, 1,\n> +                                     size);\n> +        qemu_fdt_setprop_cells(ms->fdt, nodename, \"interrupts\", irq, 0);\n> +        qemu_fdt_setprop_cell(ms->fdt, nodename, \"interrupt-parent\",\n> +                              irq_hvm_ic_phandle);\n> +\n> +        sysbus_create_simple(\n> +            \"virtio-mmio\", base,\n> +            qdev_get_gpio_in(vms->l2vic, irqmap[VIRT_MMIO] + i));\n> +\n> +        g_free(nodename);\n> +    }\n> +}\n> +\n> +static void virt_instance_init(Object *obj)\n> +{\n> +    HexagonVirtMachineState *vms = HEXAGON_VIRT_MACHINE(obj);\n> +\n> +    create_fdt(vms);\n> +}\n> +\n> +void hexagon_load_fdt(const HexagonVirtMachineState *vms)\n> +{\n> +    MachineState *ms = MACHINE(vms);\n> +    hwaddr fdt_addr = base_memmap[VIRT_FDT].base;\n> +    uint32_t fdtsize = vms->fdt_size;\n> +\n> +    g_assert(fdtsize <= base_memmap[VIRT_FDT].size);\n> +    /* copy in the device tree */\n> +    rom_add_blob_fixed_as(\"fdt\", ms->fdt, fdtsize, fdt_addr,\n> +                          &address_space_memory);\n> +    qemu_register_reset_nosnapshotload(\n> +        qemu_fdt_randomize_seeds,\n> +        rom_ptr_for_as(&address_space_memory, fdt_addr, fdtsize));\n> +}\n> +\n> +static uint64_t load_kernel(const HexagonVirtMachineState *vms)\n> +{\n> +    MachineState *ms = MACHINE(vms);\n> +    uint64_t entry = 0;\n> +    if (load_elf_ram_sym(ms->kernel_filename, NULL, NULL, NULL, &entry,\n> NULL,\n> +                         NULL, NULL, 0, EM_HEXAGON, 0, 0,\n> &address_space_memory,\n> +                         false, NULL) > 0) {\n> +        return entry;\n> +    }\n> +    error_report(\"error loading '%s'\", ms->kernel_filename);\n> +    exit(1);\n> +}\n> +\n> +static uint64_t load_bios(HexagonVirtMachineState *vms)\n> +{\n> +    MachineState *ms = MACHINE(vms);\n> +    uint64_t bios_addr = 0x0;  /* Load BIOS at reset vector address 0x0 */\n> +    int bios_size;\n> +\n> +    bios_size = load_image_targphys(ms->firmware ?: \"\",\n> +                                    bios_addr, 64 * 1024, NULL);\n> +    if (bios_size < 0) {\n> +        error_report(\"Could not load BIOS '%s'\", ms->firmware ?: \"\");\n> +        exit(1);\n> +    }\n> +\n> +    return bios_addr;  /* Return entry point at address 0x0 */\n> +}\n> +\n> +static void do_cpu_reset(void *opaque)\n> +{\n> +    HexagonCPU *cpu = opaque;\n> +    CPUState *cs = CPU(cpu);\n> +    cpu_reset(cs);\n> +}\n> +\n> +static void virt_init(MachineState *ms)\n> +{\n> +    HexagonVirtMachineState *vms = HEXAGON_VIRT_MACHINE(ms);\n> +    const struct hexagon_machine_config *m_cfg = &v68n_1024;\n>\nThis is v68 but in virt_class_init  mc->default_cpu_type is set to v73,\nshould that be 68?\n\n\n+    const char *cpu_model;\n> +    DeviceState *gsregs_dev;\n> +    DeviceState *tlb_dev;\n> +    HexagonCPU *cpu_0;\n> +\n> +    qemu_fdt_setprop_string(ms->fdt, \"/chosen\", \"bootargs\",\n> ms->kernel_cmdline);\n> +\n> +    vms->sys = get_system_memory();\n> +\n> +    /* Create APB clock for peripherals */\n> +    vms->apb_clk = clock_new(OBJECT(ms), \"apb-pclk\");\n> +    clock_set_hz(vms->apb_clk, 24000000);\n> +\n> +    memory_region_init_ram(&vms->ram, NULL, \"ddr.ram\", ms->ram_size,\n> +                           &error_fatal);\n> +    memory_region_add_subregion(vms->sys, 0x0, &vms->ram);\n> +\n> +    if (m_cfg->l2tcm_size) {\n> +        memory_region_init_ram(&vms->tcm, NULL, \"tcm.ram\",\n> m_cfg->l2tcm_size,\n> +                               &error_fatal);\n> +        memory_region_add_subregion(vms->sys, m_cfg->cfgtable.l2tcm_base\n> << 16,\n> +                                    &vms->tcm);\n> +    }\n> +\n> +    memory_region_init_rom(&vms->cfgtable, NULL, \"config_table.rom\",\n> +                           sizeof(m_cfg->cfgtable), &error_fatal);\n> +    memory_region_add_subregion(vms->sys, m_cfg->cfgbase, &vms->cfgtable);\n> +    fdt_add_hvx(vms, m_cfg, &error_fatal);\n> +    cpu_model = ms->cpu_type;\n> +\n> +    if (!cpu_model) {\n> +        cpu_model = HEXAGON_CPU_TYPE_NAME(\"v73\");\n> +    }\n> +\n> +    gsregs_dev = qdev_new(TYPE_HEXAGON_GLOBALREG);\n> +    object_property_add_child(OBJECT(ms), \"global-regs\",\n> OBJECT(gsregs_dev));\n> +    qdev_prop_set_uint64(gsregs_dev, \"config-table-addr\", m_cfg->cfgbase);\n> +    qdev_prop_set_uint32(gsregs_dev, \"dsp-rev\", v68_rev);\n> +    sysbus_realize_and_unref(SYS_BUS_DEVICE(gsregs_dev), &error_fatal);\n> +\n> +    tlb_dev = qdev_new(TYPE_HEXAGON_TLB);\n> +    object_property_add_child(OBJECT(ms), \"tlb\", OBJECT(tlb_dev));\n> +    qdev_prop_set_uint32(tlb_dev, \"num-entries\",\n> +                         m_cfg->cfgtable.jtlb_size_entries);\n> +    sysbus_realize_and_unref(SYS_BUS_DEVICE(tlb_dev), &error_fatal);\n> +\n> +    cpu_0 = NULL;\n> +    for (int i = 0; i < ms->smp.cpus; i++) {\n> +        HexagonCPU *cpu = HEXAGON_CPU(object_new(ms->cpu_type));\n> +        qemu_register_reset(do_cpu_reset, cpu);\n> +\n> +        if (i == 0) {\n> +            cpu_0 = cpu;\n> +            if (ms->kernel_filename) {\n> +                uint64_t entry = load_kernel(vms);\n> +                qdev_prop_set_uint32(DEVICE(cpu_0), \"exec-start-addr\",\n> entry);\n> +            } else if (ms->firmware) {\n> +                uint64_t entry = load_bios(vms);\n> +                qdev_prop_set_uint32(DEVICE(cpu_0), \"exec-start-addr\",\n> entry);\n> +            }\n> +        }\n> +        qdev_prop_set_uint32(DEVICE(cpu), \"htid\", i);\n> +        qdev_prop_set_bit(DEVICE(cpu), \"start-powered-off\", (i != 0));\n> +        object_property_set_link(OBJECT(cpu), \"global-regs\",\n> +                                 OBJECT(gsregs_dev), &error_fatal);\n> +        object_property_set_link(OBJECT(cpu), \"tlb\",\n> +                                 OBJECT(tlb_dev), &error_fatal);\n> +\n> +        if (!qdev_realize_and_unref(DEVICE(cpu), NULL, &error_fatal)) {\n> +            return;\n> +        }\n> +    }\n> +    /* TODO: enable l2vic when l2vic device arrives */\n> +    if (object_class_by_name(\"l2vic\")) {\n> +        vms->l2vic = sysbus_create_varargs(\n> +            \"l2vic\", m_cfg->l2vic_base,\n> +            qdev_get_gpio_in(DEVICE(cpu_0), 0),\n> +            qdev_get_gpio_in(DEVICE(cpu_0), 1),\n> +            qdev_get_gpio_in(DEVICE(cpu_0), 2),\n> +            qdev_get_gpio_in(DEVICE(cpu_0), 3),\n> +            qdev_get_gpio_in(DEVICE(cpu_0), 4),\n> +            qdev_get_gpio_in(DEVICE(cpu_0), 5),\n> +            qdev_get_gpio_in(DEVICE(cpu_0), 6),\n> +            qdev_get_gpio_in(DEVICE(cpu_0), 7), NULL);\n> +\n> +        fdt_add_hvm_pic_node(vms, m_cfg);\n> +        fdt_add_virtio_devices(vms);\n> +        fdt_add_gpt_node(vms);\n> +    }\n> +\n> +    fdt_add_cpu_nodes(vms);\n> +    fdt_add_clocks(vms);\n> +    fdt_add_uart(vms, VIRT_UART0);\n> +\n> +    rom_add_blob_fixed_as(\"config_table.rom\", &m_cfg->cfgtable,\n> +                          sizeof(m_cfg->cfgtable), m_cfg->cfgbase,\n> +                          &address_space_memory);\n> +\n> +\n> +    hexagon_load_fdt(vms);\n> +}\n> +\n> +\n> +static void virt_class_init(ObjectClass *oc, const void *data)\n> +{\n> +    MachineClass *mc = MACHINE_CLASS(oc);\n> +\n> +    mc->desc = \"Hexagon Virtual Machine\";\n> +    mc->init = virt_init;\n> +    mc->default_cpu_type = HEXAGON_CPU_TYPE_NAME(\"v73\");\n> +    mc->default_ram_size = 4 * GiB;\n> +    mc->max_cpus = 8;\n> +    mc->default_cpus = 8;\n> +    mc->is_default = false;\n> +    mc->default_kernel_irqchip_split = false;\n> +    mc->block_default_type = IF_VIRTIO;\n> +    mc->default_boot_order = NULL;\n> +    mc->no_cdrom = 1;\n> +    mc->numa_mem_supported = false;\n> +    mc->default_nic = \"virtio-mmio-bus\";\n> +}\n> +\n> +\n> +static const TypeInfo virt_machine_types[] = { {\n> +    .name = TYPE_HEXAGON_VIRT_MACHINE,\n> +    .parent = TYPE_MACHINE,\n> +    .instance_size = sizeof(HexagonVirtMachineState),\n> +    .class_init = virt_class_init,\n> +    .instance_init = virt_instance_init,\n> +} };\n> +\n> +DEFINE_TYPES(virt_machine_types)\n> diff --git a/target/hexagon/cpu.c b/target/hexagon/cpu.c\n> index 355abb4fd24..01781a76caf 100644\n> --- a/target/hexagon/cpu.c\n> +++ b/target/hexagon/cpu.c\n> @@ -68,6 +68,8 @@ static ObjectClass *hexagon_cpu_class_by_name(const char\n> *cpu_model)\n>\n>  static const Property hexagon_cpu_properties[] = {\n>  #if !defined(CONFIG_USER_ONLY)\n> +    DEFINE_PROP_LINK(\"tlb\", HexagonCPU, tlb, TYPE_HEXAGON_TLB,\n> +                     HexagonTLBState *),\n>      DEFINE_PROP_UINT32(\"exec-start-addr\", HexagonCPU, boot_addr,\n> 0xffffffff),\n>      DEFINE_PROP_LINK(\"global-regs\", HexagonCPU, globalregs,\n>          TYPE_HEXAGON_GLOBALREG, HexagonGlobalRegState *),\n> diff --git a/hw/hexagon/Kconfig b/hw/hexagon/Kconfig\n> index 7b9577f68f7..dc74751d21e 100644\n> --- a/hw/hexagon/Kconfig\n> +++ b/hw/hexagon/Kconfig\n> @@ -3,3 +3,13 @@ config HEX_DSP\n>      default y\n>      depends on HEXAGON && TCG\n>      imply PTIMER\n> +\n> +config HEX_VIRT\n> +    bool\n> +    default y\n> +    depends on HEX_DSP && FDT\n> +    select DEVICE_TREE\n> +    select VIRTIO_MMIO\n> +    select PL011\n> +    select VIRTIO_BLK\n> +    select VIRTIO_SCSI\n> diff --git a/hw/hexagon/meson.build b/hw/hexagon/meson.build\n> index f528d2bc4ab..5b6a5e11a17 100644\n> --- a/hw/hexagon/meson.build\n> +++ b/hw/hexagon/meson.build\n> @@ -4,3 +4,5 @@ hexagon_ss.add(files('hexagon_globalreg.c'))\n>  hexagon_ss.add(when: 'CONFIG_HEX_DSP', if_true: files('hexagon_dsp.c'))\n>\n>  hw_arch += {'hexagon': hexagon_ss}\n> +\n> +hexagon_ss.add(when: 'CONFIG_HEX_VIRT', if_true: files('virt.c'))\n> diff --git a/tests/qemu-iotests/testenv.py b/tests/qemu-iotests/testenv.py\n> index c357e6ebf50..86bcdf7cfad 100644\n> --- a/tests/qemu-iotests/testenv.py\n> +++ b/tests/qemu-iotests/testenv.py\n> @@ -259,6 +259,7 @@ def __init__(self, source_dir: str, build_dir: str,\n>              ('arm', 'virt'),\n>              ('aarch64', 'virt'),\n>              ('avr', 'mega2560'),\n> +            ('hexagon', 'virt'),\n>              ('m68k', 'virt'),\n>              ('or1k', 'virt'),\n>              ('riscv32', 'virt'),\n> --\n> 2.34.1\n>\n>","headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=qualcomm.com header.i=@qualcomm.com header.a=rsa-sha256\n header.s=qcppdkim1 header.b=FmCLBfm1;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com\n header.a=rsa-sha256 header.s=google header.b=gwR5t+5I;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from lists.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4frYJf2GX7z1yD3\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 09 Apr 2026 05:38:26 +1000 (AEST)","from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wAYdR-00030i-S0; Wed, 08 Apr 2026 15:32:21 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <sid.manning@oss.qualcomm.com>)\n id 1wAYTv-0008Po-MP\n for qemu-devel@nongnu.org; Wed, 08 Apr 2026 15:22:33 -0400","from mx0a-0031df01.pphosted.com ([205.220.168.131])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <sid.manning@oss.qualcomm.com>)\n id 1wAYTq-0002SM-OG\n for qemu-devel@nongnu.org; Wed, 08 Apr 2026 15:22:31 -0400","from pps.filterd (m0279867.ppops.net [127.0.0.1])\n by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n 638HXfBT250047\n for <qemu-devel@nongnu.org>; Wed, 8 Apr 2026 19:22:24 GMT","from mail-yx1-f70.google.com (mail-yx1-f70.google.com\n [74.125.224.70])\n by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4dd8x9crd3-1\n (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT)\n for <qemu-devel@nongnu.org>; Wed, 08 Apr 2026 19:22:24 +0000 (GMT)","by mail-yx1-f70.google.com with SMTP id\n 956f58d0204a3-644548b1d9aso149103d50.1\n for <qemu-devel@nongnu.org>; Wed, 08 Apr 2026 12:22:24 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h=\n cc:content-type:date:from:in-reply-to:message-id:mime-version\n :references:subject:to; s=qcppdkim1; bh=VzpLI4JoNdarYfbRQ9xNI/5o\n gWnvJcWkOG3+jAa4A1c=; b=FmCLBfm1BlnDRfK5mvbaCW50OiHHZa5EyYT7HGzK\n xyWTzycXoCMOsYj91scYadK7W5N+KbjvVsjmxO0FI5CmM/05ZVayAzEIWRwNWNio\n gNvMRnmlpzG4XNWTuh1BXG1cQ5RMh5py8GJaiMOsPaYS5i9bgtN+70jLHoBn/ejC\n /hz359YjridvzsTpFEILgpmn1e54T3lVuA6LaE5P5KWY5LXpjNcPjtZ+cBb1GM8I\n 8ybO6XqGAEIg/P4zT+L1GJOeUQiZXzXimHxZGvpn4sT2RRgdwGbOxzmxUC18BoTf\n nHj0ZkzMTAhQER09K4Mi/GR2hJNBoVeTVivwGyGjWq4xIA==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=oss.qualcomm.com; s=google; t=1775676143; x=1776280943; darn=nongnu.org;\n h=cc:to:subject:message-id:date:from:in-reply-to:references\n :mime-version:from:to:cc:subject:date:message-id:reply-to;\n bh=VzpLI4JoNdarYfbRQ9xNI/5ogWnvJcWkOG3+jAa4A1c=;\n b=gwR5t+5I5znIOkeIRsUUzRPo8EKdKGEaAg2fuDQTGeoHbnfO5UofRS7csebGf9t2zb\n i5ry96h+PBWeSt03Pt9JN9v8siW8l4Zk5UtMfdwbHlQYOTRSq5ZUUXqOwqx2S9eTEecB\n J7w4xRVodMn0QkIuiLaPC8utwSEe2r8SI0pd0a0O5vZcOUUIw8TLmu9oHRdYx0SaTEeu\n RNdHvy0XRn6MpykIKqoOowKAp+EcCBAEbbcQQwvHEVsjZSAPq0Q8IGtWrAQwlRZvz7jZ\n RI1HIyWcaty3SrAUSLLZyWPF22KWZ0/2i5YblXVmS3E8DPYCMd/tvvDpocw47AzB0t6S\n Ygcg=="],"ARC-Seal":"i=1; a=rsa-sha256; t=1775676143; cv=none;\n d=google.com; s=arc-20240605;\n b=gigbRr1vwklKKihCK64KSl4Qro30ygakmVazdeFb5XNxxrgPYXDznKqQ5h8A70rb24\n xkPRam6PSPtScjhwc/GtpGrMvOm1JpgE73lC+Y1/lc7dyvENS2LEL/oj6HI/CIEEIhG6\n 81dhjtu4rYXDs7wYJiSN+VCYqjD4aB8HltPpkPUcloVLiuuC+24RF5olvPCNa57Lp6Sr\n ovyiZfVGwOvoAo56tjllFaX8R2jgJlNVk5+nUkAMNSzl3X4Yo75wsiZPuII3o9Z/Recl\n SEP5oViVJmkDeyIRjFEz+GwK+zJj5YYX+U7/nhZck+x4mhWetZRuxMsJL6n4w3cqr5ZR\n PCMw==","ARC-Message-Signature":"i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com;\n s=arc-20240605;\n h=cc:to:subject:message-id:date:from:in-reply-to:references\n :mime-version:dkim-signature;\n bh=VzpLI4JoNdarYfbRQ9xNI/5ogWnvJcWkOG3+jAa4A1c=;\n fh=M1Q5IIDxPU7nrtIqkOxp+05smWNr/V1Cw40ICQ7seqY=;\n b=aqtwdL+VYCwJnyTxcKwbIwxrw1K9RG3ELL3Osdhyyyuqn+uO7PQ2jNwYTAWROs8KtM\n uqeRSqDcZ763xUYhuizf7tbMZFYoFMxX4R6S5tmcf2Q9JaSMVW9NkSdP6ZX9XRLAYCL/\n sTJL+ETzGdyR9aDEPA6cSNL48tY6Qb/6CR/CgjRyrVqtC88W+vl9ycR7QXI8ZCtJobl7\n m2xdki34nPxPKL/YYbmjfaBJV0L3uOSXKX9VA3T4+FiMBAhgFm08xv9iAzcVFXHe3fzm\n mOvRpha9teGXRYgHSJkubaKFikdh1fZ66ix3ENzPBcFVLubYsfWSwZeCizIdal3kfeUY\n buLA==; darn=nongnu.org","ARC-Authentication-Results":"i=1; mx.google.com; arc=none","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1775676143; x=1776280943;\n h=cc:to:subject:message-id:date:from:in-reply-to:references\n :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date\n :message-id:reply-to;\n bh=VzpLI4JoNdarYfbRQ9xNI/5ogWnvJcWkOG3+jAa4A1c=;\n b=j314Wzn4RafVvXJieuPRkwaYkuyFsGeGQu0mfcmIVr1kr+nVOxK7ZQ6ZJaBWZdy6VE\n 1FZ2P3OMsgofKOgKaUR3acrEoPNShbbcEsjcWP7VSK+mfNEIHlrB9U1ra0lwAuuTNLSH\n 1ux3To0yTKARJQ5jcOST468lzrVABNzXX3yzMJ3PeXTPhLkW8d1Wi+XzXXiPh0/rDjRR\n 1dRlrK3s14TglZuoLzDZrOurrJANUu7EIFeCb+7rc8QaYBvNuACLPOajdr32oAZPvxxc\n NtKloVGIZybGxEFF+4/7LL7LJosNqK8bmTelrH1SvTEcNtZ2OWCFgwNHNVjolzqgLVnn\n N7+A==","X-Gm-Message-State":"AOJu0Ywd8BotGi5ZPxzqv3Y6YStZuNg+SjYZ4rg0hNEHd95I1EPi3dIm\n nODG7c6yimnl1GnLiDO/NlTINrDqDkkGf7qTsRkjhZieLJvwRQlfmYjqIorTw68+WFl0gFZOADP\n SsI4x4siBKJfYuiGeJQvbBjwIToWUztKSAqNY+ryJj/IOq1+i0vp0vnJzNWmPDGCM5bT1ebUWf1\n pB6OhWvCbdrY86i/yZJ9aWLpZIKx8VwRlx","X-Gm-Gg":"AeBDieuiOtX+B18yoTFmp7u4vz4g0/zzdIoI+gSreAqgqVgZY6eYnBiwCW5oBOREJQA\n 4VyLCg3K7+9HdTcv8EUN+unU190GHSt0dvi6oOVWwZ5gDDckZBQbxQWx5SZtcq7u7h1GfOPo2uX\n UpzIiZwzMqlBfeB72KpJXlFoSi+SUuiXUDzhLxruKYZ1BuxG0w/G35TOr1R+ScS7e3ke+Jd1xRx\n Ztv1+E=","X-Received":["by 2002:a53:bb85:0:b0:64f:bdcf:a494 with SMTP id\n 956f58d0204a3-65048873b5dmr15467738d50.58.1775676143031;\n Wed, 08 Apr 2026 12:22:23 -0700 (PDT)","by 2002:a53:bb85:0:b0:64f:bdcf:a494 with SMTP id\n 956f58d0204a3-65048873b5dmr15467709d50.58.1775676142343; Wed, 08 Apr 2026\n 12:22:22 -0700 (PDT)"],"MIME-Version":"1.0","References":"<20260408042149.1902796-1-brian.cain@oss.qualcomm.com>\n <20260408042149.1902796-9-brian.cain@oss.qualcomm.com>","In-Reply-To":"<20260408042149.1902796-9-brian.cain@oss.qualcomm.com>","From":"Sid Manning <sid.manning@oss.qualcomm.com>","Date":"Wed, 8 Apr 2026 14:22:09 -0500","X-Gm-Features":"AQROBzBVK6X0lr-7wENnvmVwCu-KlcSDtSZOkVJ1SFPJp4LRJeIQcJ1NHPRmti0","Message-ID":"\n <CAJpW4SULdJ=zWw+ir3FBaVFvidzwTiHhGZ361A1BETHADThteQ@mail.gmail.com>","Subject":"Re: [PATCH v4 8/9] hw/hexagon: Define hexagon \"virt\" machine","To":"Brian Cain <brian.cain@oss.qualcomm.com>","Cc":"qemu-devel@nongnu.org, philmd@linaro.org, ltaylorsimpson@gmail.com,\n matheus.bernardino@oss.qualcomm.com, marco.liebel@oss.qualcomm.com,\n quic_mburton@quicinc.com, ale@rev.ng, anjo@rev.ng,\n Brian Cain <bcain@quicinc.com>, Paolo Bonzini <pbonzini@redhat.com>,\n Kevin Wolf <kwolf@redhat.com>, Hanna Reitz <hreitz@redhat.com>,\n \"open list:Block layer core\" <qemu-block@nongnu.org>","Content-Type":"multipart/alternative; boundary=\"000000000000b36796064ef7d148\"","X-Authority-Analysis":"v=2.4 cv=Rr716imK c=1 sm=1 tr=0 ts=69d6aaf0 cx=c_pps\n a=S/uc88zpIJVNbziUnJ6G4Q==:117 a=A5OVakUREuEA:10 a=s4-Qcg_JpJYA:10\n a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=eoimf2acIAo5FJnRuUoq:22\n a=EUspDBNiAAAA:8 a=COk6AnOGAAAA:8 a=LZxu0lJlvx2sLTx_hnAA:9 a=QEXdDO2ut3YA:10\n a=cJMQb2-ojAbFt5Aj4qQA:9 a=W7m0g9nuS2lKi5jU:21 a=lqcHg5cX4UMA:10\n a=nd2WpGr1bMy9NW-iytEl:22 a=TjNXssC_j7lpFel5tvFf:22","X-Proofpoint-Spam-Details-Enc":"AW1haW4tMjYwNDA4MDE4MSBTYWx0ZWRfXx/NsFjK2EIWK\n Aaer8fTKguVC5Ig/8BVM4SUyRpcrpP1HeKd9ZNU3wKMjKrI0jD45eg6NU6fr+6SEuKqszEdZZYq\n VDquaWEpiXUO5Zzbh8/jjMeutz0DikGwByjZCRQNY/9mYIZ0/4TEyM1TG74vwUwKOHyO1R0Or11\n 15yEZRcNdNWjcZMRab9KWv3yHkpBoWME5IovxLc8ecxPOuTyJLdciwQ9eIqvnQEFr/QQndfG/jS\n zBy5Zkw4bz0dOdWmkokC8TBZQYJ9F0xyTU+wkx1SnnWE2BsxMSNAN1d/J5Uw6mDmWKkY/aNCeAT\n C3RqF+iUGKMp0JtwdDFqHLolXiUHEBSJ3WFYo0B+Bl7V5aLcgurEV+NTrfn5j9n6eZpr3r1YpBB\n xxJBGcwa0Ly6pUHvNBRcOTfd7Rv0N5wSV0V1soTcrjIfJVdUAO6s5/tNZ/znXNrlHDXAhDc+U1z\n iKKsmiVBlYNcteqLUoQ==","X-Proofpoint-ORIG-GUID":"bNdc0tvdgC55qqlrSqI91NfhBemysanv","X-Proofpoint-GUID":"bNdc0tvdgC55qqlrSqI91NfhBemysanv","X-Proofpoint-Virus-Version":"vendor=baseguard\n engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49\n definitions=2026-04-08_05,2026-04-08_01,2025-10-01_01","X-Proofpoint-Spam-Details":"rule=outbound_notspam policy=outbound score=0\n impostorscore=0 priorityscore=1501 suspectscore=0 malwarescore=0\n clxscore=1015 bulkscore=0 phishscore=0 adultscore=0 spamscore=0\n lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc=\n route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604010000\n definitions=main-2604080181","Received-SPF":"pass client-ip=205.220.168.131;\n envelope-from=sid.manning@oss.qualcomm.com; helo=mx0a-0031df01.pphosted.com","X-Spam_score_int":"-27","X-Spam_score":"-2.8","X-Spam_bar":"--","X-Spam_report":"(-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,\n DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, HTML_MESSAGE=0.001,\n RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001,\n RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_NONE=0.001,\n SPF_PASS=-0.001 autolearn=ham autolearn_force=no","X-Spam_action":"no action","X-Mailman-Approved-At":"Wed, 08 Apr 2026 15:32:16 -0400","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"qemu development <qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<https://lists.nongnu.org/archive/html/qemu-devel>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"}},{"id":3675489,"web_url":"http://patchwork.ozlabs.org/comment/3675489/","msgid":"<CAEqNhNa2=HUbTtvQ-J_8BGTsrW89-aiQJtjs5G4GLn8gNCuPOQ@mail.gmail.com>","list_archive_url":null,"date":"2026-04-09T20:04:04","subject":"Re: [PATCH v4 8/9] hw/hexagon: Define hexagon \"virt\" machine","submitter":{"id":89839,"url":"http://patchwork.ozlabs.org/api/people/89839/","name":"Brian Cain","email":"brian.cain@oss.qualcomm.com"},"content":"On Wed, Apr 8, 2026 at 2:22 PM Sid Manning <sid.manning@oss.qualcomm.com> wrote:\n>\n>\n>\n> On Tue, Apr 7, 2026 at 11:22 PM Brian Cain <brian.cain@oss.qualcomm.com> wrote:\n>>\n>> From: Brian Cain <bcain@quicinc.com>\n>>\n>> Signed-off-by: Brian Cain <brian.cain@oss.qualcomm.com>\n>> ---\n>>  configs/devices/hexagon-softmmu/default.mak |   1 +\n>>  configs/targets/hexagon-softmmu.mak         |   1 +\n>>  include/hw/hexagon/virt.h                   |  43 ++\n>>  hw/hexagon/virt.c                           | 456 ++++++++++++++++++++\n>>  target/hexagon/cpu.c                        |   2 +\n>>  hw/hexagon/Kconfig                          |  10 +\n>>  hw/hexagon/meson.build                      |   2 +\n>>  tests/qemu-iotests/testenv.py               |   1 +\n>>  8 files changed, 516 insertions(+)\n>>  create mode 100644 include/hw/hexagon/virt.h\n>>  create mode 100644 hw/hexagon/virt.c\n>>\n>> diff --git a/configs/devices/hexagon-softmmu/default.mak b/configs/devices/hexagon-softmmu/default.mak\n>> index 08e709aea72..37b4f9f3237 100644\n>> --- a/configs/devices/hexagon-softmmu/default.mak\n>> +++ b/configs/devices/hexagon-softmmu/default.mak\n>> @@ -3,5 +3,6 @@\n>>  # Uncomment the following lines to disable these optional devices:\n>>\n>>  # Boards are selected by default, uncomment to keep out of the build.\n>> +# CONFIG_HEX_VIRT=y\n>>  # CONFIG_HEX_DSP=y\n>>  # CONFIG_L2VIC=y\n>> diff --git a/configs/targets/hexagon-softmmu.mak b/configs/targets/hexagon-softmmu.mak\n>> index fdfa29b4f39..a77c100f0c5 100644\n>> --- a/configs/targets/hexagon-softmmu.mak\n>> +++ b/configs/targets/hexagon-softmmu.mak\n>> @@ -5,3 +5,4 @@ TARGET_XML_FILES=hexagon-core.xml hexagon-hvx.xml\n>>  TARGET_LONG_BITS=32\n>>  TARGET_NOT_USING_LEGACY_LDST_PHYS_API=y\n>>  TARGET_NOT_USING_LEGACY_NATIVE_ENDIAN_API=y\n>> +TARGET_NEED_FDT=y\n>> diff --git a/include/hw/hexagon/virt.h b/include/hw/hexagon/virt.h\n>> new file mode 100644\n>> index 00000000000..a54eac5cf00\n>> --- /dev/null\n>> +++ b/include/hw/hexagon/virt.h\n>> @@ -0,0 +1,43 @@\n>> +/*\n>> + * Definitions for hexagon virt board.\n>> + *\n>> + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.\n>> + * SPDX-License-Identifier: GPL-2.0-or-later\n>> + */\n>> +\n>> +#ifndef HW_HEXAGONVIRT_H\n>> +#define HW_HEXAGONVIRT_H\n>> +\n>> +#include \"hw/core/boards.h\"\n>> +#include \"target/hexagon/cpu.h\"\n>> +\n>> +struct HexagonVirtMachineState {\n>> +    /*< private >*/\n>> +    MachineState parent_obj;\n>> +\n>> +    int fdt_size;\n>> +    MemoryRegion *sys;\n>> +    MemoryRegion cfgtable;\n>> +    MemoryRegion ram;\n>> +    MemoryRegion tcm;\n>> +    MemoryRegion vtcm;\n>> +    MemoryRegion bios;\n>> +    DeviceState *l2vic;\n>> +    Clock *apb_clk;\n>> +};\n>> +\n>> +void hexagon_load_fdt(const struct HexagonVirtMachineState *vms);\n>> +\n>> +enum {\n>> +    VIRT_UART0,\n>> +    VIRT_QTMR0,\n>> +    VIRT_QTMR1,\n>> +    VIRT_GPT,\n>> +    VIRT_MMIO,\n>> +    VIRT_FDT,\n>> +};\n>> +\n>> +#define TYPE_HEXAGON_VIRT_MACHINE MACHINE_TYPE_NAME(\"virt\")\n>> +OBJECT_DECLARE_SIMPLE_TYPE(HexagonVirtMachineState, HEXAGON_VIRT_MACHINE)\n>> +\n>> +#endif /* HW_HEXAGONVIRT_H */\n>> diff --git a/hw/hexagon/virt.c b/hw/hexagon/virt.c\n>> new file mode 100644\n>> index 00000000000..49ee1aad2fe\n>> --- /dev/null\n>> +++ b/hw/hexagon/virt.c\n>> @@ -0,0 +1,456 @@\n>> +/*\n>> + * Hexagon virt emulation\n>> + *\n>> + * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.\n>> + * SPDX-License-Identifier: GPL-2.0-or-later\n>> + */\n>> +\n>> +#include \"qemu/osdep.h\"\n>> +#include \"qapi/error.h\"\n>> +#include \"hw/hexagon/virt.h\"\n>> +#include \"elf.h\"\n>> +#include \"hw/char/pl011.h\"\n>> +#include \"hw/core/clock.h\"\n>> +#include \"hw/core/sysbus-fdt.h\"\n>> +#include \"hw/hexagon/hexagon.h\"\n>> +#include \"hw/hexagon/hexagon_globalreg.h\"\n>> +#include \"hw/hexagon/hexagon_tlb.h\"\n>> +#include \"hw/core/loader.h\"\n>> +#include \"hw/core/qdev-properties.h\"\n>> +#include \"hw/core/qdev-clock.h\"\n>> +#include \"hw/core/register.h\"\n>> +#include \"qemu/error-report.h\"\n>> +#include \"qemu/guest-random.h\"\n>> +#include \"qemu/units.h\"\n>> +#include \"elf.h\"\n>> +#include \"machine_cfg_v68n_1024.h.inc\"\n>> +#include \"system/address-spaces.h\"\n>> +#include \"system/device_tree.h\"\n>> +#include \"system/reset.h\"\n>> +#include \"system/system.h\"\n>> +#include <libfdt.h>\n>> +\n>> +static const int VIRTIO_DEV_COUNT = 8;\n>> +\n>> +static const MemMapEntry base_memmap[] = {\n>> +    [VIRT_UART0] = { 0x10000000, 0x00000200 },\n>> +    [VIRT_MMIO] = { 0x11000000, 0x1000000, },\n>> +    [VIRT_GPT] = { 0xab000000, 0x00001000 },\n>> +    [VIRT_FDT] = { 0x99800000, 0x00400000 },\n>> +};\n>> +\n>> +static const int irqmap[] = {\n>> +    [VIRT_MMIO] = 18, /* ...to 18 + VIRTIO_DEV_COUNT - 1 */\n>> +    [VIRT_GPT] = 12,\n>> +    [VIRT_UART0] = 15,\n>> +    [VIRT_QTMR0] = 2,\n>> +    [VIRT_QTMR1] = 4,\n>> +};\n>> +\n>> +\n>> +static void create_fdt(HexagonVirtMachineState *vms)\n>> +{\n>> +    MachineState *ms = MACHINE(vms);\n>> +    void *fdt = create_device_tree(&vms->fdt_size);\n>> +    uint8_t rng_seed[32];\n>> +\n>> +    if (!fdt) {\n>> +        error_report(\"create_device_tree() failed\");\n>> +        exit(1);\n>> +    }\n>> +\n>> +    ms->fdt = fdt;\n>> +\n>> +    qemu_fdt_setprop_cell(fdt, \"/\", \"#address-cells\", 0x2);\n>> +    qemu_fdt_setprop_cell(fdt, \"/\", \"#size-cells\", 0x1);\n>> +    qemu_fdt_setprop_string(fdt, \"/\", \"model\", \"hexagon-virt,qemu\");\n>> +    qemu_fdt_setprop_string(fdt, \"/\", \"compatible\", \"qcom,sm8150\");\n>> +\n>> +    qemu_fdt_add_subnode(fdt, \"/soc\");\n>> +    qemu_fdt_setprop_cell(fdt, \"/soc\", \"#address-cells\", 0x2);\n>> +    qemu_fdt_setprop_cell(fdt, \"/soc\", \"#size-cells\", 0x1);\n>> +    qemu_fdt_setprop(fdt, \"/soc\", \"ranges\", NULL, 0);\n>> +\n>> +    qemu_fdt_add_subnode(fdt, \"/chosen\");\n>> +    qemu_guest_getrandom_nofail(rng_seed, sizeof(rng_seed));\n>> +    qemu_fdt_setprop(fdt, \"/chosen\", \"rng-seed\", rng_seed, sizeof(rng_seed));\n>> +}\n>> +\n>> +static void fdt_add_hvx(HexagonVirtMachineState *vms,\n>> +                        const struct hexagon_machine_config *m_cfg,\n>> +                        Error **errp)\n>> +{\n>> +    const MachineState *ms = MACHINE(vms);\n>> +    uint32_t vtcm_size_bytes = m_cfg->cfgtable.vtcm_size_kb * 1024;\n>> +    if (vtcm_size_bytes > 0) {\n>> +        memory_region_init_ram(&vms->vtcm, NULL, \"vtcm.ram\", vtcm_size_bytes,\n>> +                               errp);\n>> +        memory_region_add_subregion(vms->sys, m_cfg->cfgtable.vtcm_base << 16,\n>> +                                    &vms->vtcm);\n>> +\n>> +        qemu_fdt_add_subnode(ms->fdt, \"/soc/vtcm\");\n>> +        qemu_fdt_setprop_string(ms->fdt, \"/soc/vtcm\", \"compatible\",\n>> +                                \"qcom,hexagon_vtcm\");\n>> +\n>> +        assert(sizeof(m_cfg->cfgtable.vtcm_base) == sizeof(uint32_t));\n>> +        qemu_fdt_setprop_cells(ms->fdt, \"/soc/vtcm\", \"reg\", 0,\n>> +                               m_cfg->cfgtable.vtcm_base << 16,\n>> +                               vtcm_size_bytes);\n>> +    }\n>> +\n>> +    if (m_cfg->cfgtable.ext_contexts > 0) {\n>> +        qemu_fdt_add_subnode(ms->fdt, \"/soc/hvx\");\n>> +        qemu_fdt_setprop_string(ms->fdt, \"/soc/hvx\", \"compatible\",\n>> +                                \"qcom,hexagon-hvx\");\n>> +        qemu_fdt_setprop_cells(ms->fdt, \"/soc/hvx\", \"qcom,hvx-max-ctxts\",\n>> +                               m_cfg->cfgtable.ext_contexts);\n>> +        qemu_fdt_setprop_cells(ms->fdt, \"/soc/hvx\", \"qcom,hvx-vlength\",\n>> +                               m_cfg->cfgtable.hvx_vec_log_length);\n>> +    }\n>> +}\n>> +\n>> +static int32_t irq_hvm_ic_phandle = -1;\n>> +static void fdt_add_hvm_pic_node(HexagonVirtMachineState *vms,\n>> +                                 const struct hexagon_machine_config *m_cfg)\n>> +{\n>> +    MachineState *ms = MACHINE(vms);\n>> +    irq_hvm_ic_phandle = qemu_fdt_alloc_phandle(ms->fdt);\n>> +\n>> +    qemu_fdt_setprop_cell(ms->fdt, \"/soc\", \"interrupt-parent\",\n>> +                          irq_hvm_ic_phandle);\n>> +\n>> +    qemu_fdt_add_subnode(ms->fdt, \"/soc/interrupt-controller\");\n>> +    qemu_fdt_setprop_cell(ms->fdt, \"/soc/interrupt-controller\",\n>> +                          \"#address-cells\", 2);\n>> +    qemu_fdt_setprop_cell(ms->fdt, \"/soc/interrupt-controller\",\n>> +                          \"#interrupt-cells\", 2);\n>> +    qemu_fdt_setprop_string(ms->fdt, \"/soc/interrupt-controller\", \"compatible\",\n>> +                            \"qcom,h2-pic,hvm-pic\");\n>> +    qemu_fdt_setprop(ms->fdt, \"/soc/interrupt-controller\",\n>> +                     \"interrupt-controller\", NULL, 0);\n>> +    qemu_fdt_setprop_cell(ms->fdt, \"/soc/interrupt-controller\", \"phandle\",\n>> +                          irq_hvm_ic_phandle);\n>> +\n>> +    sysbus_mmio_map(SYS_BUS_DEVICE(vms->l2vic), 1,\n>> +                    m_cfg->cfgtable.fastl2vic_base << 16);\n>> +}\n>> +\n>> +\n>> +static void fdt_add_gpt_node(HexagonVirtMachineState *vms)\n>> +{\n>> +    g_autofree char *name = NULL;\n>> +    MachineState *ms = MACHINE(vms);\n>> +\n>> +    name = g_strdup_printf(\"/soc/gpt@%\" PRIx64,\n>> +                           (int64_t)base_memmap[VIRT_GPT].base);\n>> +    qemu_fdt_add_subnode(ms->fdt, name);\n>> +    qemu_fdt_setprop_string(ms->fdt, name, \"compatible\",\n>> +                            \"qcom,h2-timer,hvm-timer\");\n>> +    qemu_fdt_setprop_cells(ms->fdt, name, \"interrupts\", irqmap[VIRT_GPT], 0);\n>> +    qemu_fdt_setprop_cells(ms->fdt, name, \"reg\", 0x0,\n>> +                           base_memmap[VIRT_GPT].base,\n>> +                           base_memmap[VIRT_GPT].size);\n>> +}\n>> +\n>> +static int32_t clock_phandle = -1;\n>> +static void fdt_add_clocks(const HexagonVirtMachineState *vms)\n>> +{\n>> +    MachineState *ms = MACHINE(vms);\n>> +    clock_phandle = qemu_fdt_alloc_phandle(ms->fdt);\n>> +    qemu_fdt_add_subnode(ms->fdt, \"/apb-pclk\");\n>> +    qemu_fdt_setprop_string(ms->fdt, \"/apb-pclk\", \"compatible\", \"fixed-clock\");\n>> +    qemu_fdt_setprop_cell(ms->fdt, \"/apb-pclk\", \"#clock-cells\", 0x0);\n>> +    qemu_fdt_setprop_cell(ms->fdt, \"/apb-pclk\", \"clock-frequency\", 24000000);\n>> +    qemu_fdt_setprop_string(ms->fdt, \"/apb-pclk\", \"clock-output-names\",\n>> +                            \"clk24mhz\");\n>> +    qemu_fdt_setprop_cell(ms->fdt, \"/apb-pclk\", \"phandle\", clock_phandle);\n>> +}\n>> +\n>> +static void fdt_add_uart(const HexagonVirtMachineState *vms, int uart)\n>> +{\n>> +    char *nodename;\n>> +    hwaddr base = base_memmap[uart].base;\n>> +    hwaddr size = base_memmap[uart].size;\n>> +    assert(uart == 0);\n>> +    int irq = irqmap[VIRT_UART0 + uart];\n>> +    const char compat[] = \"arm,pl011\\0arm,primecell\";\n>> +    const char clocknames[] = \"uartclk\\0apb_pclk\";\n>> +    MachineState *ms = MACHINE(vms);\n>> +    DeviceState *dev;\n>> +    SysBusDevice *s;\n>> +\n>> +    dev = qdev_new(TYPE_PL011);\n>> +    s = SYS_BUS_DEVICE(dev);\n>> +    qdev_prop_set_chr(dev, \"chardev\", serial_hd(0));\n>> +    qdev_connect_clock_in(dev, \"clk\", vms->apb_clk);\n>> +    sysbus_realize_and_unref(s, &error_fatal);\n>> +    sysbus_mmio_map(s, 0, base);\n>> +    if (vms->l2vic) {\n>> +        sysbus_connect_irq(s, 0, qdev_get_gpio_in(vms->l2vic, irq));\n>> +    }\n>> +\n>> +    nodename = g_strdup_printf(\"/pl011@%\" PRIx64, base);\n>> +    qemu_fdt_add_subnode(ms->fdt, nodename);\n>> +\n>> +    /* Note that we can't use setprop_string because of the embedded NUL */\n>> +    qemu_fdt_setprop(ms->fdt, nodename, \"compatible\", compat, sizeof(compat));\n>> +    qemu_fdt_setprop_cells(ms->fdt, nodename, \"reg\", 0, base, size);\n>> +    if (vms->l2vic) {\n>> +        qemu_fdt_setprop_cells(ms->fdt, nodename, \"interrupts\",\n>> +                               32 + irq, 0);\n>> +        qemu_fdt_setprop_cell(ms->fdt, nodename, \"interrupt-parent\",\n>> +                              irq_hvm_ic_phandle);\n>> +    }\n>> +    qemu_fdt_setprop_cells(ms->fdt, nodename, \"clocks\", clock_phandle,\n>> +                           clock_phandle);\n>> +    qemu_fdt_setprop(ms->fdt, nodename, \"clock-names\", clocknames,\n>> +                     sizeof(clocknames));\n>> +\n>> +    qemu_fdt_setprop_string(ms->fdt, \"/chosen\", \"stdout-path\", nodename);\n>> +    qemu_fdt_add_subnode(ms->fdt, \"/aliases\");\n>> +    qemu_fdt_setprop_string(ms->fdt, \"/aliases\", \"serial0\", nodename);\n>> +\n>> +    g_free(nodename);\n>> +}\n>> +\n>> +static void fdt_add_cpu_nodes(const HexagonVirtMachineState *vms)\n>> +{\n>> +    MachineState *ms = MACHINE(vms);\n>> +    qemu_fdt_add_subnode(ms->fdt, \"/cpus\");\n>> +    qemu_fdt_setprop_cell(ms->fdt, \"/cpus\", \"#address-cells\", 0x1);\n>> +    qemu_fdt_setprop_cell(ms->fdt, \"/cpus\", \"#size-cells\", 0x0);\n>> +\n>> +    /* cpu nodes */\n>> +    for (int num = ms->smp.cpus - 1; num >= 0; num--) {\n>> +        char *nodename = g_strdup_printf(\"/cpus/cpu@%d\", num);\n>> +        qemu_fdt_add_subnode(ms->fdt, nodename);\n>> +        qemu_fdt_setprop_string(ms->fdt, nodename, \"device_type\", \"cpu\");\n>> +        qemu_fdt_setprop_cell(ms->fdt, nodename, \"reg\", num);\n>> +        qemu_fdt_setprop_cell(ms->fdt, nodename, \"phandle\",\n>> +                              qemu_fdt_alloc_phandle(ms->fdt));\n>> +        g_free(nodename);\n>> +    }\n>> +}\n>> +\n>> +\n>> +static void fdt_add_virtio_devices(const HexagonVirtMachineState *vms)\n>> +{\n>> +    MachineState *ms = MACHINE(vms);\n>> +    /* VirtIO MMIO devices */\n>> +    for (int i = 0; i < VIRTIO_DEV_COUNT; i++) {\n>> +        char *nodename;\n>> +        int irq = irqmap[VIRT_MMIO] + i;\n>> +        size_t size = base_memmap[VIRT_MMIO].size;\n>> +        hwaddr base = base_memmap[VIRT_MMIO].base + i * size;\n>> +\n>> +        nodename = g_strdup_printf(\"/virtio_mmio@%\" PRIx64, base);\n>> +        qemu_fdt_add_subnode(ms->fdt, nodename);\n>> +        qemu_fdt_setprop_string(ms->fdt, nodename, \"compatible\", \"virtio,mmio\");\n>> +        qemu_fdt_setprop_sized_cells(ms->fdt, nodename, \"reg\", 2, base, 1,\n>> +                                     size);\n>> +        qemu_fdt_setprop_cells(ms->fdt, nodename, \"interrupts\", irq, 0);\n>> +        qemu_fdt_setprop_cell(ms->fdt, nodename, \"interrupt-parent\",\n>> +                              irq_hvm_ic_phandle);\n>> +\n>> +        sysbus_create_simple(\n>> +            \"virtio-mmio\", base,\n>> +            qdev_get_gpio_in(vms->l2vic, irqmap[VIRT_MMIO] + i));\n>> +\n>> +        g_free(nodename);\n>> +    }\n>> +}\n>> +\n>> +static void virt_instance_init(Object *obj)\n>> +{\n>> +    HexagonVirtMachineState *vms = HEXAGON_VIRT_MACHINE(obj);\n>> +\n>> +    create_fdt(vms);\n>> +}\n>> +\n>> +void hexagon_load_fdt(const HexagonVirtMachineState *vms)\n>> +{\n>> +    MachineState *ms = MACHINE(vms);\n>> +    hwaddr fdt_addr = base_memmap[VIRT_FDT].base;\n>> +    uint32_t fdtsize = vms->fdt_size;\n>> +\n>> +    g_assert(fdtsize <= base_memmap[VIRT_FDT].size);\n>> +    /* copy in the device tree */\n>> +    rom_add_blob_fixed_as(\"fdt\", ms->fdt, fdtsize, fdt_addr,\n>> +                          &address_space_memory);\n>> +    qemu_register_reset_nosnapshotload(\n>> +        qemu_fdt_randomize_seeds,\n>> +        rom_ptr_for_as(&address_space_memory, fdt_addr, fdtsize));\n>> +}\n>> +\n>> +static uint64_t load_kernel(const HexagonVirtMachineState *vms)\n>> +{\n>> +    MachineState *ms = MACHINE(vms);\n>> +    uint64_t entry = 0;\n>> +    if (load_elf_ram_sym(ms->kernel_filename, NULL, NULL, NULL, &entry, NULL,\n>> +                         NULL, NULL, 0, EM_HEXAGON, 0, 0, &address_space_memory,\n>> +                         false, NULL) > 0) {\n>> +        return entry;\n>> +    }\n>> +    error_report(\"error loading '%s'\", ms->kernel_filename);\n>> +    exit(1);\n>> +}\n>> +\n>> +static uint64_t load_bios(HexagonVirtMachineState *vms)\n>> +{\n>> +    MachineState *ms = MACHINE(vms);\n>> +    uint64_t bios_addr = 0x0;  /* Load BIOS at reset vector address 0x0 */\n>> +    int bios_size;\n>> +\n>> +    bios_size = load_image_targphys(ms->firmware ?: \"\",\n>> +                                    bios_addr, 64 * 1024, NULL);\n>> +    if (bios_size < 0) {\n>> +        error_report(\"Could not load BIOS '%s'\", ms->firmware ?: \"\");\n>> +        exit(1);\n>> +    }\n>> +\n>> +    return bios_addr;  /* Return entry point at address 0x0 */\n>> +}\n>> +\n>> +static void do_cpu_reset(void *opaque)\n>> +{\n>> +    HexagonCPU *cpu = opaque;\n>> +    CPUState *cs = CPU(cpu);\n>> +    cpu_reset(cs);\n>> +}\n>> +\n>> +static void virt_init(MachineState *ms)\n>> +{\n>> +    HexagonVirtMachineState *vms = HEXAGON_VIRT_MACHINE(ms);\n>> +    const struct hexagon_machine_config *m_cfg = &v68n_1024;\n>\n> This is v68 but in virt_class_init  mc->default_cpu_type is set to v73, should that be 68?\n\nFixed these, thanks Sid!\n\nhttps://github.com/quic/qemu/tree/bcain/sysemu_review  e5f9d63 has the\nrequested changes, will give it a ~couple of days and send a new round\nof patches for review w/the fixes.\n\nHere's a range-diff:\n\n 1:  d2341f42a80 !  1:  846fe3f0958 hw/hexagon: Add globalreg model\n    @@ Commit message\n         interface to the system registers.\n\n         Signed-off-by: Brian Cain <brian.cain@oss.qualcomm.com>\n    +    Reviewed-by: Sid Manning <sid.manning@oss.qualcomm.com>\n\n      ## include/hw/hexagon/hexagon_globalreg.h (new) ##\n     @@\n    @@ hw/hexagon/hexagon_globalreg.c (new)\n     +    s->regs[HEX_SREG_PMUCNT7] = INVALID_REG_VAL;\n     +}\n     +\n    -+static void hexagon_globalreg_realize(DeviceState *dev, Error **errp)\n    -+{\n    -+}\n    -+\n     +void hexagon_globalreg_reset(HexagonGlobalRegState *s)\n     +{\n     +    do_hexagon_globalreg_reset(s);\n    @@ hw/hexagon/hexagon_globalreg.c (new)\n     +    DeviceClass *dc = DEVICE_CLASS(klass);\n     +    ResettableClass *rc = RESETTABLE_CLASS(klass);\n     +\n    -+    dc->realize = hexagon_globalreg_realize;\n     +    rc->phases.hold = hexagon_globalreg_reset_hold;\n     +    dc->vmsd = &vmstate_hexagon_globalreg;\n     +    dc->user_creatable = false;\n 2:  21483a7154e =  2:  e3ed41133e7 hw/hexagon: Add global register tracing\n 3:  76011b26056 =  3:  735792b3493 hw/hexagon: Add machine configs for sysemu\n 4:  8b58db4d79b =  4:  9bbc363926a hw/hexagon: Add v68, sa8775-cdsp0 defs\n 5:  50c227946bc =  5:  db09e484815 hw/hexagon: Add support for cfgbase\n 6:  58150cb26eb =  6:  ad4b71cf913 hw/hexagon: Modify \"Standalone\" symbols\n 7:  d6a21abad25 =  7:  81f67470f1f target/hexagon: add build config for softmmu\n 8:  fdfbf4bd5f5 !  8:  48c194c1b33 hw/hexagon: Define hexagon \"virt\" machine\n    @@ hw/hexagon/virt.c (new)\n     +    cpu_model = ms->cpu_type;\n     +\n     +    if (!cpu_model) {\n    -+        cpu_model = HEXAGON_CPU_TYPE_NAME(\"v73\");\n    ++        cpu_model = HEXAGON_CPU_TYPE_NAME(\"v68\");\n     +    }\n     +\n     +    gsregs_dev = qdev_new(TYPE_HEXAGON_GLOBALREG);\n    @@ hw/hexagon/virt.c (new)\n     +\n     +    mc->desc = \"Hexagon Virtual Machine\";\n     +    mc->init = virt_init;\n    -+    mc->default_cpu_type = HEXAGON_CPU_TYPE_NAME(\"v73\");\n    ++    mc->default_cpu_type = HEXAGON_CPU_TYPE_NAME(\"v68\");\n     +    mc->default_ram_size = 4 * GiB;\n     +    mc->max_cpus = 8;\n     +    mc->default_cpus = 8;\n 9:  8e81fac5f64 =  9:  e5f9d632610 tests/qtest: Add hexagon boot-serial-test\n\n\n\n\n\n>> +    const char *cpu_model;\n>> +    DeviceState *gsregs_dev;\n>> +    DeviceState *tlb_dev;\n>> +    HexagonCPU *cpu_0;\n>> +\n>> +    qemu_fdt_setprop_string(ms->fdt, \"/chosen\", \"bootargs\", ms->kernel_cmdline);\n>> +\n>> +    vms->sys = get_system_memory();\n>> +\n>> +    /* Create APB clock for peripherals */\n>> +    vms->apb_clk = clock_new(OBJECT(ms), \"apb-pclk\");\n>> +    clock_set_hz(vms->apb_clk, 24000000);\n>> +\n>> +    memory_region_init_ram(&vms->ram, NULL, \"ddr.ram\", ms->ram_size,\n>> +                           &error_fatal);\n>> +    memory_region_add_subregion(vms->sys, 0x0, &vms->ram);\n>> +\n>> +    if (m_cfg->l2tcm_size) {\n>> +        memory_region_init_ram(&vms->tcm, NULL, \"tcm.ram\", m_cfg->l2tcm_size,\n>> +                               &error_fatal);\n>> +        memory_region_add_subregion(vms->sys, m_cfg->cfgtable.l2tcm_base << 16,\n>> +                                    &vms->tcm);\n>> +    }\n>> +\n>> +    memory_region_init_rom(&vms->cfgtable, NULL, \"config_table.rom\",\n>> +                           sizeof(m_cfg->cfgtable), &error_fatal);\n>> +    memory_region_add_subregion(vms->sys, m_cfg->cfgbase, &vms->cfgtable);\n>> +    fdt_add_hvx(vms, m_cfg, &error_fatal);\n>> +    cpu_model = ms->cpu_type;\n>> +\n>> +    if (!cpu_model) {\n>> +        cpu_model = HEXAGON_CPU_TYPE_NAME(\"v73\");\n>> +    }\n>> +\n>> +    gsregs_dev = qdev_new(TYPE_HEXAGON_GLOBALREG);\n>> +    object_property_add_child(OBJECT(ms), \"global-regs\", OBJECT(gsregs_dev));\n>> +    qdev_prop_set_uint64(gsregs_dev, \"config-table-addr\", m_cfg->cfgbase);\n>> +    qdev_prop_set_uint32(gsregs_dev, \"dsp-rev\", v68_rev);\n>> +    sysbus_realize_and_unref(SYS_BUS_DEVICE(gsregs_dev), &error_fatal);\n>> +\n>> +    tlb_dev = qdev_new(TYPE_HEXAGON_TLB);\n>> +    object_property_add_child(OBJECT(ms), \"tlb\", OBJECT(tlb_dev));\n>> +    qdev_prop_set_uint32(tlb_dev, \"num-entries\",\n>> +                         m_cfg->cfgtable.jtlb_size_entries);\n>> +    sysbus_realize_and_unref(SYS_BUS_DEVICE(tlb_dev), &error_fatal);\n>> +\n>> +    cpu_0 = NULL;\n>> +    for (int i = 0; i < ms->smp.cpus; i++) {\n>> +        HexagonCPU *cpu = HEXAGON_CPU(object_new(ms->cpu_type));\n>> +        qemu_register_reset(do_cpu_reset, cpu);\n>> +\n>> +        if (i == 0) {\n>> +            cpu_0 = cpu;\n>> +            if (ms->kernel_filename) {\n>> +                uint64_t entry = load_kernel(vms);\n>> +                qdev_prop_set_uint32(DEVICE(cpu_0), \"exec-start-addr\", entry);\n>> +            } else if (ms->firmware) {\n>> +                uint64_t entry = load_bios(vms);\n>> +                qdev_prop_set_uint32(DEVICE(cpu_0), \"exec-start-addr\", entry);\n>> +            }\n>> +        }\n>> +        qdev_prop_set_uint32(DEVICE(cpu), \"htid\", i);\n>> +        qdev_prop_set_bit(DEVICE(cpu), \"start-powered-off\", (i != 0));\n>> +        object_property_set_link(OBJECT(cpu), \"global-regs\",\n>> +                                 OBJECT(gsregs_dev), &error_fatal);\n>> +        object_property_set_link(OBJECT(cpu), \"tlb\",\n>> +                                 OBJECT(tlb_dev), &error_fatal);\n>> +\n>> +        if (!qdev_realize_and_unref(DEVICE(cpu), NULL, &error_fatal)) {\n>> +            return;\n>> +        }\n>> +    }\n>> +    /* TODO: enable l2vic when l2vic device arrives */\n>> +    if (object_class_by_name(\"l2vic\")) {\n>> +        vms->l2vic = sysbus_create_varargs(\n>> +            \"l2vic\", m_cfg->l2vic_base,\n>> +            qdev_get_gpio_in(DEVICE(cpu_0), 0),\n>> +            qdev_get_gpio_in(DEVICE(cpu_0), 1),\n>> +            qdev_get_gpio_in(DEVICE(cpu_0), 2),\n>> +            qdev_get_gpio_in(DEVICE(cpu_0), 3),\n>> +            qdev_get_gpio_in(DEVICE(cpu_0), 4),\n>> +            qdev_get_gpio_in(DEVICE(cpu_0), 5),\n>> +            qdev_get_gpio_in(DEVICE(cpu_0), 6),\n>> +            qdev_get_gpio_in(DEVICE(cpu_0), 7), NULL);\n>> +\n>> +        fdt_add_hvm_pic_node(vms, m_cfg);\n>> +        fdt_add_virtio_devices(vms);\n>> +        fdt_add_gpt_node(vms);\n>> +    }\n>> +\n>> +    fdt_add_cpu_nodes(vms);\n>> +    fdt_add_clocks(vms);\n>> +    fdt_add_uart(vms, VIRT_UART0);\n>> +\n>> +    rom_add_blob_fixed_as(\"config_table.rom\", &m_cfg->cfgtable,\n>> +                          sizeof(m_cfg->cfgtable), m_cfg->cfgbase,\n>> +                          &address_space_memory);\n>> +\n>> +\n>> +    hexagon_load_fdt(vms);\n>> +}\n>> +\n>> +\n>> +static void virt_class_init(ObjectClass *oc, const void *data)\n>> +{\n>> +    MachineClass *mc = MACHINE_CLASS(oc);\n>> +\n>> +    mc->desc = \"Hexagon Virtual Machine\";\n>> +    mc->init = virt_init;\n>> +    mc->default_cpu_type = HEXAGON_CPU_TYPE_NAME(\"v73\");\n>> +    mc->default_ram_size = 4 * GiB;\n>> +    mc->max_cpus = 8;\n>> +    mc->default_cpus = 8;\n>> +    mc->is_default = false;\n>> +    mc->default_kernel_irqchip_split = false;\n>> +    mc->block_default_type = IF_VIRTIO;\n>> +    mc->default_boot_order = NULL;\n>> +    mc->no_cdrom = 1;\n>> +    mc->numa_mem_supported = false;\n>> +    mc->default_nic = \"virtio-mmio-bus\";\n>> +}\n>> +\n>> +\n>> +static const TypeInfo virt_machine_types[] = { {\n>> +    .name = TYPE_HEXAGON_VIRT_MACHINE,\n>> +    .parent = TYPE_MACHINE,\n>> +    .instance_size = sizeof(HexagonVirtMachineState),\n>> +    .class_init = virt_class_init,\n>> +    .instance_init = virt_instance_init,\n>> +} };\n>> +\n>> +DEFINE_TYPES(virt_machine_types)\n>> diff --git a/target/hexagon/cpu.c b/target/hexagon/cpu.c\n>> index 355abb4fd24..01781a76caf 100644\n>> --- a/target/hexagon/cpu.c\n>> +++ b/target/hexagon/cpu.c\n>> @@ -68,6 +68,8 @@ static ObjectClass *hexagon_cpu_class_by_name(const char *cpu_model)\n>>\n>>  static const Property hexagon_cpu_properties[] = {\n>>  #if !defined(CONFIG_USER_ONLY)\n>> +    DEFINE_PROP_LINK(\"tlb\", HexagonCPU, tlb, TYPE_HEXAGON_TLB,\n>> +                     HexagonTLBState *),\n>>      DEFINE_PROP_UINT32(\"exec-start-addr\", HexagonCPU, boot_addr, 0xffffffff),\n>>      DEFINE_PROP_LINK(\"global-regs\", HexagonCPU, globalregs,\n>>          TYPE_HEXAGON_GLOBALREG, HexagonGlobalRegState *),\n>> diff --git a/hw/hexagon/Kconfig b/hw/hexagon/Kconfig\n>> index 7b9577f68f7..dc74751d21e 100644\n>> --- a/hw/hexagon/Kconfig\n>> +++ b/hw/hexagon/Kconfig\n>> @@ -3,3 +3,13 @@ config HEX_DSP\n>>      default y\n>>      depends on HEXAGON && TCG\n>>      imply PTIMER\n>> +\n>> +config HEX_VIRT\n>> +    bool\n>> +    default y\n>> +    depends on HEX_DSP && FDT\n>> +    select DEVICE_TREE\n>> +    select VIRTIO_MMIO\n>> +    select PL011\n>> +    select VIRTIO_BLK\n>> +    select VIRTIO_SCSI\n>> diff --git a/hw/hexagon/meson.build b/hw/hexagon/meson.build\n>> index f528d2bc4ab..5b6a5e11a17 100644\n>> --- a/hw/hexagon/meson.build\n>> +++ b/hw/hexagon/meson.build\n>> @@ -4,3 +4,5 @@ hexagon_ss.add(files('hexagon_globalreg.c'))\n>>  hexagon_ss.add(when: 'CONFIG_HEX_DSP', if_true: files('hexagon_dsp.c'))\n>>\n>>  hw_arch += {'hexagon': hexagon_ss}\n>> +\n>> +hexagon_ss.add(when: 'CONFIG_HEX_VIRT', if_true: files('virt.c'))\n>> diff --git a/tests/qemu-iotests/testenv.py b/tests/qemu-iotests/testenv.py\n>> index c357e6ebf50..86bcdf7cfad 100644\n>> --- a/tests/qemu-iotests/testenv.py\n>> +++ b/tests/qemu-iotests/testenv.py\n>> @@ -259,6 +259,7 @@ def __init__(self, source_dir: str, build_dir: str,\n>>              ('arm', 'virt'),\n>>              ('aarch64', 'virt'),\n>>              ('avr', 'mega2560'),\n>> +            ('hexagon', 'virt'),\n>>              ('m68k', 'virt'),\n>>              ('or1k', 'virt'),\n>>              ('riscv32', 'virt'),\n>> --\n>> 2.34.1\n>>","headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=qualcomm.com header.i=@qualcomm.com header.a=rsa-sha256\n header.s=qcppdkim1 header.b=iBOXAbxz;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com\n header.a=rsa-sha256 header.s=google header.b=Lbnf62LS;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)"],"Received":["from lists.gnu.org (lists1p.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fs9sK0Yjvz1yHG\n\tfor <incoming@patchwork.ozlabs.org>; Fri, 10 Apr 2026 06:05:23 +1000 (AEST)","from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1wAvcD-0006Af-Ja; Thu, 09 Apr 2026 16:04:37 -0400","from eggs.gnu.org ([2001:470:142:3::10])\n by lists1p.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <brian.cain@oss.qualcomm.com>)\n id 1wAvcC-0006AP-6M\n for qemu-devel@nongnu.org; Thu, 09 Apr 2026 16:04:36 -0400","from mx0a-0031df01.pphosted.com ([205.220.168.131])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <brian.cain@oss.qualcomm.com>)\n id 1wAvc1-0007iX-HD\n for qemu-devel@nongnu.org; Thu, 09 Apr 2026 16:04:28 -0400","from pps.filterd (m0279862.ppops.net [127.0.0.1])\n by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id\n 639G2pYH2247197\n for <qemu-devel@nongnu.org>; Thu, 9 Apr 2026 20:04:23 GMT","from mail-dl1-f71.google.com (mail-dl1-f71.google.com\n [74.125.82.71])\n by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4de3s6uqr2-1\n (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT)\n for <qemu-devel@nongnu.org>; Thu, 09 Apr 2026 20:04:22 +0000 (GMT)","by mail-dl1-f71.google.com with SMTP id\n a92af1059eb24-126e8ee6227so1732383c88.0\n for <qemu-devel@nongnu.org>; Thu, 09 Apr 2026 13:04:22 -0700 (PDT)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h=\n cc:content-transfer-encoding:content-type:date:from:in-reply-to\n :message-id:mime-version:references:subject:to; s=qcppdkim1; bh=\n vYvoKDx6ePzvZt2YkP1XKAMQOei9zq2HmsiBrTdLUqc=; b=iBOXAbxzAIk82Bs6\n /lPEaiNphm8Qk9sJabxoY0MjY5S21fp8rpI/JKKViaH9dQEnGPXprQQ4qSsPHPcW\n m6osfgjdBnbHeWGT+/PqBPP7PaHLGIrhpcxUkE3caRPVzTK2oKnRnXO385LIdjyD\n KjnbcP1Q8543Pdfv2wrqCwKtPG/SfMD1nIdxzqyEzbKrlFHCg+sY6Ax4tfhJ0oKi\n 0ytVqfQv3hmytewM+0TJ0L1RzqB+Q00vo2d23dOgeuoPXji/FyHMh2yUg7nXojZo\n 6UNip08fELkm1vkzwbVU28WVNVjwcFHkTOM7K5FUiWRPxYN1/hcDh1a9iUchsP6b\n GzOwBA==","v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=oss.qualcomm.com; s=google; t=1775765062; x=1776369862; darn=nongnu.org;\n h=content-transfer-encoding:cc:to:subject:message-id:date:from\n :in-reply-to:references:mime-version:from:to:cc:subject:date\n :message-id:reply-to;\n bh=vYvoKDx6ePzvZt2YkP1XKAMQOei9zq2HmsiBrTdLUqc=;\n b=Lbnf62LSn1oXbj8LbQ5KUMJ5VtzMGzayft1TUVaSgu9f4qh6qcORcR1i2kOtRR30eW\n cgD9I+Tlx/YOhRFqADj/b+SEJgPqWnygl1vDSiRQFsPPG09OCvpIaNy9m/u+DspdokJ+\n H96iUxqw+ztUs2hnKiiaURN4iypAKUX8MwCoommy2E1++U4i4jjgcvQSOfUI+jGx9Qro\n NigIXWUBMJex6uFwiz4LPqQOC0HTSkmuKzaWmKJe286RyxfdHt03DWoNhx+oO6YILdft\n KkgPZzKVgR30020gSKLWdoD6cJGmNU+SsM/skoSc/5eyVWznyKO3fLwLVgt8+qQQv+u1\n uGQg=="],"ARC-Seal":"i=1; a=rsa-sha256; t=1775765062; cv=none;\n d=google.com; s=arc-20240605;\n b=awEJPR5cbLtVrcZod3Vf0crAYiva74QXTLply1XOlAuLxqcmF8njwqsyjrhfutjaM8\n O2Rh445wKQEjoEOi4sjzGt9/WnCEsbQbvwuOWjm5+gh8HyQGNFPOlxdIIrodhjTqThoU\n n1Sq/ttU9fJJ70XfZsZwqgn//nVMER3OmQix9ElitzmgqP9zSydsEG47mZ0ghWKEc7m6\n RlwT9+nYlVStBEt7jr7cIhObmnF+YHiqy6DmS7xSj00II21JORVULnGHjjtpsqQL+I2R\n jjoFEUR4e92jkErN03xtN31rb2x+iuxuScs6MpP99++QrBbMOaVqWw+cvDXx1+PzWUqR\n VLMA==","ARC-Message-Signature":"i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com;\n s=arc-20240605;\n h=content-transfer-encoding:cc:to:subject:message-id:date:from\n :in-reply-to:references:mime-version:dkim-signature;\n bh=vYvoKDx6ePzvZt2YkP1XKAMQOei9zq2HmsiBrTdLUqc=;\n fh=FhZmaLtogkjmTn+kMmUp2dZZj8HLCDdbeRx/6RmFIFo=;\n b=SdhMccqdgdE+ArXplkFwtQOZlLXZzome9bbjc/9qTRBrkP9/c8W+B85JNJqHvhA6Vc\n eQ7dZokwl8OZyMZuAby4ro5DM8nIJM5+T4pL2GK2igW5vyEoWVotvcCDNGUu+JFUYRng\n OSgV0D7FK9SchrZzI4346ADj+RmoOauoPX0xY3duoxiJIqTjUKG62DIq5pB6lBYIBVFW\n OK6Uliw5EUTsYnp5hwzJBZD5d3ZtFV2pBZ3Dw8kN7PvPWhP9ueJi/VeSP5Gmh6WQJzub\n U9YMmmUhpxGopmBYjkFgYI60hQ+AQctdXJk5YHZ2J/AK/DNAcre0OlaZADEPPKubFKqP\n 8GGg==; darn=nongnu.org","ARC-Authentication-Results":"i=1; mx.google.com; arc=none","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=1e100.net; s=20251104; t=1775765062; x=1776369862;\n h=content-transfer-encoding:cc:to:subject:message-id:date:from\n :in-reply-to:references:mime-version:x-gm-gg:x-gm-message-state:from\n :to:cc:subject:date:message-id:reply-to;\n bh=vYvoKDx6ePzvZt2YkP1XKAMQOei9zq2HmsiBrTdLUqc=;\n b=bdafoAGJp7iRuoMFWwE/Wf5zZPuBrCPSp74KZwN2bH1Q6LHx+3Kuothw5+/jgokTj3\n Bop6yA6SQ3PDC04iNmm0T/8BA/h7pExdXT/W0dh/D2ENhsc9uEHRkQVoYzjZFIV5R+Iq\n trAPgR6rv0PP+Y+7mOy6D3b0S5PU1htf5qjn758pYigFZZc5XYitZyC+ybF6PtZm9hCq\n roC1LGNMRw0NyAYg2p+NAL1qXvRX4ySNrzj3+QTn7FQwnKlNh/FCx2MdLgI7eN6LUauK\n Faxrn7Ak73mm5DhUMDJaWcyQ9fLVBrHyJfSvKJHK6XY1u23k5fCk28S4ebggpG/3Zky2\n VkBQ==","X-Gm-Message-State":"AOJu0Yym2mn6AiDcehz6UToRPKu1hX0NKsVWOaIbmYNHkRleKmVyWfRO\n gpJTQlQkE3GrA7u8VLufToF8O+qBL77rpBY4Fq8YHFljBmQLyUAOXZr0kiz2zVxg/v7tgYeo3nO\n iRKFu7SC9m0Ud9zqgPsMBlty+78jEOp2/VFm3Kz2PrzluCKJdM1i4dlg2PZQQJcxIQ0p0ktOlIE\n H2k20fcLpzgwwnIVuqTqmfbM7+s4CdtD1/","X-Gm-Gg":"AeBDieuuyFreEbHvJxHchaLcg5NbN9gX2JXR2toN5Fe10REIMqGTVtqkKe4f7iRgkT3\n ZK9986INPineKqcvHsZK2yneUcIHrOb8o5RL9+3e3Hpxl1BxbDt9Mmj6pRVWdZqE8R3BddzqOdg\n qyn+VX0ccpiovEq/a5E7PkPLSCu1THbv1JTXdtmLAlsnmTTSec3uOnYQ7ACJ2GPNABcjPgHI+GF\n DuoMrE=","X-Received":["by 2002:a05:7022:fa04:b0:12b:ec15:69d2 with SMTP id\n a92af1059eb24-12c34efcc4dmr251250c88.33.1775765061782;\n Thu, 09 Apr 2026 13:04:21 -0700 (PDT)","by 2002:a05:7022:fa04:b0:12b:ec15:69d2 with SMTP id\n a92af1059eb24-12c34efcc4dmr251198c88.33.1775765060962; Thu, 09 Apr 2026\n 13:04:20 -0700 (PDT)"],"MIME-Version":"1.0","References":"<20260408042149.1902796-1-brian.cain@oss.qualcomm.com>\n <20260408042149.1902796-9-brian.cain@oss.qualcomm.com>\n <CAJpW4SULdJ=zWw+ir3FBaVFvidzwTiHhGZ361A1BETHADThteQ@mail.gmail.com>","In-Reply-To":"\n <CAJpW4SULdJ=zWw+ir3FBaVFvidzwTiHhGZ361A1BETHADThteQ@mail.gmail.com>","From":"Brian Cain <brian.cain@oss.qualcomm.com>","Date":"Thu, 9 Apr 2026 15:04:04 -0500","X-Gm-Features":"AQROBzBDU2yPxW6HUHopxeawEEFv_UXfo2yv6MPxVGbhnFu8C2JZBz9IQRMEWsQ","Message-ID":"\n <CAEqNhNa2=HUbTtvQ-J_8BGTsrW89-aiQJtjs5G4GLn8gNCuPOQ@mail.gmail.com>","Subject":"Re: [PATCH v4 8/9] hw/hexagon: Define hexagon \"virt\" machine","To":"Sid Manning <sid.manning@oss.qualcomm.com>","Cc":"qemu-devel@nongnu.org, philmd@linaro.org, ltaylorsimpson@gmail.com,\n matheus.bernardino@oss.qualcomm.com, marco.liebel@oss.qualcomm.com,\n quic_mburton@quicinc.com, ale@rev.ng, anjo@rev.ng,\n Brian Cain <bcain@quicinc.com>, Paolo Bonzini <pbonzini@redhat.com>,\n Kevin Wolf <kwolf@redhat.com>, Hanna Reitz <hreitz@redhat.com>,\n \"open list:Block layer core\" <qemu-block@nongnu.org>","Content-Type":"text/plain; charset=\"UTF-8\"","Content-Transfer-Encoding":"quoted-printable","X-Proofpoint-ORIG-GUID":"awLOXrhwYearQilAOjqovowakkMWbepu","X-Proofpoint-GUID":"awLOXrhwYearQilAOjqovowakkMWbepu","X-Proofpoint-Spam-Details-Enc":"AW1haW4tMjYwNDA5MDE4NCBTYWx0ZWRfX9Fbew8UUcn7i\n 5gZDbp3W1nMOREvH7fTy8z5lzfC02AKxpsjflu4T6dwALR3i2wpvsX3wX42xO1M11nmmd99L6b6\n luUlNM6VY6BR7oh5jWIr/zsUEDo9uCg4L7yqnDL3C3D8tbsaomfq525e32jWcKmI1iQoxvRgPoA\n 28Yal0ShrwjtTlwE8bEfgFHQ23RZIBMwIkaorXnlwktJDZcibqtpmyxN8gTptvL4zH/0NX0uknP\n oIBN6536ZmFahNQYryH33eRRmpum2SLtEhswmKfpfJqdKEQcDRc9EDm1z3d3MUc34Xezrz7svzc\n yjxRH7WN6Rlj/VKukJm4MI+sV1r7iuklo50598MeE0oAh5TBmV+yieRRwTN1GeAbeY+7RungW+h\n dK7Lj0v8k8JfdXhtfxfD3GHMFSpP69kcgNwKk/GLJfePMbYk1bciWt7wwdDhceBd+edFJnS736I\n /0/vfjrcKDOa0gKIjCw==","X-Authority-Analysis":"v=2.4 cv=TZemcxQh c=1 sm=1 tr=0 ts=69d80646 cx=c_pps\n a=JYo30EpNSr/tUYqK9jHPoA==:117 a=IkcTkHD0fZMA:10 a=A5OVakUREuEA:10\n a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22\n a=_K5XuSEh1TEqbUxoQ0s3:22 a=NEAV23lmAAAA:8 a=EUspDBNiAAAA:8 a=COk6AnOGAAAA:8\n a=pIIDZHQ5010CrP4ofVMA:9 a=QEXdDO2ut3YA:10 a=Fk4IpSoW4aLDllm1B1p-:22\n a=TjNXssC_j7lpFel5tvFf:22","X-Proofpoint-Virus-Version":"vendor=baseguard\n engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49\n definitions=2026-04-09_04,2026-04-09_02,2025-10-01_01","X-Proofpoint-Spam-Details":"rule=outbound_notspam policy=outbound score=0\n clxscore=1015 lowpriorityscore=0 priorityscore=1501 suspectscore=0\n malwarescore=0 phishscore=0 bulkscore=0 spamscore=0 impostorscore=0\n adultscore=0 classifier=typeunknown authscore=0 authtc= authcc=\n route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2604010000\n definitions=main-2604090184","Received-SPF":"pass client-ip=205.220.168.131;\n envelope-from=brian.cain@oss.qualcomm.com; helo=mx0a-0031df01.pphosted.com","X-Spam_score_int":"-27","X-Spam_score":"-2.8","X-Spam_bar":"--","X-Spam_report":"(-2.8 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1,\n DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_LOW=-0.7, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001,\n RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001, SPF_HELO_NONE=0.001,\n SPF_PASS=-0.001 autolearn=ham autolearn_force=no","X-Spam_action":"no action","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.29","Precedence":"list","List-Id":"qemu development <qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<https://lists.nongnu.org/archive/html/qemu-devel>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org"}}]