[Top][All Lists]

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

Qemu: New Machine and Device

From: Rahul Jain (CTO)
Subject: Qemu: New Machine and Device
Date: Wed, 3 Mar 2021 04:31:02 +0000

Hi All,

Apologies in advance for long post. 
I am new to qemu, I am trying to add a machine in qemu. To add the machine i have used following code,

void dra7xSoC_init(MachineState *machine) {
    int sram_size;
    int flash_size;
DeviceState *nvic;
dra7x_periph_t periph;
flash_size = 16 * 1024;
sram_size = 32 * 1024;
MemoryRegion *sram = g_new(MemoryRegion, 1);
MemoryRegion *flash = g_new(MemoryRegion, 1);
MemoryRegion *system_memory = get_system_memory();
memory_region_init_ram(flash, NULL, "dra7x.flash", flash_size, &error_fatal);
    memory_region_add_subregion(system_memory, 0, flash);
    memory_region_init_ram(sram, NULL, "dra7x.sram", sram_size, &error_fatal);
    memory_region_add_subregion(system_memory, 0x20000000, sram);

nvic = qdev_create(NULL, TYPE_ARMV7M);
printf("dra7xSoC_init(): done armv7m_instance_init \n");
qdev_prop_set_uint32(nvic, "num-irq", 0);
qdev_prop_set_string(nvic, "cpu-type", machine->cpu_type);
qdev_prop_set_bit(nvic, "enable-bitband", true);
object_property_set_link(OBJECT(nvic), OBJECT(get_system_memory()), "memory", &error_abort);
object_property_set_bool(OBJECT(nvic), true, "realized", &error_fatal);

armv7m_load_kernel(ARM_CPU(first_cpu), machine->kernel_filename, flash_size);
static void dra7x_machine_class_init(ObjectClass *oc, void *data) {
    MachineClass *mc = MACHINE_CLASS(oc);
    mc->desc = "dra7x";
    mc->init = dra7x_init;
    mc->default_cpu_type = ARM_CPU_TYPE_NAME("cortex-m3");
static const TypeInfo dra7x_info = {
    .name          = TYPE_DRA7X_MACHINE,
    .parent        = TYPE_MACHINE,
    .class_init    = dra7x_machine_class_init,
static void dra7x_register_types(void)


Now I want to add few peripheral to the machine and mapped range of guest memory that is implemented by host callbacks; each read or write causes a callback to be called on the host.

# to add the device
DeviceState *control_module_core_dev = qdev_create(NULL, "dra7x-control-module-core");
SysBusDevice *s;
s = SYS_BUS_DEVICE(control_module_core_dev);
sysbus_mmio_map(s, 0, 0X4a002000);
//periph = DRA7X_L4PER_PRM;
DeviceState *l4per_prm_dev = qdev_create(NULL, "dra7x-l4per-prm");
SysBusDevice *s1;
s1 = SYS_BUS_DEVICE(l4per_prm_dev);
sysbus_mmio_map(s1, 0, 0X4ae07400);

# to initialize memory region and register callbacks
static const MemoryRegionOps dra7x_control_module_core_ops = {
    .read = dra7x_control_module_core_read,
    .write = dra7x_control_module_core_write,
    .valid.min_access_size = 2,
    .valid.max_access_size = 4,
    .endianness = DEVICE_NATIVE_ENDIAN
 memory_region_init_io(&s->iomem, obj, &dra7x_control_module_core_ops, s,"control_module_core", 0x2000);
sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->iomem);

Upon writing/reading on the mapped address read/write callback is not getting called.
Requesting expert to advise how to make it work.

This message contains information that may be privileged or confidential and is the property of the KPIT Technologies Ltd. It is intended only for the person to whom it is addressed. If you are not the intended recipient, you are not authorized to read, print, retain copy, disseminate, distribute, or use this message or any part thereof. If you receive this message in error, please notify the sender immediately and delete all copies of this message. KPIT Technologies Ltd. does not accept any liability for virus infected mails.

reply via email to

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