Ignore:
File:
1 edited

Legend:

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

    re394b736 r7250d2c  
    9494 *
    9595 * This lock protects:
    96  * - inactive_as_with_asid_head list
     96 * - inactive_as_with_asid_list
    9797 * - as->asid for each as of the as_t type
    9898 * - asids_allocated counter
     
    105105 * that have valid ASID.
    106106 */
    107 LIST_INITIALIZE(inactive_as_with_asid_head);
     107LIST_INITIALIZE(inactive_as_with_asid_list);
    108108
    109109/** Kernel address space. */
     
    235235        bool cond = true;
    236236        while (cond) {
    237                 ASSERT(!list_empty(&as->as_area_btree.leaf_head));
     237                ASSERT(!list_empty(&as->as_area_btree.leaf_list));
    238238               
    239239                btree_node_t *node =
    240                     list_get_instance(as->as_area_btree.leaf_head.next,
     240                    list_get_instance(list_first(&as->as_area_btree.leaf_list),
    241241                    btree_node_t, leaf_link);
    242242               
     
    302302         * We don't want any area to have conflicts with NULL page.
    303303         */
    304         if (overlaps(addr, count << PAGE_WIDTH, (uintptr_t) NULL, PAGE_SIZE))
     304        if (overlaps(addr, P2SZ(count), (uintptr_t) NULL, PAGE_SIZE))
    305305                return false;
    306306       
     
    329329                        mutex_lock(&area->lock);
    330330                       
    331                         if (overlaps(addr, count << PAGE_WIDTH,
    332                             area->base, area->pages << PAGE_WIDTH)) {
     331                        if (overlaps(addr, P2SZ(count), area->base,
     332                            P2SZ(area->pages))) {
    333333                                mutex_unlock(&area->lock);
    334334                                return false;
     
    346346                        mutex_lock(&area->lock);
    347347                       
    348                         if (overlaps(addr, count << PAGE_WIDTH,
    349                             area->base, area->pages << PAGE_WIDTH)) {
     348                        if (overlaps(addr, P2SZ(count), area->base,
     349                            P2SZ(area->pages))) {
    350350                                mutex_unlock(&area->lock);
    351351                                return false;
     
    366366                mutex_lock(&area->lock);
    367367               
    368                 if (overlaps(addr, count << PAGE_WIDTH,
    369                     area->base, area->pages << PAGE_WIDTH)) {
     368                if (overlaps(addr, P2SZ(count), area->base,
     369                    P2SZ(area->pages))) {
    370370                        mutex_unlock(&area->lock);
    371371                        return false;
     
    380380         */
    381381        if (!KERNEL_ADDRESS_SPACE_SHADOWED) {
    382                 return !overlaps(addr, count << PAGE_WIDTH,
    383                     KERNEL_ADDRESS_SPACE_START,
     382                return !overlaps(addr, P2SZ(count), KERNEL_ADDRESS_SPACE_START,
    384383                    KERNEL_ADDRESS_SPACE_END - KERNEL_ADDRESS_SPACE_START);
    385384        }
     
    474473       
    475474        btree_node_t *leaf;
    476         as_area_t *area = (as_area_t *) btree_search(&as->as_area_btree, va, &leaf);
     475        as_area_t *area = (as_area_t *) btree_search(&as->as_area_btree, va,
     476            &leaf);
    477477        if (area) {
    478478                /* va is the base address of an address space area */
     
    482482       
    483483        /*
    484          * Search the leaf node and the righmost record of its left neighbour
     484         * Search the leaf node and the rightmost record of its left neighbour
    485485         * to find out whether this is a miss or va belongs to an address
    486486         * space area found there.
     
    494494               
    495495                mutex_lock(&area->lock);
    496                
     496
    497497                if ((area->base <= va) &&
    498                     (va < area->base + (area->pages << PAGE_WIDTH)))
     498                    (va <= area->base + (P2SZ(area->pages) - 1)))
    499499                        return area;
    500500               
     
    506506         * Because of its position in the B+tree, it must have base < va.
    507507         */
    508         btree_node_t *lnode = btree_leaf_node_left_neighbour(&as->as_area_btree, leaf);
     508        btree_node_t *lnode = btree_leaf_node_left_neighbour(&as->as_area_btree,
     509            leaf);
    509510        if (lnode) {
    510511                area = (as_area_t *) lnode->value[lnode->keys - 1];
     
    512513                mutex_lock(&area->lock);
    513514               
    514                 if (va < area->base + (area->pages << PAGE_WIDTH))
     515                if (va <= area->base + (P2SZ(area->pages) - 1))
    515516                        return area;
    516517               
     
    577578       
    578579        if (pages < area->pages) {
    579                 uintptr_t start_free = area->base + (pages << PAGE_WIDTH);
     580                uintptr_t start_free = area->base + P2SZ(pages);
    580581               
    581582                /*
     
    590591                 */
    591592                ipl_t ipl = tlb_shootdown_start(TLB_INVL_PAGES, as->asid,
    592                     area->base + (pages << PAGE_WIDTH), area->pages - pages);
     593                    area->base + P2SZ(pages), area->pages - pages);
    593594               
    594595                /*
     
    601602                bool cond = true;
    602603                while (cond) {
    603                         ASSERT(!list_empty(&area->used_space.leaf_head));
     604                        ASSERT(!list_empty(&area->used_space.leaf_list));
    604605                       
    605606                        btree_node_t *node =
    606                             list_get_instance(area->used_space.leaf_head.prev,
     607                            list_get_instance(list_last(&area->used_space.leaf_list),
    607608                            btree_node_t, leaf_link);
    608609                       
     
    613614                                size_t i = 0;
    614615                               
    615                                 if (overlaps(ptr, size << PAGE_WIDTH, area->base,
    616                                     pages << PAGE_WIDTH)) {
     616                                if (overlaps(ptr, P2SZ(size), area->base,
     617                                    P2SZ(pages))) {
    617618                                       
    618                                         if (ptr + (size << PAGE_WIDTH) <= start_free) {
     619                                        if (ptr + P2SZ(size) <= start_free) {
    619620                                                /*
    620621                                                 * The whole interval fits
     
    647648                               
    648649                                for (; i < size; i++) {
    649                                         pte_t *pte = page_mapping_find(as, ptr +
    650                                             (i << PAGE_WIDTH));
     650                                        pte_t *pte = page_mapping_find(as,
     651                                            ptr + P2SZ(i), false);
    651652                                       
    652653                                        ASSERT(pte);
     
    657658                                            (area->backend->frame_free)) {
    658659                                                area->backend->frame_free(area,
    659                                                     ptr + (i << PAGE_WIDTH),
     660                                                    ptr + P2SZ(i),
    660661                                                    PTE_GET_FRAME(pte));
    661662                                        }
    662663                                       
    663                                         page_mapping_remove(as, ptr +
    664                                             (i << PAGE_WIDTH));
     664                                        page_mapping_remove(as, ptr + P2SZ(i));
    665665                                }
    666666                        }
     
    671671                 */
    672672               
    673                 tlb_invalidate_pages(as->asid, area->base + (pages << PAGE_WIDTH),
     673                tlb_invalidate_pages(as->asid, area->base + P2SZ(pages),
    674674                    area->pages - pages);
    675675               
    676676                /*
    677                  * Invalidate software translation caches (e.g. TSB on sparc64).
    678                  */
    679                 as_invalidate_translation_cache(as, area->base +
    680                     (pages << PAGE_WIDTH), area->pages - pages);
     677                 * Invalidate software translation caches
     678                 * (e.g. TSB on sparc64, PHT on ppc32).
     679                 */
     680                as_invalidate_translation_cache(as, area->base + P2SZ(pages),
     681                    area->pages - pages);
    681682                tlb_shootdown_finalize(ipl);
    682683               
     
    726727        if (--sh_info->refcount == 0) {
    727728                dealloc = true;
    728                 link_t *cur;
    729729               
    730730                /*
     
    732732                 * reference from all frames found there.
    733733                 */
    734                 for (cur = sh_info->pagemap.leaf_head.next;
    735                     cur != &sh_info->pagemap.leaf_head; cur = cur->next) {
     734                list_foreach(sh_info->pagemap.leaf_list, cur) {
    736735                        btree_node_t *node
    737736                            = list_get_instance(cur, btree_node_t, leaf_link);
     
    785784         * Visit only the pages mapped by used_space B+tree.
    786785         */
    787         link_t *cur;
    788         for (cur = area->used_space.leaf_head.next;
    789             cur != &area->used_space.leaf_head; cur = cur->next) {
     786        list_foreach(area->used_space.leaf_list, cur) {
    790787                btree_node_t *node;
    791788                btree_key_t i;
     
    797794                       
    798795                        for (size = 0; size < (size_t) node->value[i]; size++) {
    799                                 pte_t *pte =
    800                                     page_mapping_find(as, ptr + (size << PAGE_WIDTH));
     796                                pte_t *pte = page_mapping_find(as,
     797                                     ptr + P2SZ(size), false);
    801798                               
    802799                                ASSERT(pte);
     
    807804                                    (area->backend->frame_free)) {
    808805                                        area->backend->frame_free(area,
    809                                             ptr + (size << PAGE_WIDTH), PTE_GET_FRAME(pte));
     806                                            ptr + P2SZ(size),
     807                                            PTE_GET_FRAME(pte));
    810808                                }
    811809                               
    812                                 page_mapping_remove(as, ptr + (size << PAGE_WIDTH));
     810                                page_mapping_remove(as, ptr + P2SZ(size));
    813811                        }
    814812                }
     
    822820       
    823821        /*
    824          * Invalidate potential software translation caches (e.g. TSB on
    825          * sparc64).
     822         * Invalidate potential software translation caches
     823         * (e.g. TSB on sparc64, PHT on ppc32).
    826824         */
    827825        as_invalidate_translation_cache(as, area->base, area->pages);
     
    897895        }
    898896       
    899         size_t src_size = src_area->pages << PAGE_WIDTH;
     897        size_t src_size = P2SZ(src_area->pages);
    900898        unsigned int src_flags = src_area->flags;
    901899        mem_backend_t *src_backend = src_area->backend;
     
    10631061         */
    10641062        size_t used_pages = 0;
    1065         link_t *cur;
    1066        
    1067         for (cur = area->used_space.leaf_head.next;
    1068             cur != &area->used_space.leaf_head; cur = cur->next) {
     1063       
     1064        list_foreach(area->used_space.leaf_list, cur) {
    10691065                btree_node_t *node
    10701066                    = list_get_instance(cur, btree_node_t, leaf_link);
     
    10921088        size_t frame_idx = 0;
    10931089       
    1094         for (cur = area->used_space.leaf_head.next;
    1095             cur != &area->used_space.leaf_head; cur = cur->next) {
    1096                 btree_node_t *node
    1097                     = list_get_instance(cur, btree_node_t, leaf_link);
     1090        list_foreach(area->used_space.leaf_list, cur) {
     1091                btree_node_t *node = list_get_instance(cur, btree_node_t,
     1092                    leaf_link);
    10981093                btree_key_t i;
    10991094               
     
    11031098                       
    11041099                        for (size = 0; size < (size_t) node->value[i]; size++) {
    1105                                 pte_t *pte =
    1106                                     page_mapping_find(as, ptr + (size << PAGE_WIDTH));
     1100                                pte_t *pte = page_mapping_find(as,
     1101                                    ptr + P2SZ(size), false);
    11071102                               
    11081103                                ASSERT(pte);
     
    11131108                               
    11141109                                /* Remove old mapping */
    1115                                 page_mapping_remove(as, ptr + (size << PAGE_WIDTH));
     1110                                page_mapping_remove(as, ptr + P2SZ(size));
    11161111                        }
    11171112                }
     
    11251120       
    11261121        /*
    1127          * Invalidate potential software translation caches (e.g. TSB on
    1128          * sparc64).
     1122         * Invalidate potential software translation caches
     1123         * (e.g. TSB on sparc64, PHT on ppc32).
    11291124         */
    11301125        as_invalidate_translation_cache(as, area->base, area->pages);
     
    11451140        frame_idx = 0;
    11461141       
    1147         for (cur = area->used_space.leaf_head.next;
    1148             cur != &area->used_space.leaf_head; cur = cur->next) {
     1142        list_foreach(area->used_space.leaf_list, cur) {
    11491143                btree_node_t *node
    11501144                    = list_get_instance(cur, btree_node_t, leaf_link);
     
    11591153                               
    11601154                                /* Insert the new mapping */
    1161                                 page_mapping_insert(as, ptr + (size << PAGE_WIDTH),
     1155                                page_mapping_insert(as, ptr + P2SZ(size),
    11621156                                    old_frame[frame_idx++], page_flags);
    11631157                               
     
    12401234         */
    12411235        pte_t *pte;
    1242         if ((pte = page_mapping_find(AS, page))) {
     1236        if ((pte = page_mapping_find(AS, page, false))) {
    12431237                if (PTE_PRESENT(pte)) {
    12441238                        if (((access == PF_ACCESS_READ) && PTE_READABLE(pte)) ||
     
    12901284 * thing which is forbidden in this context is locking the address space.
    12911285 *
    1292  * When this function is enetered, no spinlocks may be held.
     1286 * When this function is entered, no spinlocks may be held.
    12931287 *
    12941288 * @param old Old address space or NULL.
     
    13321326                       
    13331327                        list_append(&old_as->inactive_as_with_asid_link,
    1334                             &inactive_as_with_asid_head);
     1328                            &inactive_as_with_asid_list);
    13351329                }
    13361330               
     
    14811475       
    14821476        if (src_area) {
    1483                 size = src_area->pages << PAGE_WIDTH;
     1477                size = P2SZ(src_area->pages);
    14841478                mutex_unlock(&src_area->lock);
    14851479        } else
     
    15361530                if (page >= right_pg) {
    15371531                        /* Do nothing. */
    1538                 } else if (overlaps(page, count << PAGE_WIDTH, left_pg,
    1539                     left_cnt << PAGE_WIDTH)) {
     1532                } else if (overlaps(page, P2SZ(count), left_pg,
     1533                    P2SZ(left_cnt))) {
    15401534                        /* The interval intersects with the left interval. */
    15411535                        return false;
    1542                 } else if (overlaps(page, count << PAGE_WIDTH, right_pg,
    1543                     right_cnt << PAGE_WIDTH)) {
     1536                } else if (overlaps(page, P2SZ(count), right_pg,
     1537                    P2SZ(right_cnt))) {
    15441538                        /* The interval intersects with the right interval. */
    15451539                        return false;
    1546                 } else if ((page == left_pg + (left_cnt << PAGE_WIDTH)) &&
    1547                     (page + (count << PAGE_WIDTH) == right_pg)) {
     1540                } else if ((page == left_pg + P2SZ(left_cnt)) &&
     1541                    (page + P2SZ(count) == right_pg)) {
    15481542                        /*
    15491543                         * The interval can be added by merging the two already
     
    15531547                        btree_remove(&area->used_space, right_pg, leaf);
    15541548                        goto success;
    1555                 } else if (page == left_pg + (left_cnt << PAGE_WIDTH)) {
     1549                } else if (page == left_pg + P2SZ(left_cnt)) {
    15561550                        /*
    15571551                         * The interval can be added by simply growing the left
     
    15601554                        node->value[node->keys - 1] += count;
    15611555                        goto success;
    1562                 } else if (page + (count << PAGE_WIDTH) == right_pg) {
     1556                } else if (page + P2SZ(count) == right_pg) {
    15631557                        /*
    15641558                         * The interval can be addded by simply moving base of
     
    15871581                 */
    15881582               
    1589                 if (overlaps(page, count << PAGE_WIDTH, right_pg,
    1590                     right_cnt << PAGE_WIDTH)) {
     1583                if (overlaps(page, P2SZ(count), right_pg, P2SZ(right_cnt))) {
    15911584                        /* The interval intersects with the right interval. */
    15921585                        return false;
    1593                 } else if (page + (count << PAGE_WIDTH) == right_pg) {
     1586                } else if (page + P2SZ(count) == right_pg) {
    15941587                        /*
    15951588                         * The interval can be added by moving the base of the
     
    16261619                if (page < left_pg) {
    16271620                        /* Do nothing. */
    1628                 } else if (overlaps(page, count << PAGE_WIDTH, left_pg,
    1629                     left_cnt << PAGE_WIDTH)) {
     1621                } else if (overlaps(page, P2SZ(count), left_pg,
     1622                    P2SZ(left_cnt))) {
    16301623                        /* The interval intersects with the left interval. */
    16311624                        return false;
    1632                 } else if (overlaps(page, count << PAGE_WIDTH, right_pg,
    1633                     right_cnt << PAGE_WIDTH)) {
     1625                } else if (overlaps(page, P2SZ(count), right_pg,
     1626                    P2SZ(right_cnt))) {
    16341627                        /* The interval intersects with the right interval. */
    16351628                        return false;
    1636                 } else if ((page == left_pg + (left_cnt << PAGE_WIDTH)) &&
    1637                     (page + (count << PAGE_WIDTH) == right_pg)) {
     1629                } else if ((page == left_pg + P2SZ(left_cnt)) &&
     1630                    (page + P2SZ(count) == right_pg)) {
    16381631                        /*
    16391632                         * The interval can be added by merging the two already
     
    16431636                        btree_remove(&area->used_space, right_pg, node);
    16441637                        goto success;
    1645                 } else if (page == left_pg + (left_cnt << PAGE_WIDTH)) {
     1638                } else if (page == left_pg + P2SZ(left_cnt)) {
    16461639                        /*
    16471640                         * The interval can be added by simply growing the left
     
    16501643                        leaf->value[leaf->keys - 1] += count;
    16511644                        goto success;
    1652                 } else if (page + (count << PAGE_WIDTH) == right_pg) {
     1645                } else if (page + P2SZ(count) == right_pg) {
    16531646                        /*
    16541647                         * The interval can be addded by simply moving base of
     
    16771670                 */
    16781671               
    1679                 if (overlaps(page, count << PAGE_WIDTH, left_pg,
    1680                     left_cnt << PAGE_WIDTH)) {
     1672                if (overlaps(page, P2SZ(count), left_pg, P2SZ(left_cnt))) {
    16811673                        /* The interval intersects with the left interval. */
    16821674                        return false;
    1683                 } else if (left_pg + (left_cnt << PAGE_WIDTH) == page) {
     1675                } else if (left_pg + P2SZ(left_cnt) == page) {
    16841676                        /*
    16851677                         * The interval can be added by growing the left
     
    17161708                         */
    17171709                       
    1718                         if (overlaps(page, count << PAGE_WIDTH, left_pg,
    1719                             left_cnt << PAGE_WIDTH)) {
     1710                        if (overlaps(page, P2SZ(count), left_pg,
     1711                            P2SZ(left_cnt))) {
    17201712                                /*
    17211713                                 * The interval intersects with the left
     
    17231715                                 */
    17241716                                return false;
    1725                         } else if (overlaps(page, count << PAGE_WIDTH, right_pg,
    1726                             right_cnt << PAGE_WIDTH)) {
     1717                        } else if (overlaps(page, P2SZ(count), right_pg,
     1718                            P2SZ(right_cnt))) {
    17271719                                /*
    17281720                                 * The interval intersects with the right
     
    17301722                                 */
    17311723                                return false;
    1732                         } else if ((page == left_pg + (left_cnt << PAGE_WIDTH)) &&
    1733                             (page + (count << PAGE_WIDTH) == right_pg)) {
     1724                        } else if ((page == left_pg + P2SZ(left_cnt)) &&
     1725                            (page + P2SZ(count) == right_pg)) {
    17341726                                /*
    17351727                                 * The interval can be added by merging the two
     
    17391731                                btree_remove(&area->used_space, right_pg, leaf);
    17401732                                goto success;
    1741                         } else if (page == left_pg + (left_cnt << PAGE_WIDTH)) {
     1733                        } else if (page == left_pg + P2SZ(left_cnt)) {
    17421734                                /*
    17431735                                 * The interval can be added by simply growing
     
    17461738                                leaf->value[i - 1] += count;
    17471739                                goto success;
    1748                         } else if (page + (count << PAGE_WIDTH) == right_pg) {
     1740                        } else if (page + P2SZ(count) == right_pg) {
    17491741                                /*
    17501742                                 * The interval can be addded by simply moving
     
    18121804                        for (i = 0; i < leaf->keys; i++) {
    18131805                                if (leaf->key[i] == page) {
    1814                                         leaf->key[i] += count << PAGE_WIDTH;
     1806                                        leaf->key[i] += P2SZ(count);
    18151807                                        leaf->value[i] -= count;
    18161808                                        goto success;
     
    18221814        }
    18231815       
    1824         btree_node_t *node = btree_leaf_node_left_neighbour(&area->used_space, leaf);
     1816        btree_node_t *node = btree_leaf_node_left_neighbour(&area->used_space,
     1817            leaf);
    18251818        if ((node) && (page < leaf->key[0])) {
    18261819                uintptr_t left_pg = node->key[node->keys - 1];
    18271820                size_t left_cnt = (size_t) node->value[node->keys - 1];
    18281821               
    1829                 if (overlaps(left_pg, left_cnt << PAGE_WIDTH, page,
    1830                     count << PAGE_WIDTH)) {
    1831                         if (page + (count << PAGE_WIDTH) ==
    1832                             left_pg + (left_cnt << PAGE_WIDTH)) {
     1822                if (overlaps(left_pg, P2SZ(left_cnt), page, P2SZ(count))) {
     1823                        if (page + P2SZ(count) == left_pg + P2SZ(left_cnt)) {
    18331824                                /*
    18341825                                 * The interval is contained in the rightmost
     
    18391830                                node->value[node->keys - 1] -= count;
    18401831                                goto success;
    1841                         } else if (page + (count << PAGE_WIDTH) <
    1842                             left_pg + (left_cnt << PAGE_WIDTH)) {
     1832                        } else if (page + P2SZ(count) <
     1833                            left_pg + P2SZ(left_cnt)) {
     1834                                size_t new_cnt;
     1835
    18431836                                /*
    18441837                                 * The interval is contained in the rightmost
     
    18481841                                 * new interval.
    18491842                                 */
    1850                                 size_t new_cnt = ((left_pg + (left_cnt << PAGE_WIDTH)) -
    1851                                     (page + (count << PAGE_WIDTH))) >> PAGE_WIDTH;
     1843                                new_cnt = ((left_pg + P2SZ(left_cnt)) -
     1844                                    (page + P2SZ(count))) >> PAGE_WIDTH;
    18521845                                node->value[node->keys - 1] -= count + new_cnt;
    18531846                                btree_insert(&area->used_space, page +
    1854                                     (count << PAGE_WIDTH), (void *) new_cnt, leaf);
     1847                                    P2SZ(count), (void *) new_cnt, leaf);
    18551848                                goto success;
    18561849                        }
     
    18651858                size_t left_cnt = (size_t) leaf->value[leaf->keys - 1];
    18661859               
    1867                 if (overlaps(left_pg, left_cnt << PAGE_WIDTH, page,
    1868                     count << PAGE_WIDTH)) {
    1869                         if (page + (count << PAGE_WIDTH) ==
    1870                             left_pg + (left_cnt << PAGE_WIDTH)) {
     1860                if (overlaps(left_pg, P2SZ(left_cnt), page, P2SZ(count))) {
     1861                        if (page + P2SZ(count) == left_pg + P2SZ(left_cnt)) {
    18711862                                /*
    18721863                                 * The interval is contained in the rightmost
     
    18761867                                leaf->value[leaf->keys - 1] -= count;
    18771868                                goto success;
    1878                         } else if (page + (count << PAGE_WIDTH) < left_pg +
    1879                             (left_cnt << PAGE_WIDTH)) {
     1869                        } else if (page + P2SZ(count) < left_pg +
     1870                            P2SZ(left_cnt)) {
     1871                                size_t new_cnt;
     1872
    18801873                                /*
    18811874                                 * The interval is contained in the rightmost
     
    18851878                                 * interval.
    18861879                                 */
    1887                                 size_t new_cnt = ((left_pg + (left_cnt << PAGE_WIDTH)) -
    1888                                     (page + (count << PAGE_WIDTH))) >> PAGE_WIDTH;
     1880                                new_cnt = ((left_pg + P2SZ(left_cnt)) -
     1881                                    (page + P2SZ(count))) >> PAGE_WIDTH;
    18891882                                leaf->value[leaf->keys - 1] -= count + new_cnt;
    18901883                                btree_insert(&area->used_space, page +
    1891                                     (count << PAGE_WIDTH), (void *) new_cnt, leaf);
     1884                                    P2SZ(count), (void *) new_cnt, leaf);
    18921885                                goto success;
    18931886                        }
     
    19111904                         * to (i - 1) and i.
    19121905                         */
    1913                         if (overlaps(left_pg, left_cnt << PAGE_WIDTH, page,
    1914                             count << PAGE_WIDTH)) {
    1915                                 if (page + (count << PAGE_WIDTH) ==
    1916                                     left_pg + (left_cnt << PAGE_WIDTH)) {
     1906                        if (overlaps(left_pg, P2SZ(left_cnt), page,
     1907                            P2SZ(count))) {
     1908                                if (page + P2SZ(count) ==
     1909                                    left_pg + P2SZ(left_cnt)) {
    19171910                                        /*
    19181911                                         * The interval is contained in the
     
    19231916                                        leaf->value[i - 1] -= count;
    19241917                                        goto success;
    1925                                 } else if (page + (count << PAGE_WIDTH) <
    1926                                     left_pg + (left_cnt << PAGE_WIDTH)) {
     1918                                } else if (page + P2SZ(count) <
     1919                                    left_pg + P2SZ(left_cnt)) {
     1920                                        size_t new_cnt;
     1921
    19271922                                        /*
    19281923                                         * The interval is contained in the
     
    19321927                                         * also inserting a new interval.
    19331928                                         */
    1934                                         size_t new_cnt = ((left_pg +
    1935                                             (left_cnt << PAGE_WIDTH)) -
    1936                                             (page + (count << PAGE_WIDTH))) >>
     1929                                        new_cnt = ((left_pg + P2SZ(left_cnt)) -
     1930                                            (page + P2SZ(count))) >>
    19371931                                            PAGE_WIDTH;
    19381932                                        leaf->value[i - 1] -= count + new_cnt;
    19391933                                        btree_insert(&area->used_space, page +
    1940                                             (count << PAGE_WIDTH), (void *) new_cnt,
     1934                                            P2SZ(count), (void *) new_cnt,
    19411935                                            leaf);
    19421936                                        goto success;
     
    20252019       
    20262020        /* Eventually check the addresses behind each area */
    2027         link_t *cur;
    2028         for (cur = AS->as_area_btree.leaf_head.next;
    2029             (ret == 0) && (cur != &AS->as_area_btree.leaf_head);
    2030             cur = cur->next) {
     2021        list_foreach(AS->as_area_btree.leaf_list, cur) {
     2022                if (ret != 0)
     2023                        break;
     2024
    20312025                btree_node_t *node =
    20322026                    list_get_instance(cur, btree_node_t, leaf_link);
     
    20342028                btree_key_t i;
    20352029                for (i = 0; (ret == 0) && (i < node->keys); i++) {
     2030                        uintptr_t addr;
     2031
    20362032                        as_area_t *area = (as_area_t *) node->value[i];
    20372033                       
    20382034                        mutex_lock(&area->lock);
    20392035                       
    2040                         uintptr_t addr =
    2041                             ALIGN_UP(area->base + (area->pages << PAGE_WIDTH),
     2036                        addr = ALIGN_UP(area->base + P2SZ(area->pages),
    20422037                            PAGE_SIZE);
    20432038                       
     
    20692064       
    20702065        size_t area_cnt = 0;
    2071         link_t *cur;
    2072        
    2073         for (cur = as->as_area_btree.leaf_head.next;
    2074             cur != &as->as_area_btree.leaf_head; cur = cur->next) {
     2066       
     2067        list_foreach(as->as_area_btree.leaf_list, cur) {
    20752068                btree_node_t *node =
    20762069                    list_get_instance(cur, btree_node_t, leaf_link);
     
    20852078        size_t area_idx = 0;
    20862079       
    2087         for (cur = as->as_area_btree.leaf_head.next;
    2088             cur != &as->as_area_btree.leaf_head; cur = cur->next) {
     2080        list_foreach(as->as_area_btree.leaf_list, cur) {
    20892081                btree_node_t *node =
    20902082                    list_get_instance(cur, btree_node_t, leaf_link);
     
    20982090                       
    20992091                        info[area_idx].start_addr = area->base;
    2100                         info[area_idx].size = FRAMES2SIZE(area->pages);
     2092                        info[area_idx].size = P2SZ(area->pages);
    21012093                        info[area_idx].flags = area->flags;
    21022094                        ++area_idx;
     
    21222114       
    21232115        /* Print out info about address space areas */
    2124         link_t *cur;
    2125         for (cur = as->as_area_btree.leaf_head.next;
    2126             cur != &as->as_area_btree.leaf_head; cur = cur->next) {
     2116        list_foreach(as->as_area_btree.leaf_list, cur) {
    21272117                btree_node_t *node
    21282118                    = list_get_instance(cur, btree_node_t, leaf_link);
     
    21362126                            " (%p - %p)\n", area, (void *) area->base,
    21372127                            area->pages, (void *) area->base,
    2138                             (void *) (area->base + FRAMES2SIZE(area->pages)));
     2128                            (void *) (area->base + P2SZ(area->pages)));
    21392129                        mutex_unlock(&area->lock);
    21402130                }
Note: See TracChangeset for help on using the changeset viewer.