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