On 18/06/20 15:12, Alex Bennée wrote:
>>
>> @@ -1495,6 +1495,9 @@ void memory_region_init_io(MemoryRegion *mr,
>> const char *name,
>> uint64_t size)
>> {
>> + assert(ops);
>> + assert(ops->read);
>> + assert(ops->write);
>
> If you look at memory_region_dispatch_write you can see that
> mr->ops->write being empty is acceptable because it implies
> mr->ops->write_with_attrs is set instead. I think the same is true for
> read so I think you need something more like:
>
> assert(ops->read || ops->read_with_attrs);
> assert(ops->write || ops->write_with_attrs);
Also, !ops is acceptable since you have a couple lines below:
mr->ops = ops ? ops : &unassigned_mem_ops;
>> + assert(ops->read);
>> + assert(ops->write);
>
> Do ROM devices need a ->write function?
Yes, ROMD regions are treated as I/O regions for writes. However they
don't need a read function.
> Also doesn't this break a load of running stuff without fixes for all
> the various missing bits? How far does make check-acceptance get?
This might actually be really close with the above assertions fixed.
For example, commit 08565552f7 ("cputlb: Move NOTDIRTY handling from I/O
path to TLB path", 2019-09-25) got rid of io_mem_notdirty.
The only cases I found with "git grep" are:
- tz_ppc_dummy_ops which is broken and should just use NULL ops
- hw/nvram/nrf51_nvm.c's flash_ops which is fixed if ROMD regions are
changed not to require a read callback.
- designware_pci_host_msi_ops which is broken and should have a dummy
read callback.
Needless to say, this is something that the submitter should have done,
not the reviewer.
Paolo