Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/src/mm/frame.c

    r818fffe r905721b  
    240240NO_TRACE static bool zone_can_alloc(zone_t *zone, uint8_t order)
    241241{
    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));
    244244}
    245245
     
    265265                 * Check whether the zone meets the search criteria.
    266266                 */
    267                 if ((zones.info[i].flags & flags) == flags) {
     267                if (ZONE_FLAGS_MATCH(zones.info[i].flags, flags)) {
    268268                        /*
    269269                         * Check if the zone has 2^order frames area available.
     
    460460NO_TRACE static pfn_t zone_frame_alloc(zone_t *zone, uint8_t order)
    461461{
    462         ASSERT(zone_flags_available(zone->flags));
     462        ASSERT(zone->flags & ZONE_AVAILABLE);
    463463       
    464464        /* Allocate frames from zone buddy system */
     
    490490NO_TRACE static size_t zone_frame_free(zone_t *zone, size_t frame_idx)
    491491{
    492         ASSERT(zone_flags_available(zone->flags));
     492        ASSERT(zone->flags & ZONE_AVAILABLE);
    493493       
    494494        frame_t *frame = &zone->frames[frame_idx];
     
    518518NO_TRACE static void zone_mark_unavailable(zone_t *zone, size_t frame_idx)
    519519{
    520         ASSERT(zone_flags_available(zone->flags));
     520        ASSERT(zone->flags & ZONE_AVAILABLE);
    521521       
    522522        frame_t *frame = zone_get_frame(zone, frame_idx);
     
    549549    buddy_system_t *buddy)
    550550{
    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);
    553553        ASSERT(zones.info[z1].flags == zones.info[z2].flags);
    554554        ASSERT(zones.info[z1].base < zones.info[z2].base);
     
    645645NO_TRACE static void return_config_frames(size_t znum, pfn_t pfn, size_t count)
    646646{
    647         ASSERT(zone_flags_available(zones.info[znum].flags));
     647        ASSERT(zones.info[znum].flags & ZONE_AVAILABLE);
    648648       
    649649        size_t cframes = SIZE2FRAMES(zone_conf_size(count));
     
    681681    size_t count)
    682682{
    683         ASSERT(zone_flags_available(zones.info[znum].flags));
     683        ASSERT(zones.info[znum].flags & ZONE_AVAILABLE);
    684684        ASSERT(frame_idx + count < zones.info[znum].count);
    685685       
     
    723723         * set of flags
    724724         */
    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)) {
    730727                ret = false;
    731728                goto errout;
     
    828825        zone->buddy_system = buddy;
    829826       
    830         if (zone_flags_available(flags)) {
     827        if (flags & ZONE_AVAILABLE) {
    831828                /*
    832829                 * Compute order for buddy system and initialize
     
    865862{
    866863        return (count * sizeof(frame_t) + buddy_conf_size(fnzb(count)));
     864}
     865
     866/** Allocate external configuration frames from low memory. */
     867pfn_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));
    867874}
    868875
     
    888895        irq_spinlock_lock(&zones.lock, true);
    889896       
    890         if (zone_flags_available(flags)) {  /* Create available zone */
     897        if (flags & ZONE_AVAILABLE) {  /* Create available zone */
    891898                /* Theoretically we could have NULL here, practically make sure
    892899                 * nobody tries to do that. If some platform requires, remove
     
    894901                 */
    895902                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));
    896906               
    897907                /* If confframe is supposed to be inside our zone, then make sure
     
    914924                                for (i = 0; i < init.cnt; i++)
    915925                                        if (overlaps(addr, PFN2ADDR(confcount),
    916                                             KA2PA(init.tasks[i].addr),
     926                                            init.tasks[i].paddr,
    917927                                            init.tasks[i].size)) {
    918928                                                overlap = true;
     
    10761086#endif
    10771087               
     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();
    10781093                mutex_lock(&mem_avail_mtx);
    10791094               
     
    10881103               
    10891104                mutex_unlock(&mem_avail_mtx);
     1105                interrupts_restore(ipl);
    10901106               
    10911107#ifdef CONFIG_DEBUG
     
    11511167         * Signal that some memory has been freed.
    11521168         */
     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();
    11531176        mutex_lock(&mem_avail_mtx);
    11541177        if (mem_avail_req > 0)
     
    11601183        }
    11611184        mutex_unlock(&mem_avail_mtx);
     1185        interrupts_restore(ipl);
    11621186       
    11631187        if (!(flags & FRAME_NO_RESERVE))
     
    12321256       
    12331257        /* Tell the architecture to create some memory */
    1234         frame_arch_init();
     1258        frame_low_arch_init();
    12351259        if (config.cpu_active == 1) {
    12361260                frame_mark_unavailable(ADDR2PFN(KA2PA(config.base)),
     
    12411265                size_t i;
    12421266                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);
    12441268                        frame_mark_unavailable(pfn,
    12451269                            SIZE2FRAMES(init.tasks[i].size));
     
    12551279                frame_mark_unavailable(0, 1);
    12561280        }
     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 */
     1296bool 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;
    12571314}
    12581315
     
    12931350                *total += (uint64_t) FRAMES2SIZE(zones.info[i].count);
    12941351               
    1295                 if (zone_flags_available(zones.info[i].flags)) {
     1352                if (zones.info[i].flags & ZONE_AVAILABLE) {
    12961353                        *busy += (uint64_t) FRAMES2SIZE(zones.info[i].busy_count);
    12971354                        *free += (uint64_t) FRAMES2SIZE(zones.info[i].free_count);
     
    13441401                irq_spinlock_unlock(&zones.lock, true);
    13451402               
    1346                 bool available = zone_flags_available(flags);
     1403                bool available = ((flags & ZONE_AVAILABLE) != 0);
    13471404               
    13481405                printf("%-4zu", i);
     
    13561413#endif
    13571414               
    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' : '-');
    13621421               
    13631422                if (available)
     
    14011460        irq_spinlock_unlock(&zones.lock, true);
    14021461       
    1403         bool available = zone_flags_available(flags);
     1462        bool available = ((flags & ZONE_AVAILABLE) != 0);
    14041463       
    14051464        uint64_t size;
     
    14111470        printf("Zone size:         %zu frames (%" PRIu64 " %s)\n", count,
    14121471            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' : '-');
    14171478       
    14181479        if (available) {
Note: See TracChangeset for help on using the changeset viewer.