Changes in kernel/generic/src/mm/frame.c [818fffe:905721b] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/mm/frame.c
r818fffe r905721b 240 240 NO_TRACE static bool zone_can_alloc(zone_t *zone, uint8_t order) 241 241 { 242 return ( zone_flags_available(zone->flags)243 &&buddy_system_can_alloc(zone->buddy_system, order));242 return ((zone->flags & ZONE_AVAILABLE) && 243 buddy_system_can_alloc(zone->buddy_system, order)); 244 244 } 245 245 … … 265 265 * Check whether the zone meets the search criteria. 266 266 */ 267 if ( (zones.info[i].flags & flags) == flags) {267 if (ZONE_FLAGS_MATCH(zones.info[i].flags, flags)) { 268 268 /* 269 269 * Check if the zone has 2^order frames area available. … … 460 460 NO_TRACE static pfn_t zone_frame_alloc(zone_t *zone, uint8_t order) 461 461 { 462 ASSERT(zone _flags_available(zone->flags));462 ASSERT(zone->flags & ZONE_AVAILABLE); 463 463 464 464 /* Allocate frames from zone buddy system */ … … 490 490 NO_TRACE static size_t zone_frame_free(zone_t *zone, size_t frame_idx) 491 491 { 492 ASSERT(zone _flags_available(zone->flags));492 ASSERT(zone->flags & ZONE_AVAILABLE); 493 493 494 494 frame_t *frame = &zone->frames[frame_idx]; … … 518 518 NO_TRACE static void zone_mark_unavailable(zone_t *zone, size_t frame_idx) 519 519 { 520 ASSERT(zone _flags_available(zone->flags));520 ASSERT(zone->flags & ZONE_AVAILABLE); 521 521 522 522 frame_t *frame = zone_get_frame(zone, frame_idx); … … 549 549 buddy_system_t *buddy) 550 550 { 551 ASSERT(zone _flags_available(zones.info[z1].flags));552 ASSERT(zone _flags_available(zones.info[z2].flags));551 ASSERT(zones.info[z1].flags & ZONE_AVAILABLE); 552 ASSERT(zones.info[z2].flags & ZONE_AVAILABLE); 553 553 ASSERT(zones.info[z1].flags == zones.info[z2].flags); 554 554 ASSERT(zones.info[z1].base < zones.info[z2].base); … … 645 645 NO_TRACE static void return_config_frames(size_t znum, pfn_t pfn, size_t count) 646 646 { 647 ASSERT(zone _flags_available(zones.info[znum].flags));647 ASSERT(zones.info[znum].flags & ZONE_AVAILABLE); 648 648 649 649 size_t cframes = SIZE2FRAMES(zone_conf_size(count)); … … 681 681 size_t count) 682 682 { 683 ASSERT(zone _flags_available(zones.info[znum].flags));683 ASSERT(zones.info[znum].flags & ZONE_AVAILABLE); 684 684 ASSERT(frame_idx + count < zones.info[znum].count); 685 685 … … 723 723 * set of flags 724 724 */ 725 if ((z1 >= zones.count) || (z2 >= zones.count) 726 || (z2 - z1 != 1) 727 || (!zone_flags_available(zones.info[z1].flags)) 728 || (!zone_flags_available(zones.info[z2].flags)) 729 || (zones.info[z1].flags != zones.info[z2].flags)) { 725 if ((z1 >= zones.count) || (z2 >= zones.count) || (z2 - z1 != 1) || 726 (zones.info[z1].flags != zones.info[z2].flags)) { 730 727 ret = false; 731 728 goto errout; … … 828 825 zone->buddy_system = buddy; 829 826 830 if ( zone_flags_available(flags)) {827 if (flags & ZONE_AVAILABLE) { 831 828 /* 832 829 * Compute order for buddy system and initialize … … 865 862 { 866 863 return (count * sizeof(frame_t) + buddy_conf_size(fnzb(count))); 864 } 865 866 /** Allocate external configuration frames from low memory. */ 867 pfn_t zone_external_conf_alloc(size_t count) 868 { 869 size_t size = zone_conf_size(count); 870 size_t order = ispwr2(size) ? fnzb(size) : (fnzb(size) + 1); 871 872 return ADDR2PFN((uintptr_t) frame_alloc(order - FRAME_WIDTH, 873 FRAME_LOWMEM | FRAME_ATOMIC)); 867 874 } 868 875 … … 888 895 irq_spinlock_lock(&zones.lock, true); 889 896 890 if ( zone_flags_available(flags)) { /* Create available zone */897 if (flags & ZONE_AVAILABLE) { /* Create available zone */ 891 898 /* Theoretically we could have NULL here, practically make sure 892 899 * nobody tries to do that. If some platform requires, remove … … 894 901 */ 895 902 ASSERT(confframe != ADDR2PFN((uintptr_t ) NULL)); 903 904 /* Update the known end of physical memory. */ 905 config.physmem_end = max(config.physmem_end, PFN2ADDR(start + count)); 896 906 897 907 /* If confframe is supposed to be inside our zone, then make sure … … 914 924 for (i = 0; i < init.cnt; i++) 915 925 if (overlaps(addr, PFN2ADDR(confcount), 916 KA2PA(init.tasks[i].addr),926 init.tasks[i].paddr, 917 927 init.tasks[i].size)) { 918 928 overlap = true; … … 1076 1086 #endif 1077 1087 1088 /* 1089 * Since the mem_avail_mtx is an active mutex, we need to disable interrupts 1090 * to prevent deadlock with TLB shootdown. 1091 */ 1092 ipl_t ipl = interrupts_disable(); 1078 1093 mutex_lock(&mem_avail_mtx); 1079 1094 … … 1088 1103 1089 1104 mutex_unlock(&mem_avail_mtx); 1105 interrupts_restore(ipl); 1090 1106 1091 1107 #ifdef CONFIG_DEBUG … … 1151 1167 * Signal that some memory has been freed. 1152 1168 */ 1169 1170 1171 /* 1172 * Since the mem_avail_mtx is an active mutex, we need to disable interrupts 1173 * to prevent deadlock with TLB shootdown. 1174 */ 1175 ipl_t ipl = interrupts_disable(); 1153 1176 mutex_lock(&mem_avail_mtx); 1154 1177 if (mem_avail_req > 0) … … 1160 1183 } 1161 1184 mutex_unlock(&mem_avail_mtx); 1185 interrupts_restore(ipl); 1162 1186 1163 1187 if (!(flags & FRAME_NO_RESERVE)) … … 1232 1256 1233 1257 /* Tell the architecture to create some memory */ 1234 frame_ arch_init();1258 frame_low_arch_init(); 1235 1259 if (config.cpu_active == 1) { 1236 1260 frame_mark_unavailable(ADDR2PFN(KA2PA(config.base)), … … 1241 1265 size_t i; 1242 1266 for (i = 0; i < init.cnt; i++) { 1243 pfn_t pfn = ADDR2PFN( KA2PA(init.tasks[i].addr));1267 pfn_t pfn = ADDR2PFN(init.tasks[i].paddr); 1244 1268 frame_mark_unavailable(pfn, 1245 1269 SIZE2FRAMES(init.tasks[i].size)); … … 1255 1279 frame_mark_unavailable(0, 1); 1256 1280 } 1281 frame_high_arch_init(); 1282 } 1283 1284 /** Adjust bounds of physical memory region according to low/high memory split. 1285 * 1286 * @param low[in] If true, the adjustment is performed to make the region 1287 * fit in the low memory. Otherwise the adjustment is 1288 * performed to make the region fit in the high memory. 1289 * @param basep[inout] Pointer to a variable which contains the region's base 1290 * address and which may receive the adjusted base address. 1291 * @param sizep[inout] Pointer to a variable which contains the region's size 1292 * and which may receive the adjusted size. 1293 * @retun True if the region still exists even after the 1294 * adjustment, false otherwise. 1295 */ 1296 bool frame_adjust_zone_bounds(bool low, uintptr_t *basep, size_t *sizep) 1297 { 1298 uintptr_t limit = KA2PA(config.identity_base) + config.identity_size; 1299 1300 if (low) { 1301 if (*basep > limit) 1302 return false; 1303 if (*basep + *sizep > limit) 1304 *sizep = limit - *basep; 1305 } else { 1306 if (*basep + *sizep <= limit) 1307 return false; 1308 if (*basep <= limit) { 1309 *sizep -= limit - *basep; 1310 *basep = limit; 1311 } 1312 } 1313 return true; 1257 1314 } 1258 1315 … … 1293 1350 *total += (uint64_t) FRAMES2SIZE(zones.info[i].count); 1294 1351 1295 if (zone _flags_available(zones.info[i].flags)) {1352 if (zones.info[i].flags & ZONE_AVAILABLE) { 1296 1353 *busy += (uint64_t) FRAMES2SIZE(zones.info[i].busy_count); 1297 1354 *free += (uint64_t) FRAMES2SIZE(zones.info[i].free_count); … … 1344 1401 irq_spinlock_unlock(&zones.lock, true); 1345 1402 1346 bool available = zone_flags_available(flags);1403 bool available = ((flags & ZONE_AVAILABLE) != 0); 1347 1404 1348 1405 printf("%-4zu", i); … … 1356 1413 #endif 1357 1414 1358 printf(" %12zu %c%c%c ", count, 1359 available ? 'A' : ' ', 1360 (flags & ZONE_RESERVED) ? 'R' : ' ', 1361 (flags & ZONE_FIRMWARE) ? 'F' : ' '); 1415 printf(" %12zu %c%c%c%c%c ", count, 1416 available ? 'A' : '-', 1417 (flags & ZONE_RESERVED) ? 'R' : '-', 1418 (flags & ZONE_FIRMWARE) ? 'F' : '-', 1419 (flags & ZONE_LOWMEM) ? 'L' : '-', 1420 (flags & ZONE_HIGHMEM) ? 'H' : '-'); 1362 1421 1363 1422 if (available) … … 1401 1460 irq_spinlock_unlock(&zones.lock, true); 1402 1461 1403 bool available = zone_flags_available(flags);1462 bool available = ((flags & ZONE_AVAILABLE) != 0); 1404 1463 1405 1464 uint64_t size; … … 1411 1470 printf("Zone size: %zu frames (%" PRIu64 " %s)\n", count, 1412 1471 size, size_suffix); 1413 printf("Zone flags: %c%c%c\n", 1414 available ? 'A' : ' ', 1415 (flags & ZONE_RESERVED) ? 'R' : ' ', 1416 (flags & ZONE_FIRMWARE) ? 'F' : ' '); 1472 printf("Zone flags: %c%c%c%c%c\n", 1473 available ? 'A' : '-', 1474 (flags & ZONE_RESERVED) ? 'R' : '-', 1475 (flags & ZONE_FIRMWARE) ? 'F' : '-', 1476 (flags & ZONE_LOWMEM) ? 'L' : '-', 1477 (flags & ZONE_HIGHMEM) ? 'H' : '-'); 1417 1478 1418 1479 if (available) {
Note:
See TracChangeset
for help on using the changeset viewer.