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