Я эмулирую некоторое оборудование в QEMU, которое соответствует некоторым драйверам в ядре гостевой Linux.
Прямо сейчас я могу использовать memory_region_init_io
для настройки областей mmio, чтобы всякий раз, когда драйвер ядра читает / записывает на адрес mmio, я получал обратный вызов.
Как я могу получить трассировку стека ядра, которое запускает доступ mmio в обратном вызове? Я хочу знать, какая строка в драйвере ядра запускает какой доступ через mmio.
Я знаю, что mmiotrace
может быть вариантом, но эта трассировка происходит в гостевом ядре. Могу ли я добиться этого с помощью qemu-kvm.
static uint64_t mmio_read(void *opaque, hwaddr addr,
unsigned size) {
/* Here, I want to get the stacktrace inside VM
* that caused this mmio read */
printf("mmio_read: %lx[%u] returns %lx\n", addr, size, ret);
return 0;
}
static void stream_dma_write(void *opaque, hwaddr addr,
uint64_t val, unsigned size) {
/* Here, I want to get the stacktrace inside VM
* that caused this mmio write */
printf("mmio_write: %lx[%u]=%lx \n", addr, size, val);
}
static const MemoryRegionOps mmio_ops {
.read = mmio_read,
.write = mmio_write,
}
void init_region(uintptr_t addr, size_t size) {
MemoryRegion *subregion = malloc(sizeof(MemoryRegion));
memory_region_init_io(subregion, OBJECT(opaque),
&mmio_ops, NULL, "mmio-region", size);
memory_region_add_subregion_overlap(get_system_memory(),
addr, subregion, 100);
}