Changes in kernel/generic/src/mm/as.c [b6f3e7e:e394b736] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/mm/as.c
rb6f3e7e re394b736 302 302 * We don't want any area to have conflicts with NULL page. 303 303 */ 304 if (overlaps(addr, P2SZ(count), (uintptr_t) NULL, PAGE_SIZE))304 if (overlaps(addr, count << PAGE_WIDTH, (uintptr_t) NULL, PAGE_SIZE)) 305 305 return false; 306 306 … … 329 329 mutex_lock(&area->lock); 330 330 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)) { 333 333 mutex_unlock(&area->lock); 334 334 return false; … … 346 346 mutex_lock(&area->lock); 347 347 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)) { 350 350 mutex_unlock(&area->lock); 351 351 return false; … … 366 366 mutex_lock(&area->lock); 367 367 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)) { 370 370 mutex_unlock(&area->lock); 371 371 return false; … … 380 380 */ 381 381 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, 383 384 KERNEL_ADDRESS_SPACE_END - KERNEL_ADDRESS_SPACE_START); 384 385 } … … 473 474 474 475 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); 477 477 if (area) { 478 478 /* va is the base address of an address space area */ … … 482 482 483 483 /* 484 * Search the leaf node and the righ tmost record of its left neighbour484 * Search the leaf node and the righmost record of its left neighbour 485 485 * to find out whether this is a miss or va belongs to an address 486 486 * space area found there. … … 494 494 495 495 mutex_lock(&area->lock); 496 496 497 497 if ((area->base <= va) && 498 (va < = area->base + (P2SZ(area->pages) - 1)))498 (va < area->base + (area->pages << PAGE_WIDTH))) 499 499 return area; 500 500 … … 506 506 * Because of its position in the B+tree, it must have base < va. 507 507 */ 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); 510 509 if (lnode) { 511 510 area = (as_area_t *) lnode->value[lnode->keys - 1]; … … 513 512 mutex_lock(&area->lock); 514 513 515 if (va < = area->base + (P2SZ(area->pages) - 1))514 if (va < area->base + (area->pages << PAGE_WIDTH)) 516 515 return area; 517 516 … … 578 577 579 578 if (pages < area->pages) { 580 uintptr_t start_free = area->base + P2SZ(pages);579 uintptr_t start_free = area->base + (pages << PAGE_WIDTH); 581 580 582 581 /* … … 591 590 */ 592 591 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); 594 593 595 594 /* … … 614 613 size_t i = 0; 615 614 616 if (overlaps(ptr, P2SZ(size), area->base,617 P2SZ(pages))) {615 if (overlaps(ptr, size << PAGE_WIDTH, area->base, 616 pages << PAGE_WIDTH)) { 618 617 619 if (ptr + P2SZ(size) <= start_free) {618 if (ptr + (size << PAGE_WIDTH) <= start_free) { 620 619 /* 621 620 * The whole interval fits … … 648 647 649 648 for (; i < size; i++) { 650 pte_t *pte = page_mapping_find(as, 651 ptr + P2SZ(i));649 pte_t *pte = page_mapping_find(as, ptr + 650 (i << PAGE_WIDTH)); 652 651 653 652 ASSERT(pte); … … 658 657 (area->backend->frame_free)) { 659 658 area->backend->frame_free(area, 660 ptr + P2SZ(i),659 ptr + (i << PAGE_WIDTH), 661 660 PTE_GET_FRAME(pte)); 662 661 } 663 662 664 page_mapping_remove(as, ptr + P2SZ(i)); 663 page_mapping_remove(as, ptr + 664 (i << PAGE_WIDTH)); 665 665 } 666 666 } … … 671 671 */ 672 672 673 tlb_invalidate_pages(as->asid, area->base + P2SZ(pages),673 tlb_invalidate_pages(as->asid, area->base + (pages << PAGE_WIDTH), 674 674 area->pages - pages); 675 675 … … 677 677 * Invalidate software translation caches (e.g. TSB on sparc64). 678 678 */ 679 as_invalidate_translation_cache(as, area->base + P2SZ(pages),680 area->pages - pages);679 as_invalidate_translation_cache(as, area->base + 680 (pages << PAGE_WIDTH), area->pages - pages); 681 681 tlb_shootdown_finalize(ipl); 682 682 … … 797 797 798 798 for (size = 0; size < (size_t) node->value[i]; size++) { 799 pte_t *pte = page_mapping_find(as,800 ptr + P2SZ(size));799 pte_t *pte = 800 page_mapping_find(as, ptr + (size << PAGE_WIDTH)); 801 801 802 802 ASSERT(pte); … … 807 807 (area->backend->frame_free)) { 808 808 area->backend->frame_free(area, 809 ptr + P2SZ(size), 810 PTE_GET_FRAME(pte)); 809 ptr + (size << PAGE_WIDTH), PTE_GET_FRAME(pte)); 811 810 } 812 811 813 page_mapping_remove(as, ptr + P2SZ(size));812 page_mapping_remove(as, ptr + (size << PAGE_WIDTH)); 814 813 } 815 814 } … … 898 897 } 899 898 900 size_t src_size = P2SZ(src_area->pages);899 size_t src_size = src_area->pages << PAGE_WIDTH; 901 900 unsigned int src_flags = src_area->flags; 902 901 mem_backend_t *src_backend = src_area->backend; … … 1095 1094 for (cur = area->used_space.leaf_head.next; 1096 1095 cur != &area->used_space.leaf_head; cur = cur->next) { 1097 btree_node_t *node = list_get_instance(cur, btree_node_t,1098 leaf_link);1096 btree_node_t *node 1097 = list_get_instance(cur, btree_node_t, leaf_link); 1099 1098 btree_key_t i; 1100 1099 … … 1104 1103 1105 1104 for (size = 0; size < (size_t) node->value[i]; size++) { 1106 pte_t *pte = page_mapping_find(as,1107 p tr + P2SZ(size));1105 pte_t *pte = 1106 page_mapping_find(as, ptr + (size << PAGE_WIDTH)); 1108 1107 1109 1108 ASSERT(pte); … … 1114 1113 1115 1114 /* Remove old mapping */ 1116 page_mapping_remove(as, ptr + P2SZ(size));1115 page_mapping_remove(as, ptr + (size << PAGE_WIDTH)); 1117 1116 } 1118 1117 } … … 1160 1159 1161 1160 /* Insert the new mapping */ 1162 page_mapping_insert(as, ptr + P2SZ(size),1161 page_mapping_insert(as, ptr + (size << PAGE_WIDTH), 1163 1162 old_frame[frame_idx++], page_flags); 1164 1163 … … 1482 1481 1483 1482 if (src_area) { 1484 size = P2SZ(src_area->pages);1483 size = src_area->pages << PAGE_WIDTH; 1485 1484 mutex_unlock(&src_area->lock); 1486 1485 } else … … 1537 1536 if (page >= right_pg) { 1538 1537 /* Do nothing. */ 1539 } else if (overlaps(page, P2SZ(count), left_pg,1540 P2SZ(left_cnt))) {1538 } else if (overlaps(page, count << PAGE_WIDTH, left_pg, 1539 left_cnt << PAGE_WIDTH)) { 1541 1540 /* The interval intersects with the left interval. */ 1542 1541 return false; 1543 } else if (overlaps(page, P2SZ(count), right_pg,1544 P2SZ(right_cnt))) {1542 } else if (overlaps(page, count << PAGE_WIDTH, right_pg, 1543 right_cnt << PAGE_WIDTH)) { 1545 1544 /* The interval intersects with the right interval. */ 1546 1545 return false; 1547 } else if ((page == left_pg + P2SZ(left_cnt)) &&1548 (page + P2SZ(count) == right_pg)) {1546 } else if ((page == left_pg + (left_cnt << PAGE_WIDTH)) && 1547 (page + (count << PAGE_WIDTH) == right_pg)) { 1549 1548 /* 1550 1549 * The interval can be added by merging the two already … … 1554 1553 btree_remove(&area->used_space, right_pg, leaf); 1555 1554 goto success; 1556 } else if (page == left_pg + P2SZ(left_cnt)) {1555 } else if (page == left_pg + (left_cnt << PAGE_WIDTH)) { 1557 1556 /* 1558 1557 * The interval can be added by simply growing the left … … 1561 1560 node->value[node->keys - 1] += count; 1562 1561 goto success; 1563 } else if (page + P2SZ(count) == right_pg) {1562 } else if (page + (count << PAGE_WIDTH) == right_pg) { 1564 1563 /* 1565 1564 * The interval can be addded by simply moving base of … … 1588 1587 */ 1589 1588 1590 if (overlaps(page, P2SZ(count), right_pg, P2SZ(right_cnt))) { 1589 if (overlaps(page, count << PAGE_WIDTH, right_pg, 1590 right_cnt << PAGE_WIDTH)) { 1591 1591 /* The interval intersects with the right interval. */ 1592 1592 return false; 1593 } else if (page + P2SZ(count) == right_pg) {1593 } else if (page + (count << PAGE_WIDTH) == right_pg) { 1594 1594 /* 1595 1595 * The interval can be added by moving the base of the … … 1626 1626 if (page < left_pg) { 1627 1627 /* Do nothing. */ 1628 } else if (overlaps(page, P2SZ(count), left_pg,1629 P2SZ(left_cnt))) {1628 } else if (overlaps(page, count << PAGE_WIDTH, left_pg, 1629 left_cnt << PAGE_WIDTH)) { 1630 1630 /* The interval intersects with the left interval. */ 1631 1631 return false; 1632 } else if (overlaps(page, P2SZ(count), right_pg,1633 P2SZ(right_cnt))) {1632 } else if (overlaps(page, count << PAGE_WIDTH, right_pg, 1633 right_cnt << PAGE_WIDTH)) { 1634 1634 /* The interval intersects with the right interval. */ 1635 1635 return false; 1636 } else if ((page == left_pg + P2SZ(left_cnt)) &&1637 (page + P2SZ(count) == right_pg)) {1636 } else if ((page == left_pg + (left_cnt << PAGE_WIDTH)) && 1637 (page + (count << PAGE_WIDTH) == right_pg)) { 1638 1638 /* 1639 1639 * The interval can be added by merging the two already … … 1643 1643 btree_remove(&area->used_space, right_pg, node); 1644 1644 goto success; 1645 } else if (page == left_pg + P2SZ(left_cnt)) {1645 } else if (page == left_pg + (left_cnt << PAGE_WIDTH)) { 1646 1646 /* 1647 1647 * The interval can be added by simply growing the left … … 1650 1650 leaf->value[leaf->keys - 1] += count; 1651 1651 goto success; 1652 } else if (page + P2SZ(count) == right_pg) {1652 } else if (page + (count << PAGE_WIDTH) == right_pg) { 1653 1653 /* 1654 1654 * The interval can be addded by simply moving base of … … 1677 1677 */ 1678 1678 1679 if (overlaps(page, P2SZ(count), left_pg, P2SZ(left_cnt))) { 1679 if (overlaps(page, count << PAGE_WIDTH, left_pg, 1680 left_cnt << PAGE_WIDTH)) { 1680 1681 /* The interval intersects with the left interval. */ 1681 1682 return false; 1682 } else if (left_pg + P2SZ(left_cnt) == page) {1683 } else if (left_pg + (left_cnt << PAGE_WIDTH) == page) { 1683 1684 /* 1684 1685 * The interval can be added by growing the left … … 1715 1716 */ 1716 1717 1717 if (overlaps(page, P2SZ(count), left_pg,1718 P2SZ(left_cnt))) {1718 if (overlaps(page, count << PAGE_WIDTH, left_pg, 1719 left_cnt << PAGE_WIDTH)) { 1719 1720 /* 1720 1721 * The interval intersects with the left … … 1722 1723 */ 1723 1724 return false; 1724 } else if (overlaps(page, P2SZ(count), right_pg,1725 P2SZ(right_cnt))) {1725 } else if (overlaps(page, count << PAGE_WIDTH, right_pg, 1726 right_cnt << PAGE_WIDTH)) { 1726 1727 /* 1727 1728 * The interval intersects with the right … … 1729 1730 */ 1730 1731 return false; 1731 } else if ((page == left_pg + P2SZ(left_cnt)) &&1732 (page + P2SZ(count) == right_pg)) {1732 } else if ((page == left_pg + (left_cnt << PAGE_WIDTH)) && 1733 (page + (count << PAGE_WIDTH) == right_pg)) { 1733 1734 /* 1734 1735 * The interval can be added by merging the two … … 1738 1739 btree_remove(&area->used_space, right_pg, leaf); 1739 1740 goto success; 1740 } else if (page == left_pg + P2SZ(left_cnt)) {1741 } else if (page == left_pg + (left_cnt << PAGE_WIDTH)) { 1741 1742 /* 1742 1743 * The interval can be added by simply growing … … 1745 1746 leaf->value[i - 1] += count; 1746 1747 goto success; 1747 } else if (page + P2SZ(count) == right_pg) {1748 } else if (page + (count << PAGE_WIDTH) == right_pg) { 1748 1749 /* 1749 1750 * The interval can be addded by simply moving … … 1811 1812 for (i = 0; i < leaf->keys; i++) { 1812 1813 if (leaf->key[i] == page) { 1813 leaf->key[i] += P2SZ(count);1814 leaf->key[i] += count << PAGE_WIDTH; 1814 1815 leaf->value[i] -= count; 1815 1816 goto success; … … 1821 1822 } 1822 1823 1823 btree_node_t *node = btree_leaf_node_left_neighbour(&area->used_space, 1824 leaf); 1824 btree_node_t *node = btree_leaf_node_left_neighbour(&area->used_space, leaf); 1825 1825 if ((node) && (page < leaf->key[0])) { 1826 1826 uintptr_t left_pg = node->key[node->keys - 1]; 1827 1827 size_t left_cnt = (size_t) node->value[node->keys - 1]; 1828 1828 1829 if (overlaps(left_pg, P2SZ(left_cnt), page, P2SZ(count))) { 1830 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)) { 1831 1833 /* 1832 1834 * The interval is contained in the rightmost … … 1837 1839 node->value[node->keys - 1] -= count; 1838 1840 goto success; 1839 } else if (page + P2SZ(count) < 1840 left_pg + P2SZ(left_cnt)) { 1841 size_t new_cnt; 1842 1841 } else if (page + (count << PAGE_WIDTH) < 1842 left_pg + (left_cnt << PAGE_WIDTH)) { 1843 1843 /* 1844 1844 * The interval is contained in the rightmost … … 1848 1848 * new interval. 1849 1849 */ 1850 new_cnt = ((left_pg + P2SZ(left_cnt)) -1851 (page + P2SZ(count))) >> PAGE_WIDTH;1850 size_t new_cnt = ((left_pg + (left_cnt << PAGE_WIDTH)) - 1851 (page + (count << PAGE_WIDTH))) >> PAGE_WIDTH; 1852 1852 node->value[node->keys - 1] -= count + new_cnt; 1853 1853 btree_insert(&area->used_space, page + 1854 P2SZ(count), (void *) new_cnt, leaf);1854 (count << PAGE_WIDTH), (void *) new_cnt, leaf); 1855 1855 goto success; 1856 1856 } … … 1865 1865 size_t left_cnt = (size_t) leaf->value[leaf->keys - 1]; 1866 1866 1867 if (overlaps(left_pg, P2SZ(left_cnt), page, P2SZ(count))) { 1868 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)) { 1869 1871 /* 1870 1872 * The interval is contained in the rightmost … … 1874 1876 leaf->value[leaf->keys - 1] -= count; 1875 1877 goto success; 1876 } else if (page + P2SZ(count) < left_pg + 1877 P2SZ(left_cnt)) { 1878 size_t new_cnt; 1879 1878 } else if (page + (count << PAGE_WIDTH) < left_pg + 1879 (left_cnt << PAGE_WIDTH)) { 1880 1880 /* 1881 1881 * The interval is contained in the rightmost … … 1885 1885 * interval. 1886 1886 */ 1887 new_cnt = ((left_pg + P2SZ(left_cnt)) -1888 (page + P2SZ(count))) >> PAGE_WIDTH;1887 size_t new_cnt = ((left_pg + (left_cnt << PAGE_WIDTH)) - 1888 (page + (count << PAGE_WIDTH))) >> PAGE_WIDTH; 1889 1889 leaf->value[leaf->keys - 1] -= count + new_cnt; 1890 1890 btree_insert(&area->used_space, page + 1891 P2SZ(count), (void *) new_cnt, leaf);1891 (count << PAGE_WIDTH), (void *) new_cnt, leaf); 1892 1892 goto success; 1893 1893 } … … 1911 1911 * to (i - 1) and i. 1912 1912 */ 1913 if (overlaps(left_pg, P2SZ(left_cnt), page,1914 P2SZ(count))) {1915 if (page + P2SZ(count) ==1916 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)) { 1917 1917 /* 1918 1918 * The interval is contained in the … … 1923 1923 leaf->value[i - 1] -= count; 1924 1924 goto success; 1925 } else if (page + P2SZ(count) < 1926 left_pg + P2SZ(left_cnt)) { 1927 size_t new_cnt; 1928 1925 } else if (page + (count << PAGE_WIDTH) < 1926 left_pg + (left_cnt << PAGE_WIDTH)) { 1929 1927 /* 1930 1928 * The interval is contained in the … … 1934 1932 * also inserting a new interval. 1935 1933 */ 1936 new_cnt = ((left_pg + P2SZ(left_cnt)) - 1937 (page + P2SZ(count))) >> 1934 size_t new_cnt = ((left_pg + 1935 (left_cnt << PAGE_WIDTH)) - 1936 (page + (count << PAGE_WIDTH))) >> 1938 1937 PAGE_WIDTH; 1939 1938 leaf->value[i - 1] -= count + new_cnt; 1940 1939 btree_insert(&area->used_space, page + 1941 P2SZ(count), (void *) new_cnt,1940 (count << PAGE_WIDTH), (void *) new_cnt, 1942 1941 leaf); 1943 1942 goto success; … … 2035 2034 btree_key_t i; 2036 2035 for (i = 0; (ret == 0) && (i < node->keys); i++) { 2037 uintptr_t addr;2038 2039 2036 as_area_t *area = (as_area_t *) node->value[i]; 2040 2037 2041 2038 mutex_lock(&area->lock); 2042 2039 2043 addr = ALIGN_UP(area->base + P2SZ(area->pages), 2040 uintptr_t addr = 2041 ALIGN_UP(area->base + (area->pages << PAGE_WIDTH), 2044 2042 PAGE_SIZE); 2045 2043 … … 2100 2098 2101 2099 info[area_idx].start_addr = area->base; 2102 info[area_idx].size = P2SZ(area->pages);2100 info[area_idx].size = FRAMES2SIZE(area->pages); 2103 2101 info[area_idx].flags = area->flags; 2104 2102 ++area_idx; … … 2138 2136 " (%p - %p)\n", area, (void *) area->base, 2139 2137 area->pages, (void *) area->base, 2140 (void *) (area->base + P2SZ(area->pages)));2138 (void *) (area->base + FRAMES2SIZE(area->pages))); 2141 2139 mutex_unlock(&area->lock); 2142 2140 }
Note:
See TracChangeset
for help on using the changeset viewer.