Revision 717cb7b2
b/exec.c | ||
---|---|---|
2625 | 2625 |
target_phys_addr_t start_addr = section->offset_within_address_space; |
2626 | 2626 |
ram_addr_t size = section->size; |
2627 | 2627 |
target_phys_addr_t addr, end_addr; |
2628 |
uint16_t *p; |
|
2629 | 2628 |
CPUState *env; |
2630 | 2629 |
ram_addr_t orig_size = size; |
2631 | 2630 |
subpage_t *subpage; |
... | ... | |
2638 | 2637 |
|
2639 | 2638 |
addr = start_addr; |
2640 | 2639 |
do { |
2641 |
p = phys_page_find_alloc(addr >> TARGET_PAGE_BITS, 0); |
|
2642 |
if (p && *p != phys_section_unassigned) { |
|
2643 |
uint16_t orig_memory= *p; |
|
2644 |
target_phys_addr_t start_addr2, end_addr2; |
|
2645 |
int need_subpage = 0; |
|
2646 |
MemoryRegion *mr = phys_sections[orig_memory].mr; |
|
2647 |
|
|
2648 |
CHECK_SUBPAGE(addr, start_addr, start_addr2, end_addr, end_addr2, |
|
2649 |
need_subpage); |
|
2650 |
if (need_subpage) { |
|
2651 |
if (!(mr->subpage)) { |
|
2652 |
subpage = subpage_init((addr & TARGET_PAGE_MASK), |
|
2653 |
p, orig_memory); |
|
2654 |
} else { |
|
2655 |
subpage = container_of(mr, subpage_t, iomem); |
|
2656 |
} |
|
2657 |
subpage_register(subpage, start_addr2, end_addr2, |
|
2658 |
section_index); |
|
2640 |
uint16_t *p = phys_page_find_alloc(addr >> TARGET_PAGE_BITS, 1); |
|
2641 |
uint16_t orig_memory = *p; |
|
2642 |
target_phys_addr_t start_addr2, end_addr2; |
|
2643 |
int need_subpage = 0; |
|
2644 |
MemoryRegion *mr = phys_sections[orig_memory].mr; |
|
2645 |
|
|
2646 |
CHECK_SUBPAGE(addr, start_addr, start_addr2, end_addr, end_addr2, |
|
2647 |
need_subpage); |
|
2648 |
if (need_subpage) { |
|
2649 |
if (!(mr->subpage)) { |
|
2650 |
subpage = subpage_init((addr & TARGET_PAGE_MASK), |
|
2651 |
p, orig_memory); |
|
2659 | 2652 |
} else { |
2660 |
*p = section_index;
|
|
2653 |
subpage = container_of(mr, subpage_t, iomem);
|
|
2661 | 2654 |
} |
2655 |
subpage_register(subpage, start_addr2, end_addr2, |
|
2656 |
section_index); |
|
2662 | 2657 |
} else { |
2663 |
target_phys_addr_t start_addr2, end_addr2; |
|
2664 |
int need_subpage = 0; |
|
2665 |
|
|
2666 |
p = phys_page_find_alloc(addr >> TARGET_PAGE_BITS, 1); |
|
2667 | 2658 |
*p = section_index; |
2668 |
|
|
2669 |
CHECK_SUBPAGE(addr, start_addr, start_addr2, end_addr, |
|
2670 |
end_addr2, need_subpage); |
|
2671 |
|
|
2672 |
if (need_subpage) { |
|
2673 |
subpage = subpage_init((addr & TARGET_PAGE_MASK), |
|
2674 |
p, phys_section_unassigned); |
|
2675 |
subpage_register(subpage, start_addr2, end_addr2, |
|
2676 |
section_index); |
|
2677 |
} |
|
2678 | 2659 |
} |
2679 | 2660 |
addr += TARGET_PAGE_SIZE; |
2680 | 2661 |
} while (addr != end_addr); |
Also available in: Unified diff