Revision 8f6f962b

b/kvm-all.c
541 541
    target_phys_addr_t start_addr = section->offset_within_address_space;
542 542
    ram_addr_t size = section->size;
543 543
    void *ram = NULL;
544
    unsigned delta;
544 545

  
545 546
    /* kvm works in page size chunks, but the function may be called
546 547
       with sub-page size and unaligned start address. */
547
    size = TARGET_PAGE_ALIGN(size);
548
    start_addr = TARGET_PAGE_ALIGN(start_addr);
548
    delta = TARGET_PAGE_ALIGN(size) - size;
549
    if (delta > size) {
550
        return;
551
    }
552
    start_addr += delta;
553
    size -= delta;
554
    size &= TARGET_PAGE_MASK;
555
    if (!size || (start_addr & ~TARGET_PAGE_MASK)) {
556
        return;
557
    }
549 558

  
550 559
    if (!memory_region_is_ram(mr)) {
551 560
        return;
552 561
    }
553 562

  
554
    ram = memory_region_get_ram_ptr(mr) + section->offset_within_region;
563
    ram = memory_region_get_ram_ptr(mr) + section->offset_within_region + delta;
555 564

  
556 565
    while (1) {
557 566
        mem = kvm_lookup_overlapping_slot(s, start_addr, start_addr + size);

Also available in: Unified diff