Revision a2d33521 memory.c
b/memory.c | ||
---|---|---|
382 | 382 |
unsigned width, |
383 | 383 |
uint64_t *data) |
384 | 384 |
{ |
385 |
MemoryRegion *mr = container_of(iorange, MemoryRegion, iorange); |
|
385 |
MemoryRegionIORange *mrio |
|
386 |
= container_of(iorange, MemoryRegionIORange, iorange); |
|
387 |
MemoryRegion *mr = mrio->mr; |
|
386 | 388 |
|
389 |
offset += mrio->offset; |
|
387 | 390 |
if (mr->ops->old_portio) { |
388 |
const MemoryRegionPortio *mrp = find_portio(mr, offset, width, false); |
|
391 |
const MemoryRegionPortio *mrp = find_portio(mr, offset - mrio->offset, |
|
392 |
width, false); |
|
389 | 393 |
|
390 | 394 |
*data = ((uint64_t)1 << (width * 8)) - 1; |
391 | 395 |
if (mrp) { |
392 | 396 |
*data = mrp->read(mr->opaque, offset); |
393 | 397 |
} else if (width == 2) { |
394 |
mrp = find_portio(mr, offset, 1, false); |
|
398 |
mrp = find_portio(mr, offset - mrio->offset, 1, false);
|
|
395 | 399 |
assert(mrp); |
396 | 400 |
*data = mrp->read(mr->opaque, offset) | |
397 | 401 |
(mrp->read(mr->opaque, offset + 1) << 8); |
... | ... | |
410 | 414 |
unsigned width, |
411 | 415 |
uint64_t data) |
412 | 416 |
{ |
413 |
MemoryRegion *mr = container_of(iorange, MemoryRegion, iorange); |
|
417 |
MemoryRegionIORange *mrio |
|
418 |
= container_of(iorange, MemoryRegionIORange, iorange); |
|
419 |
MemoryRegion *mr = mrio->mr; |
|
414 | 420 |
|
421 |
offset += mrio->offset; |
|
415 | 422 |
if (mr->ops->old_portio) { |
416 |
const MemoryRegionPortio *mrp = find_portio(mr, offset, width, true); |
|
423 |
const MemoryRegionPortio *mrp = find_portio(mr, offset - mrio->offset, |
|
424 |
width, true); |
|
417 | 425 |
|
418 | 426 |
if (mrp) { |
419 | 427 |
mrp->write(mr->opaque, offset, data); |
420 | 428 |
} else if (width == 2) { |
421 |
mrp = find_portio(mr, offset, 1, false); |
|
429 |
mrp = find_portio(mr, offset - mrio->offset, 1, false);
|
|
422 | 430 |
assert(mrp); |
423 | 431 |
mrp->write(mr->opaque, offset, data & 0xff); |
424 | 432 |
mrp->write(mr->opaque, offset + 1, data >> 8); |
... | ... | |
431 | 439 |
memory_region_write_accessor, mr); |
432 | 440 |
} |
433 | 441 |
|
442 |
static void memory_region_iorange_destructor(IORange *iorange) |
|
443 |
{ |
|
444 |
g_free(container_of(iorange, MemoryRegionIORange, iorange)); |
|
445 |
} |
|
446 |
|
|
434 | 447 |
const IORangeOps memory_region_iorange_ops = { |
435 | 448 |
.read = memory_region_iorange_read, |
436 | 449 |
.write = memory_region_iorange_write, |
450 |
.destructor = memory_region_iorange_destructor, |
|
437 | 451 |
}; |
438 | 452 |
|
439 | 453 |
static AddressSpace address_space_io; |
Also available in: Unified diff