Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/arch/ia64/src/mm/frame.c

    r7852625 rbbe4828  
    5151#define MINCONF 1
    5252
    53 uintptr_t end_of_identity = -1ULL;
     53uintptr_t last_frame = 0;
    5454
    55 static void frame_common_arch_init(bool low)
     55void frame_arch_init(void)
    5656{
    57         unsigned int i;
     57        if (config.cpu_active == 1) {
     58                unsigned int i;
     59                for (i = 0; i < bootinfo->memmap_items; i++) {
     60                        if (bootinfo->memmap[i].type == MEMMAP_FREE_MEM) {
     61                                uint64_t base = bootinfo->memmap[i].base;
     62                                uint64_t size = bootinfo->memmap[i].size;
     63                                uint64_t abase = ALIGN_UP(base, FRAME_SIZE);
    5864
    59         for (i = 0; i < bootinfo->memmap_items; i++) {
    60                 if (bootinfo->memmap[i].type != MEMMAP_FREE_MEM)
    61                         continue;
     65                                if (size > FRAME_SIZE)
     66                                        size -= abase - base;
    6267
    63                 uintptr_t base = bootinfo->memmap[i].base;
    64                 size_t size = bootinfo->memmap[i].size;
    65                 uintptr_t abase = ALIGN_UP(base, FRAME_SIZE);
    66 
    67                 if (size > FRAME_SIZE)
    68                         size -= abase - base;
    69 
    70                 if (!frame_adjust_zone_bounds(low, &abase, &size))
    71                         continue;
    72 
    73                 if (size > MIN_ZONE_SIZE) {
    74                         pfn_t pfn = ADDR2PFN(abase);
    75                         size_t count = SIZE2FRAMES(size);
    76 
    77                         if (low) {
    78                                 zone_create(pfn, count, max(MINCONF, pfn),
    79                                     ZONE_AVAILABLE | ZONE_LOWMEM);
    80                         } else {
    81                                 pfn_t conf = zone_external_conf_alloc(count);
    82                                 if (conf != 0)
    83                                         zone_create(pfn, count, conf,
    84                                             ZONE_AVAILABLE | ZONE_HIGHMEM);
     68                                if (size > MIN_ZONE_SIZE) {
     69                                        zone_create(abase >> FRAME_WIDTH,
     70                                            size >> FRAME_WIDTH,
     71                                            max(MINCONF, abase >> FRAME_WIDTH),
     72                                            0);
     73                                }
     74                                if (abase + size > last_frame)
     75                                        last_frame = abase + size;
    8576                        }
    8677                }
    87         }
    88 }
     78               
     79                /*
     80                 * Blacklist ROM regions.
     81                 */
     82                frame_mark_unavailable(ADDR2PFN(ROM_BASE),
     83                    SIZE2FRAMES(ROM_SIZE));
    8984
    90 void frame_low_arch_init(void)
    91 {
    92         if (config.cpu_active > 1)
    93                 return;
    94        
    95         frame_common_arch_init(true);
    96        
    97         /*
    98          * Blacklist ROM regions.
    99          */
    100         frame_mark_unavailable(ADDR2PFN(ROM_BASE),
    101             SIZE2FRAMES(ROM_SIZE));
    102 
    103         frame_mark_unavailable(ADDR2PFN(KERNEL_RESERVED_AREA_BASE),
    104             SIZE2FRAMES(KERNEL_RESERVED_AREA_SIZE));
    105 
    106         /* PA2KA will work only on low-memory. */
    107         end_of_identity = PA2KA(config.physmem_end - FRAME_SIZE) + PAGE_SIZE;
    108 }
    109 
    110 void frame_high_arch_init(void)
    111 {
    112         if (config.cpu_active > 1)
    113                 return;
    114        
    115         frame_common_arch_init(false);
     85                frame_mark_unavailable(ADDR2PFN(KERNEL_RESERVED_AREA_BASE),
     86                    SIZE2FRAMES(KERNEL_RESERVED_AREA_SIZE));
     87        }       
    11688}
    11789
Note: See TracChangeset for help on using the changeset viewer.