Ignore:
File:
1 edited

Legend:

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

    r7250d2c re394b736  
    9494 *
    9595 * This lock protects:
    96  * - inactive_as_with_asid_list
     96 * - inactive_as_with_asid_head 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_list);
     107LIST_INITIALIZE(inactive_as_with_asid_head);
    108108
    109109/** Kernel address space. */
     
    235235        bool cond = true;
    236236        while (cond) {
    237                 ASSERT(!list_empty(&as->as_area_btree.leaf_list));
     237                ASSERT(!list_empty(&as->as_area_btree.leaf_head));
    238238               
    239239                btree_node_t *node =
    240                     list_get_instance(list_first(&as->as_area_btree.leaf_list),
     240                    list_get_instance(as->as_area_btree.leaf_head.next,
    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, P2SZ(count), (uintptr_t) NULL, PAGE_SIZE))
     304        if (overlaps(addr, count << PAGE_WIDTH, (uintptr_t) NULL, PAGE_SIZE))
    305305                return false;
    306306       
     
    329329                        mutex_lock(&area->lock);
    330330                       
    331                         if (overlaps(addr, P2SZ(count), area->base,
    332                             P2SZ(area->pages))) {
     331                        if (overlaps(addr, count << PAGE_WIDTH,
     332                            area->base, area->pages << PAGE_WIDTH)) {
    333333                                mutex_unlock(&area->lock);
    334334                                return false;
     
    346346                        mutex_lock(&area->lock);
    347347                       
    348                         if (overlaps(addr, P2SZ(count), area->base,
    349                             P2SZ(area->pages))) {
     348                        if (overlaps(addr, count << PAGE_WIDTH,
     349                            area->base, area->pages << PAGE_WIDTH)) {
    350350                                mutex_unlock(&area->lock);
    351351                                return false;
     
    366366                mutex_lock(&area->lock);
    367367               
    368                 if (overlaps(addr, P2SZ(count), area->base,
    369                     P2SZ(area->pages))) {
     368                if (overlaps(addr, count << PAGE_WIDTH,
     369                    area->base, area->pages << PAGE_WIDTH)) {
    370370                        mutex_unlock(&area->lock);
    371371                        return false;
     
    380380         */
    381381        if (!KERNEL_ADDRESS_SPACE_SHADOWED) {
    382                 return !overlaps(addr, P2SZ(count), KERNEL_ADDRESS_SPACE_START,
     382                return !overlaps(addr, count << PAGE_WIDTH,
     383                    KERNEL_ADDRESS_SPACE_START,
    383384                    KERNEL_ADDRESS_SPACE_END - KERNEL_ADDRESS_SPACE_START);
    384385        }
     
    473474       
    474475        btree_node_t *leaf;
    475         as_area_t *area = (as_area_t *) btree_search(&as->as_area_btree, va,
    476             &leaf);
     476        as_area_t *area = (as_area_t *) btree_search(&as->as_area_btree, va, &leaf);
    477477        if (area) {
    478478                /* va is the base address of an address space area */
     
    482482       
    483483        /*
    484          * Search the leaf node and the rightmost record of its left neighbour
     484         * Search the leaf node and the righmost 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 + (P2SZ(area->pages) - 1)))
     498                    (va < area->base + (area->pages << PAGE_WIDTH)))
    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,
    509             leaf);
     508        btree_node_t *lnode = btree_leaf_node_left_neighbour(&as->as_area_btree, leaf);
    510509        if (lnode) {
    511510                area = (as_area_t *) lnode->value[lnode->keys - 1];
     
    513512                mutex_lock(&area->lock);
    514513               
    515                 if (va <= area->base + (P2SZ(area->pages) - 1))
     514                if (va < area->base + (area->pages << PAGE_WIDTH))
    516515                        return area;
    517516               
     
    578577       
    579578        if (pages < area->pages) {
    580                 uintptr_t start_free = area->base + P2SZ(pages);
     579                uintptr_t start_free = area->base + (pages << PAGE_WIDTH);
    581580               
    582581                /*
     
    591590                 */
    592591                ipl_t ipl = tlb_shootdown_start(TLB_INVL_PAGES, as->asid,
    593                     area->base + P2SZ(pages), area->pages - pages);
     592                    area->base + (pages << PAGE_WIDTH), area->pages - pages);
    594593               
    595594                /*
     
    602601                bool cond = true;
    603602                while (cond) {
    604                         ASSERT(!list_empty(&area->used_space.leaf_list));
     603                        ASSERT(!list_empty(&area->used_space.leaf_head));
    605604                       
    606605                        btree_node_t *node =
    607                             list_get_instance(list_last(&area->used_space.leaf_list),
     606                            list_get_instance(area->used_space.leaf_head.prev,
    608607                            btree_node_t, leaf_link);
    609608                       
     
    614613                                size_t i = 0;
    615614                               
    616                                 if (overlaps(ptr, P2SZ(size), area->base,
    617                                     P2SZ(pages))) {
     615                                if (overlaps(ptr, size << PAGE_WIDTH, area->base,
     616                                    pages << PAGE_WIDTH)) {
    618617                                       
    619                                         if (ptr + P2SZ(size) <= start_free) {
     618                                        if (ptr + (size << PAGE_WIDTH) <= start_free) {
    620619                                                /*
    621620                                                 * The whole interval fits
     
    648647                               
    649648                                for (; i < size; i++) {
    650                                         pte_t *pte = page_mapping_find(as,
    651                                             ptr + P2SZ(i), false);
     649                                        pte_t *pte = page_mapping_find(as, ptr +
     650                                            (i << PAGE_WIDTH));
    652651                                       
    653652                                        ASSERT(pte);
     
    658657                                            (area->backend->frame_free)) {
    659658                                                area->backend->frame_free(area,
    660                                                     ptr + P2SZ(i),
     659                                                    ptr + (i << PAGE_WIDTH),
    661660                                                    PTE_GET_FRAME(pte));
    662661                                        }
    663662                                       
    664                                         page_mapping_remove(as, ptr + P2SZ(i));
     663                                        page_mapping_remove(as, ptr +
     664                                            (i << PAGE_WIDTH));
    665665                                }
    666666                        }
     
    671671                 */
    672672               
    673                 tlb_invalidate_pages(as->asid, area->base + P2SZ(pages),
     673                tlb_invalidate_pages(as->asid, area->base + (pages << PAGE_WIDTH),
    674674                    area->pages - pages);
    675675               
    676676                /*
    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);
     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);
    682681                tlb_shootdown_finalize(ipl);
    683682               
     
    727726        if (--sh_info->refcount == 0) {
    728727                dealloc = true;
     728                link_t *cur;
    729729               
    730730                /*
     
    732732                 * reference from all frames found there.
    733733                 */
    734                 list_foreach(sh_info->pagemap.leaf_list, cur) {
     734                for (cur = sh_info->pagemap.leaf_head.next;
     735                    cur != &sh_info->pagemap.leaf_head; cur = cur->next) {
    735736                        btree_node_t *node
    736737                            = list_get_instance(cur, btree_node_t, leaf_link);
     
    784785         * Visit only the pages mapped by used_space B+tree.
    785786         */
    786         list_foreach(area->used_space.leaf_list, cur) {
     787        link_t *cur;
     788        for (cur = area->used_space.leaf_head.next;
     789            cur != &area->used_space.leaf_head; cur = cur->next) {
    787790                btree_node_t *node;
    788791                btree_key_t i;
     
    794797                       
    795798                        for (size = 0; size < (size_t) node->value[i]; size++) {
    796                                 pte_t *pte = page_mapping_find(as,
    797                                      ptr + P2SZ(size), false);
     799                                pte_t *pte =
     800                                    page_mapping_find(as, ptr + (size << PAGE_WIDTH));
    798801                               
    799802                                ASSERT(pte);
     
    804807                                    (area->backend->frame_free)) {
    805808                                        area->backend->frame_free(area,
    806                                             ptr + P2SZ(size),
    807                                             PTE_GET_FRAME(pte));
     809                                            ptr + (size << PAGE_WIDTH), PTE_GET_FRAME(pte));
    808810                                }
    809811                               
    810                                 page_mapping_remove(as, ptr + P2SZ(size));
     812                                page_mapping_remove(as, ptr + (size << PAGE_WIDTH));
    811813                        }
    812814                }
     
    820822       
    821823        /*
    822          * Invalidate potential software translation caches
    823          * (e.g. TSB on sparc64, PHT on ppc32).
     824         * Invalidate potential software translation caches (e.g. TSB on
     825         * sparc64).
    824826         */
    825827        as_invalidate_translation_cache(as, area->base, area->pages);
     
    895897        }
    896898       
    897         size_t src_size = P2SZ(src_area->pages);
     899        size_t src_size = src_area->pages << PAGE_WIDTH;
    898900        unsigned int src_flags = src_area->flags;
    899901        mem_backend_t *src_backend = src_area->backend;
     
    10611063         */
    10621064        size_t used_pages = 0;
    1063        
    1064         list_foreach(area->used_space.leaf_list, cur) {
     1065        link_t *cur;
     1066       
     1067        for (cur = area->used_space.leaf_head.next;
     1068            cur != &area->used_space.leaf_head; cur = cur->next) {
    10651069                btree_node_t *node
    10661070                    = list_get_instance(cur, btree_node_t, leaf_link);
     
    10881092        size_t frame_idx = 0;
    10891093       
    1090         list_foreach(area->used_space.leaf_list, cur) {
    1091                 btree_node_t *node = list_get_instance(cur, btree_node_t,
    1092                     leaf_link);
     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);
    10931098                btree_key_t i;
    10941099               
     
    10981103                       
    10991104                        for (size = 0; size < (size_t) node->value[i]; size++) {
    1100                                 pte_t *pte = page_mapping_find(as,
    1101                                     ptr + P2SZ(size), false);
     1105                                pte_t *pte =
     1106                                    page_mapping_find(as, ptr + (size << PAGE_WIDTH));
    11021107                               
    11031108                                ASSERT(pte);
     
    11081113                               
    11091114                                /* Remove old mapping */
    1110                                 page_mapping_remove(as, ptr + P2SZ(size));
     1115                                page_mapping_remove(as, ptr + (size << PAGE_WIDTH));
    11111116                        }
    11121117                }
     
    11201125       
    11211126        /*
    1122          * Invalidate potential software translation caches
    1123          * (e.g. TSB on sparc64, PHT on ppc32).
     1127         * Invalidate potential software translation caches (e.g. TSB on
     1128         * sparc64).
    11241129         */
    11251130        as_invalidate_translation_cache(as, area->base, area->pages);
     
    11401145        frame_idx = 0;
    11411146       
    1142         list_foreach(area->used_space.leaf_list, cur) {
     1147        for (cur = area->used_space.leaf_head.next;
     1148            cur != &area->used_space.leaf_head; cur = cur->next) {
    11431149                btree_node_t *node
    11441150                    = list_get_instance(cur, btree_node_t, leaf_link);
     
    11531159                               
    11541160                                /* Insert the new mapping */
    1155                                 page_mapping_insert(as, ptr + P2SZ(size),
     1161                                page_mapping_insert(as, ptr + (size << PAGE_WIDTH),
    11561162                                    old_frame[frame_idx++], page_flags);
    11571163                               
     
    12341240         */
    12351241        pte_t *pte;
    1236         if ((pte = page_mapping_find(AS, page, false))) {
     1242        if ((pte = page_mapping_find(AS, page))) {
    12371243                if (PTE_PRESENT(pte)) {
    12381244                        if (((access == PF_ACCESS_READ) && PTE_READABLE(pte)) ||
     
    12841290 * thing which is forbidden in this context is locking the address space.
    12851291 *
    1286  * When this function is entered, no spinlocks may be held.
     1292 * When this function is enetered, no spinlocks may be held.
    12871293 *
    12881294 * @param old Old address space or NULL.
     
    13261332                       
    13271333                        list_append(&old_as->inactive_as_with_asid_link,
    1328                             &inactive_as_with_asid_list);
     1334                            &inactive_as_with_asid_head);
    13291335                }
    13301336               
     
    14751481       
    14761482        if (src_area) {
    1477                 size = P2SZ(src_area->pages);
     1483                size = src_area->pages << PAGE_WIDTH;
    14781484                mutex_unlock(&src_area->lock);
    14791485        } else
     
    15301536                if (page >= right_pg) {
    15311537                        /* Do nothing. */
    1532                 } else if (overlaps(page, P2SZ(count), left_pg,
    1533                     P2SZ(left_cnt))) {
     1538                } else if (overlaps(page, count << PAGE_WIDTH, left_pg,
     1539                    left_cnt << PAGE_WIDTH)) {
    15341540                        /* The interval intersects with the left interval. */
    15351541                        return false;
    1536                 } else if (overlaps(page, P2SZ(count), right_pg,
    1537                     P2SZ(right_cnt))) {
     1542                } else if (overlaps(page, count << PAGE_WIDTH, right_pg,
     1543                    right_cnt << PAGE_WIDTH)) {
    15381544                        /* The interval intersects with the right interval. */
    15391545                        return false;
    1540                 } else if ((page == left_pg + P2SZ(left_cnt)) &&
    1541                     (page + P2SZ(count) == right_pg)) {
     1546                } else if ((page == left_pg + (left_cnt << PAGE_WIDTH)) &&
     1547                    (page + (count << PAGE_WIDTH) == right_pg)) {
    15421548                        /*
    15431549                         * The interval can be added by merging the two already
     
    15471553                        btree_remove(&area->used_space, right_pg, leaf);
    15481554                        goto success;
    1549                 } else if (page == left_pg + P2SZ(left_cnt)) {
     1555                } else if (page == left_pg + (left_cnt << PAGE_WIDTH)) {
    15501556                        /*
    15511557                         * The interval can be added by simply growing the left
     
    15541560                        node->value[node->keys - 1] += count;
    15551561                        goto success;
    1556                 } else if (page + P2SZ(count) == right_pg) {
     1562                } else if (page + (count << PAGE_WIDTH) == right_pg) {
    15571563                        /*
    15581564                         * The interval can be addded by simply moving base of
     
    15811587                 */
    15821588               
    1583                 if (overlaps(page, P2SZ(count), right_pg, P2SZ(right_cnt))) {
     1589                if (overlaps(page, count << PAGE_WIDTH, right_pg,
     1590                    right_cnt << PAGE_WIDTH)) {
    15841591                        /* The interval intersects with the right interval. */
    15851592                        return false;
    1586                 } else if (page + P2SZ(count) == right_pg) {
     1593                } else if (page + (count << PAGE_WIDTH) == right_pg) {
    15871594                        /*
    15881595                         * The interval can be added by moving the base of the
     
    16191626                if (page < left_pg) {
    16201627                        /* Do nothing. */
    1621                 } else if (overlaps(page, P2SZ(count), left_pg,
    1622                     P2SZ(left_cnt))) {
     1628                } else if (overlaps(page, count << PAGE_WIDTH, left_pg,
     1629                    left_cnt << PAGE_WIDTH)) {
    16231630                        /* The interval intersects with the left interval. */
    16241631                        return false;
    1625                 } else if (overlaps(page, P2SZ(count), right_pg,
    1626                     P2SZ(right_cnt))) {
     1632                } else if (overlaps(page, count << PAGE_WIDTH, right_pg,
     1633                    right_cnt << PAGE_WIDTH)) {
    16271634                        /* The interval intersects with the right interval. */
    16281635                        return false;
    1629                 } else if ((page == left_pg + P2SZ(left_cnt)) &&
    1630                     (page + P2SZ(count) == right_pg)) {
     1636                } else if ((page == left_pg + (left_cnt << PAGE_WIDTH)) &&
     1637                    (page + (count << PAGE_WIDTH) == right_pg)) {
    16311638                        /*
    16321639                         * The interval can be added by merging the two already
     
    16361643                        btree_remove(&area->used_space, right_pg, node);
    16371644                        goto success;
    1638                 } else if (page == left_pg + P2SZ(left_cnt)) {
     1645                } else if (page == left_pg + (left_cnt << PAGE_WIDTH)) {
    16391646                        /*
    16401647                         * The interval can be added by simply growing the left
     
    16431650                        leaf->value[leaf->keys - 1] += count;
    16441651                        goto success;
    1645                 } else if (page + P2SZ(count) == right_pg) {
     1652                } else if (page + (count << PAGE_WIDTH) == right_pg) {
    16461653                        /*
    16471654                         * The interval can be addded by simply moving base of
     
    16701677                 */
    16711678               
    1672                 if (overlaps(page, P2SZ(count), left_pg, P2SZ(left_cnt))) {
     1679                if (overlaps(page, count << PAGE_WIDTH, left_pg,
     1680                    left_cnt << PAGE_WIDTH)) {
    16731681                        /* The interval intersects with the left interval. */
    16741682                        return false;
    1675                 } else if (left_pg + P2SZ(left_cnt) == page) {
     1683                } else if (left_pg + (left_cnt << PAGE_WIDTH) == page) {
    16761684                        /*
    16771685                         * The interval can be added by growing the left
     
    17081716                         */
    17091717                       
    1710                         if (overlaps(page, P2SZ(count), left_pg,
    1711                             P2SZ(left_cnt))) {
     1718                        if (overlaps(page, count << PAGE_WIDTH, left_pg,
     1719                            left_cnt << PAGE_WIDTH)) {
    17121720                                /*
    17131721                                 * The interval intersects with the left
     
    17151723                                 */
    17161724                                return false;
    1717                         } else if (overlaps(page, P2SZ(count), right_pg,
    1718                             P2SZ(right_cnt))) {
     1725                        } else if (overlaps(page, count << PAGE_WIDTH, right_pg,
     1726                            right_cnt << PAGE_WIDTH)) {
    17191727                                /*
    17201728                                 * The interval intersects with the right
     
    17221730                                 */
    17231731                                return false;
    1724                         } else if ((page == left_pg + P2SZ(left_cnt)) &&
    1725                             (page + P2SZ(count) == right_pg)) {
     1732                        } else if ((page == left_pg + (left_cnt << PAGE_WIDTH)) &&
     1733                            (page + (count << PAGE_WIDTH) == right_pg)) {
    17261734                                /*
    17271735                                 * The interval can be added by merging the two
     
    17311739                                btree_remove(&area->used_space, right_pg, leaf);
    17321740                                goto success;
    1733                         } else if (page == left_pg + P2SZ(left_cnt)) {
     1741                        } else if (page == left_pg + (left_cnt << PAGE_WIDTH)) {
    17341742                                /*
    17351743                                 * The interval can be added by simply growing
     
    17381746                                leaf->value[i - 1] += count;
    17391747                                goto success;
    1740                         } else if (page + P2SZ(count) == right_pg) {
     1748                        } else if (page + (count << PAGE_WIDTH) == right_pg) {
    17411749                                /*
    17421750                                 * The interval can be addded by simply moving
     
    18041812                        for (i = 0; i < leaf->keys; i++) {
    18051813                                if (leaf->key[i] == page) {
    1806                                         leaf->key[i] += P2SZ(count);
     1814                                        leaf->key[i] += count << PAGE_WIDTH;
    18071815                                        leaf->value[i] -= count;
    18081816                                        goto success;
     
    18141822        }
    18151823       
    1816         btree_node_t *node = btree_leaf_node_left_neighbour(&area->used_space,
    1817             leaf);
     1824        btree_node_t *node = btree_leaf_node_left_neighbour(&area->used_space, leaf);
    18181825        if ((node) && (page < leaf->key[0])) {
    18191826                uintptr_t left_pg = node->key[node->keys - 1];
    18201827                size_t left_cnt = (size_t) node->value[node->keys - 1];
    18211828               
    1822                 if (overlaps(left_pg, P2SZ(left_cnt), page, P2SZ(count))) {
    1823                         if (page + P2SZ(count) == left_pg + P2SZ(left_cnt)) {
     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)) {
    18241833                                /*
    18251834                                 * The interval is contained in the rightmost
     
    18301839                                node->value[node->keys - 1] -= count;
    18311840                                goto success;
    1832                         } else if (page + P2SZ(count) <
    1833                             left_pg + P2SZ(left_cnt)) {
    1834                                 size_t new_cnt;
    1835 
     1841                        } else if (page + (count << PAGE_WIDTH) <
     1842                            left_pg + (left_cnt << PAGE_WIDTH)) {
    18361843                                /*
    18371844                                 * The interval is contained in the rightmost
     
    18411848                                 * new interval.
    18421849                                 */
    1843                                 new_cnt = ((left_pg + P2SZ(left_cnt)) -
    1844                                     (page + P2SZ(count))) >> PAGE_WIDTH;
     1850                                size_t new_cnt = ((left_pg + (left_cnt << PAGE_WIDTH)) -
     1851                                    (page + (count << PAGE_WIDTH))) >> PAGE_WIDTH;
    18451852                                node->value[node->keys - 1] -= count + new_cnt;
    18461853                                btree_insert(&area->used_space, page +
    1847                                     P2SZ(count), (void *) new_cnt, leaf);
     1854                                    (count << PAGE_WIDTH), (void *) new_cnt, leaf);
    18481855                                goto success;
    18491856                        }
     
    18581865                size_t left_cnt = (size_t) leaf->value[leaf->keys - 1];
    18591866               
    1860                 if (overlaps(left_pg, P2SZ(left_cnt), page, P2SZ(count))) {
    1861                         if (page + P2SZ(count) == left_pg + P2SZ(left_cnt)) {
     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)) {
    18621871                                /*
    18631872                                 * The interval is contained in the rightmost
     
    18671876                                leaf->value[leaf->keys - 1] -= count;
    18681877                                goto success;
    1869                         } else if (page + P2SZ(count) < left_pg +
    1870                             P2SZ(left_cnt)) {
    1871                                 size_t new_cnt;
    1872 
     1878                        } else if (page + (count << PAGE_WIDTH) < left_pg +
     1879                            (left_cnt << PAGE_WIDTH)) {
    18731880                                /*
    18741881                                 * The interval is contained in the rightmost
     
    18781885                                 * interval.
    18791886                                 */
    1880                                 new_cnt = ((left_pg + P2SZ(left_cnt)) -
    1881                                     (page + P2SZ(count))) >> PAGE_WIDTH;
     1887                                size_t new_cnt = ((left_pg + (left_cnt << PAGE_WIDTH)) -
     1888                                    (page + (count << PAGE_WIDTH))) >> PAGE_WIDTH;
    18821889                                leaf->value[leaf->keys - 1] -= count + new_cnt;
    18831890                                btree_insert(&area->used_space, page +
    1884                                     P2SZ(count), (void *) new_cnt, leaf);
     1891                                    (count << PAGE_WIDTH), (void *) new_cnt, leaf);
    18851892                                goto success;
    18861893                        }
     
    19041911                         * to (i - 1) and i.
    19051912                         */
    1906                         if (overlaps(left_pg, P2SZ(left_cnt), page,
    1907                             P2SZ(count))) {
    1908                                 if (page + P2SZ(count) ==
    1909                                     left_pg + P2SZ(left_cnt)) {
     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)) {
    19101917                                        /*
    19111918                                         * The interval is contained in the
     
    19161923                                        leaf->value[i - 1] -= count;
    19171924                                        goto success;
    1918                                 } else if (page + P2SZ(count) <
    1919                                     left_pg + P2SZ(left_cnt)) {
    1920                                         size_t new_cnt;
    1921 
     1925                                } else if (page + (count << PAGE_WIDTH) <
     1926                                    left_pg + (left_cnt << PAGE_WIDTH)) {
    19221927                                        /*
    19231928                                         * The interval is contained in the
     
    19271932                                         * also inserting a new interval.
    19281933                                         */
    1929                                         new_cnt = ((left_pg + P2SZ(left_cnt)) -
    1930                                             (page + P2SZ(count))) >>
     1934                                        size_t new_cnt = ((left_pg +
     1935                                            (left_cnt << PAGE_WIDTH)) -
     1936                                            (page + (count << PAGE_WIDTH))) >>
    19311937                                            PAGE_WIDTH;
    19321938                                        leaf->value[i - 1] -= count + new_cnt;
    19331939                                        btree_insert(&area->used_space, page +
    1934                                             P2SZ(count), (void *) new_cnt,
     1940                                            (count << PAGE_WIDTH), (void *) new_cnt,
    19351941                                            leaf);
    19361942                                        goto success;
     
    20192025       
    20202026        /* Eventually check the addresses behind each area */
    2021         list_foreach(AS->as_area_btree.leaf_list, cur) {
    2022                 if (ret != 0)
    2023                         break;
    2024 
     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) {
    20252031                btree_node_t *node =
    20262032                    list_get_instance(cur, btree_node_t, leaf_link);
     
    20282034                btree_key_t i;
    20292035                for (i = 0; (ret == 0) && (i < node->keys); i++) {
    2030                         uintptr_t addr;
    2031 
    20322036                        as_area_t *area = (as_area_t *) node->value[i];
    20332037                       
    20342038                        mutex_lock(&area->lock);
    20352039                       
    2036                         addr = ALIGN_UP(area->base + P2SZ(area->pages),
     2040                        uintptr_t addr =
     2041                            ALIGN_UP(area->base + (area->pages << PAGE_WIDTH),
    20372042                            PAGE_SIZE);
    20382043                       
     
    20642069       
    20652070        size_t area_cnt = 0;
    2066        
    2067         list_foreach(as->as_area_btree.leaf_list, cur) {
     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) {
    20682075                btree_node_t *node =
    20692076                    list_get_instance(cur, btree_node_t, leaf_link);
     
    20782085        size_t area_idx = 0;
    20792086       
    2080         list_foreach(as->as_area_btree.leaf_list, cur) {
     2087        for (cur = as->as_area_btree.leaf_head.next;
     2088            cur != &as->as_area_btree.leaf_head; cur = cur->next) {
    20812089                btree_node_t *node =
    20822090                    list_get_instance(cur, btree_node_t, leaf_link);
     
    20902098                       
    20912099                        info[area_idx].start_addr = area->base;
    2092                         info[area_idx].size = P2SZ(area->pages);
     2100                        info[area_idx].size = FRAMES2SIZE(area->pages);
    20932101                        info[area_idx].flags = area->flags;
    20942102                        ++area_idx;
     
    21142122       
    21152123        /* Print out info about address space areas */
    2116         list_foreach(as->as_area_btree.leaf_list, cur) {
     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) {
    21172127                btree_node_t *node
    21182128                    = list_get_instance(cur, btree_node_t, leaf_link);
     
    21262136                            " (%p - %p)\n", area, (void *) area->base,
    21272137                            area->pages, (void *) area->base,
    2128                             (void *) (area->base + P2SZ(area->pages)));
     2138                            (void *) (area->base + FRAMES2SIZE(area->pages)));
    21292139                        mutex_unlock(&area->lock);
    21302140                }
Note: See TracChangeset for help on using the changeset viewer.