Ignore:
File:
1 edited

Legend:

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

    r40c8c17 rdc0b964  
    4646#include <print.h>
    4747
     48#define PHYSMEM_LIMIT32  UINT64_C(0x07c000000)
     49#define PHYSMEM_LIMIT64  UINT64_C(0x200000000)
     50
    4851size_t hardcoded_unmapped_ktext_size = 0;
    4952size_t hardcoded_unmapped_kdata_size = 0;
    5053
    51 static void init_e820_memory(pfn_t minconf, bool low)
     54uintptr_t last_frame = 0;
     55
     56static void init_e820_memory(pfn_t minconf)
    5257{
    5358        unsigned int i;
    5459       
    5560        for (i = 0; i < e820counter; i++) {
    56                 uintptr_t base = (uintptr_t) e820table[i].base_address;
    57                 size_t size = (size_t) e820table[i].size;
    58                
    59                 if (!frame_adjust_zone_bounds(low, &base, &size))
     61                uint64_t base = e820table[i].base_address;
     62                uint64_t size = e820table[i].size;
     63               
     64#ifdef __32_BITS__
     65                /*
     66                 * XXX FIXME:
     67                 *
     68                 * Ignore zones which start above PHYSMEM_LIMIT32
     69                 * or clip zones which go beyond PHYSMEM_LIMIT32.
     70                 *
     71                 * The PHYSMEM_LIMIT32 (2 GB - 64 MB) is a rather
     72                 * arbitrary constant which allows to have at
     73                 * least 64 MB in the kernel address space to
     74                 * map hardware resources.
     75                 *
     76                 * The kernel uses fixed 1:1 identity mapping
     77                 * of the physical memory with 2:2 GB split.
     78                 * This is a severe limitation of the current
     79                 * kernel memory management.
     80                 *
     81                 */
     82               
     83                if (base > PHYSMEM_LIMIT32)
    6084                        continue;
     85               
     86                if (base + size > PHYSMEM_LIMIT32)
     87                        size = PHYSMEM_LIMIT32 - base;
     88#endif
     89               
     90#ifdef __64_BITS__
     91                /*
     92                 * XXX FIXME:
     93                 *
     94                 * Ignore zones which start above PHYSMEM_LIMIT64
     95                 * or clip zones which go beyond PHYSMEM_LIMIT64.
     96                 *
     97                 * The PHYSMEM_LIMIT64 (8 GB) is the size of the
     98                 * fixed 1:1 identically mapped physical memory
     99                 * accessible during the bootstrap process.
     100                 * This is a severe limitation of the current
     101                 * kernel memory management.
     102                 *
     103                 */
     104               
     105                if (base > PHYSMEM_LIMIT64)
     106                        continue;
     107               
     108                if (base + size > PHYSMEM_LIMIT64)
     109                        size = PHYSMEM_LIMIT64 - base;
     110#endif
    61111               
    62112                if (e820table[i].type == MEMMAP_MEMORY_AVAILABLE) {
     
    66116                            FRAME_SIZE);
    67117                       
     118                        pfn_t pfn = ADDR2PFN(new_base);
    68119                        size_t count = SIZE2FRAMES(new_size);
    69                         pfn_t pfn = ADDR2PFN(new_base);
     120                       
    70121                        pfn_t conf;
    71                        
    72                         if (low) {
    73                                 if ((minconf < pfn) || (minconf >= pfn + count))
    74                                         conf = pfn;
    75                                 else
    76                                         conf = minconf;
    77                                 zone_create(pfn, count, conf,
    78                                     ZONE_AVAILABLE | ZONE_LOWMEM);
    79                         } else {
    80                                 conf = zone_external_conf_alloc(count);
    81                                 zone_create(pfn, count, conf,
    82                                     ZONE_AVAILABLE | ZONE_HIGHMEM);
    83                         }
     122                        if ((minconf < pfn) || (minconf >= pfn + count))
     123                                conf = pfn;
     124                        else
     125                                conf = minconf;
     126                       
     127                        zone_create(pfn, count, conf, ZONE_AVAILABLE);
     128                       
     129                        // XXX this has to be removed
     130                        if (last_frame < ALIGN_UP(new_base + new_size, FRAME_SIZE))
     131                                last_frame = ALIGN_UP(new_base + new_size, FRAME_SIZE);
    84132                } else if ((e820table[i].type == MEMMAP_MEMORY_ACPI) ||
    85133                    (e820table[i].type == MEMMAP_MEMORY_NVS)) {
     
    131179
    132180
    133 void frame_low_arch_init(void)
     181void frame_arch_init(void)
    134182{
    135183        pfn_t minconf;
     
    144192#endif
    145193               
    146                 init_e820_memory(minconf, true);
     194                init_e820_memory(minconf);
    147195               
    148196                /* Reserve frame 0 (BIOS data) */
     
    158206}
    159207
    160 void frame_high_arch_init(void)
    161 {
    162         if (config.cpu_active == 1)
    163                 init_e820_memory(0, false);
    164 }
    165 
    166208/** @}
    167209 */
Note: See TracChangeset for help on using the changeset viewer.