On 9/10/21 3:21 PM, Hinko Kocevar wrote: > I'm trying to add an I/O memory region to mipssim machine to emulate a > MMIO region used by the u-boot loaded as BIOS image. I can confirm that > the machine starts and loads the BIOS, starts execution but hangs due to > unhandled IO access as described below. > > The region should be at 0xB8810000, of size 0x10000. > > I've added these lines of code to mispsim.c mips_mipssim_init(): > > my_state *s = g_malloc0(sizeof(my_state)); > memory_region_init_io(&s->mmio, NULL, &my_ops, s, > "mips_mipssim.foo", 0x10000); > memory_region_add_subregion(address_space_mem, 0xB8810000LL, &s->mmio);
You need to map your device at its physical address, not the virtual one. > All goes well, the machine starts, and I can see the newly added region > in qemu monitor info mtree output like so: > > 00000000b8810000-00000000b881ffff (prio 0, i/o): mips_mipssim.foo > > With some tracing enabled I see this error: > > Invalid access at addr 0x18810104, size 4, region '(null)', reason: > rejected > > I know the u-boot is making request to 0xB8810104 and not 0x18810104. I U-boot accessed the virtual address which is resolved into the physical one (where your device should be mapped). > also can see 0xB8810104 address being handed to io_writex(), but > mr_offset becomes 0x18810104 here: > > mr_offset = (iotlbentry->addr & TARGET_PAGE_MASK) + addr; > > What is going on? > > FWIW, I can place my emulated memory region at 0x18810104, but would > like to understand the behavior above. Yes, this is the correct address to map it. Maybe this helps: https://training.mips.com/basic_mips/PDF/Memory_Map.pdf Regards, Phil.