Changes in kernel/arch/ia32/src/mm/frame.c [49ec568:dc0b964] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/arch/ia32/src/mm/frame.c
r49ec568 rdc0b964 46 46 #include <print.h> 47 47 48 #define PHYSMEM_LIMIT32 UINT64_C(0x100000000) 48 #define PHYSMEM_LIMIT32 UINT64_C(0x07c000000) 49 #define PHYSMEM_LIMIT64 UINT64_C(0x200000000) 49 50 50 51 size_t hardcoded_unmapped_ktext_size = 0; 51 52 size_t hardcoded_unmapped_kdata_size = 0; 52 53 53 static void init_e820_memory(pfn_t minconf, bool low) 54 uintptr_t last_frame = 0; 55 56 static void init_e820_memory(pfn_t minconf) 54 57 { 55 58 unsigned int i; 56 59 57 60 for (i = 0; i < e820counter; i++) { 58 uint64_t base 64= e820table[i].base_address;59 uint64_t size 64= e820table[i].size;60 61 #ifdef KARCH_ia3261 uint64_t base = e820table[i].base_address; 62 uint64_t size = e820table[i].size; 63 64 #ifdef __32_BITS__ 62 65 /* 63 * Restrict the e820 table entries to 32-bits. 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 * 64 81 */ 65 if (base64 >= PHYSMEM_LIMIT32) 82 83 if (base > PHYSMEM_LIMIT32) 66 84 continue; 67 85 68 if (base64 + size64 > PHYSMEM_LIMIT32) 69 size64 = PHYSMEM_LIMIT32 - base64; 70 #endif 71 72 uintptr_t base = (uintptr_t) base64; 73 size_t size = (size_t) size64; 74 75 if (!frame_adjust_zone_bounds(low, &base, &size)) 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) 76 106 continue; 107 108 if (base + size > PHYSMEM_LIMIT64) 109 size = PHYSMEM_LIMIT64 - base; 110 #endif 77 111 78 112 if (e820table[i].type == MEMMAP_MEMORY_AVAILABLE) { … … 82 116 FRAME_SIZE); 83 117 118 pfn_t pfn = ADDR2PFN(new_base); 84 119 size_t count = SIZE2FRAMES(new_size); 85 pfn_t pfn = ADDR2PFN(new_base);120 86 121 pfn_t conf; 87 88 if (low) { 89 if ((minconf < pfn) || (minconf >= pfn + count)) 90 conf = pfn; 91 else 92 conf = minconf; 93 zone_create(pfn, count, conf, 94 ZONE_AVAILABLE | ZONE_LOWMEM); 95 } else { 96 conf = zone_external_conf_alloc(count); 97 if (conf != 0) 98 zone_create(pfn, count, conf, 99 ZONE_AVAILABLE | ZONE_HIGHMEM); 100 } 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); 101 132 } else if ((e820table[i].type == MEMMAP_MEMORY_ACPI) || 102 133 (e820table[i].type == MEMMAP_MEMORY_NVS)) { … … 148 179 149 180 150 void frame_ low_arch_init(void)181 void frame_arch_init(void) 151 182 { 152 183 pfn_t minconf; … … 161 192 #endif 162 193 163 init_e820_memory(minconf , true);194 init_e820_memory(minconf); 164 195 165 196 /* Reserve frame 0 (BIOS data) */ … … 175 206 } 176 207 177 void frame_high_arch_init(void)178 {179 if (config.cpu_active == 1)180 init_e820_memory(0, false);181 }182 183 208 /** @} 184 209 */
Note:
See TracChangeset
for help on using the changeset viewer.