Ignore:
File:
1 edited

Legend:

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

    r7852625 r720db0c  
    4545 * Walk the memory map and create frame zones according to it.
    4646 */
    47 static void frame_common_arch_init(bool low)
     47void frame_arch_init(void)
    4848{
    49         unsigned int i;
     49        if (config.cpu_active == 1) {
     50                unsigned int i;
    5051               
    51         for (i = 0; i < memmap.cnt; i++) {
    52                 uintptr_t base;
    53                 size_t size;
    54 
    55                 /*
    56                  * The memmap is created by HelenOS boot loader.
    57                  * It already contains no holes.
    58                  */
    59 
    60                 /* To be safe, make the available zone possibly smaller */
    61                 base = ALIGN_UP((uintptr_t) memmap.zones[i].start, FRAME_SIZE);
    62                 size = ALIGN_DOWN(memmap.zones[i].size -
    63                     (base - ((uintptr_t) memmap.zones[i].start)), FRAME_SIZE);
    64                
    65                 if (!frame_adjust_zone_bounds(low, &base, &size))
    66                         continue;
    67 
    68                 pfn_t confdata;
    69                 pfn_t pfn = ADDR2PFN(base);
    70                 size_t count = SIZE2FRAMES(size);
    71 
    72                 if (low) {
    73                         confdata = pfn;
     52                for (i = 0; i < memmap.cnt; i++) {
     53                        /* To be safe, make the available zone possibly smaller */
     54                        uintptr_t new_start = ALIGN_UP((uintptr_t) memmap.zones[i].start,
     55                            FRAME_SIZE);
     56                        size_t new_size = ALIGN_DOWN(memmap.zones[i].size -
     57                            (new_start - ((uintptr_t) memmap.zones[i].start)), FRAME_SIZE);
     58                       
     59                        /*
     60                         * The memmap is created by HelenOS boot loader.
     61                         * It already contains no holes.
     62                         */
     63                       
     64                        pfn_t confdata = ADDR2PFN(new_start);
     65                       
    7466                        if (confdata == ADDR2PFN(KA2PA(PFN2ADDR(0))))
    7567                                confdata = ADDR2PFN(KA2PA(PFN2ADDR(2)));
    7668                       
    77                         zone_create(pfn, count, confdata,
    78                             ZONE_AVAILABLE | ZONE_LOWMEM);
    79                 } else {
    80                         confdata = zone_external_conf_alloc(count);
    81                         if (confdata != 0)
    82                                 zone_create(pfn, count, confdata,
    83                                     ZONE_AVAILABLE | ZONE_HIGHMEM);
     69                        zone_create(ADDR2PFN(new_start), SIZE2FRAMES(new_size),
     70                            confdata, 0);
    8471                }
     72               
     73                /*
     74                 * On sparc64, physical memory can start on a non-zero address.
     75                 * The generic frame_init() only marks PFN 0 as not free, so we
     76                 * must mark the physically first frame not free explicitly
     77                 * here, no matter what is its address.
     78                 */
     79                frame_mark_unavailable(ADDR2PFN(KA2PA(PFN2ADDR(0))), 1);
    8580        }
    86 }
    87 
    88 
    89 void frame_low_arch_init(void)
    90 {
    91         if (config.cpu_active > 1)
    92                 return;
    93 
    94         frame_common_arch_init(true);
    95 
    96         /*
    97          * On sparc64, physical memory can start on a non-zero address.
    98          * The generic frame_init() only marks PFN 0 as not free, so we
    99          * must mark the physically first frame not free explicitly
    100          * here, no matter what is its address.
    101          */
    102         frame_mark_unavailable(ADDR2PFN(KA2PA(PFN2ADDR(0))), 1);
    103 }
    104 
    105 void frame_high_arch_init(void)
    106 {
    107         if (config.cpu_active > 1)
    108                 return;
    109 
    110         frame_common_arch_init(false);
    11181}
    11282
Note: See TracChangeset for help on using the changeset viewer.