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