Changes in kernel/generic/src/mm/as.c [eef1b031:e394b736] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/generic/src/mm/as.c
reef1b031 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), false);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 676 676 /* 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); 682 681 tlb_shootdown_finalize(ipl); 683 682 … … 798 797 799 798 for (size = 0; size < (size_t) node->value[i]; size++) { 800 pte_t *pte = page_mapping_find(as,801 ptr + P2SZ(size), false);799 pte_t *pte = 800 page_mapping_find(as, ptr + (size << PAGE_WIDTH)); 802 801 803 802 ASSERT(pte); … … 808 807 (area->backend->frame_free)) { 809 808 area->backend->frame_free(area, 810 ptr + P2SZ(size), 811 PTE_GET_FRAME(pte)); 809 ptr + (size << PAGE_WIDTH), PTE_GET_FRAME(pte)); 812 810 } 813 811 814 page_mapping_remove(as, ptr + P2SZ(size));812 page_mapping_remove(as, ptr + (size << PAGE_WIDTH)); 815 813 } 816 814 } … … 824 822 825 823 /* 826 * Invalidate potential software translation caches 827 * (e.g. TSB on sparc64, PHT on ppc32).824 * Invalidate potential software translation caches (e.g. TSB on 825 * sparc64). 828 826 */ 829 827 as_invalidate_translation_cache(as, area->base, area->pages); … … 899 897 } 900 898 901 size_t src_size = P2SZ(src_area->pages);899 size_t src_size = src_area->pages << PAGE_WIDTH; 902 900 unsigned int src_flags = src_area->flags; 903 901 mem_backend_t *src_backend = src_area->backend; … … 1096 1094 for (cur = area->used_space.leaf_head.next; 1097 1095 cur != &area->used_space.leaf_head; cur = cur->next) { 1098 btree_node_t *node = list_get_instance(cur, btree_node_t,1099 leaf_link);1096 btree_node_t *node 1097 = list_get_instance(cur, btree_node_t, leaf_link); 1100 1098 btree_key_t i; 1101 1099 … … 1105 1103 1106 1104 for (size = 0; size < (size_t) node->value[i]; size++) { 1107 pte_t *pte = page_mapping_find(as,1108 p tr + P2SZ(size), false);1105 pte_t *pte = 1106 page_mapping_find(as, ptr + (size << PAGE_WIDTH)); 1109 1107 1110 1108 ASSERT(pte); … … 1115 1113 1116 1114 /* Remove old mapping */ 1117 page_mapping_remove(as, ptr + P2SZ(size));1115 page_mapping_remove(as, ptr + (size << PAGE_WIDTH)); 1118 1116 } 1119 1117 } … … 1127 1125 1128 1126 /* 1129 * Invalidate potential software translation caches 1130 * (e.g. TSB on sparc64, PHT on ppc32).1127 * Invalidate potential software translation caches (e.g. TSB on 1128 * sparc64). 1131 1129 */ 1132 1130 as_invalidate_translation_cache(as, area->base, area->pages); … … 1161 1159 1162 1160 /* Insert the new mapping */ 1163 page_mapping_insert(as, ptr + P2SZ(size),1161 page_mapping_insert(as, ptr + (size << PAGE_WIDTH), 1164 1162 old_frame[frame_idx++], page_flags); 1165 1163 … … 1242 1240 */ 1243 1241 pte_t *pte; 1244 if ((pte = page_mapping_find(AS, page , false))) {1242 if ((pte = page_mapping_find(AS, page))) { 1245 1243 if (PTE_PRESENT(pte)) { 1246 1244 if (((access == PF_ACCESS_READ) && PTE_READABLE(pte)) || … … 1483 1481 1484 1482 if (src_area) { 1485 size = P2SZ(src_area->pages);1483 size = src_area->pages << PAGE_WIDTH; 1486 1484 mutex_unlock(&src_area->lock); 1487 1485 } else … … 1538 1536 if (page >= right_pg) { 1539 1537 /* Do nothing. */ 1540 } else if (overlaps(page, P2SZ(count), left_pg,1541 P2SZ(left_cnt))) {1538 } else if (overlaps(page, count << PAGE_WIDTH, left_pg, 1539 left_cnt << PAGE_WIDTH)) { 1542 1540 /* The interval intersects with the left interval. */ 1543 1541 return false; 1544 } else if (overlaps(page, P2SZ(count), right_pg,1545 P2SZ(right_cnt))) {1542 } else if (overlaps(page, count << PAGE_WIDTH, right_pg, 1543 right_cnt << PAGE_WIDTH)) { 1546 1544 /* The interval intersects with the right interval. */ 1547 1545 return false; 1548 } else if ((page == left_pg + P2SZ(left_cnt)) &&1549 (page + P2SZ(count) == right_pg)) {1546 } else if ((page == left_pg + (left_cnt << PAGE_WIDTH)) && 1547 (page + (count << PAGE_WIDTH) == right_pg)) { 1550 1548 /* 1551 1549 * The interval can be added by merging the two already … … 1555 1553 btree_remove(&area->used_space, right_pg, leaf); 1556 1554 goto success; 1557 } else if (page == left_pg + P2SZ(left_cnt)) {1555 } else if (page == left_pg + (left_cnt << PAGE_WIDTH)) { 1558 1556 /* 1559 1557 * The interval can be added by simply growing the left … … 1562 1560 node->value[node->keys - 1] += count; 1563 1561 goto success; 1564 } else if (page + P2SZ(count) == right_pg) {1562 } else if (page + (count << PAGE_WIDTH) == right_pg) { 1565 1563 /* 1566 1564 * The interval can be addded by simply moving base of … … 1589 1587 */ 1590 1588 1591 if (overlaps(page, P2SZ(count), right_pg, P2SZ(right_cnt))) { 1589 if (overlaps(page, count << PAGE_WIDTH, right_pg, 1590 right_cnt << PAGE_WIDTH)) { 1592 1591 /* The interval intersects with the right interval. */ 1593 1592 return false; 1594 } else if (page + P2SZ(count) == right_pg) {1593 } else if (page + (count << PAGE_WIDTH) == right_pg) { 1595 1594 /* 1596 1595 * The interval can be added by moving the base of the … … 1627 1626 if (page < left_pg) { 1628 1627 /* Do nothing. */ 1629 } else if (overlaps(page, P2SZ(count), left_pg,1630 P2SZ(left_cnt))) {1628 } else if (overlaps(page, count << PAGE_WIDTH, left_pg, 1629 left_cnt << PAGE_WIDTH)) { 1631 1630 /* The interval intersects with the left interval. */ 1632 1631 return false; 1633 } else if (overlaps(page, P2SZ(count), right_pg,1634 P2SZ(right_cnt))) {1632 } else if (overlaps(page, count << PAGE_WIDTH, right_pg, 1633 right_cnt << PAGE_WIDTH)) { 1635 1634 /* The interval intersects with the right interval. */ 1636 1635 return false; 1637 } else if ((page == left_pg + P2SZ(left_cnt)) &&1638 (page + P2SZ(count) == right_pg)) {1636 } else if ((page == left_pg + (left_cnt << PAGE_WIDTH)) && 1637 (page + (count << PAGE_WIDTH) == right_pg)) { 1639 1638 /* 1640 1639 * The interval can be added by merging the two already … … 1644 1643 btree_remove(&area->used_space, right_pg, node); 1645 1644 goto success; 1646 } else if (page == left_pg + P2SZ(left_cnt)) {1645 } else if (page == left_pg + (left_cnt << PAGE_WIDTH)) { 1647 1646 /* 1648 1647 * The interval can be added by simply growing the left … … 1651 1650 leaf->value[leaf->keys - 1] += count; 1652 1651 goto success; 1653 } else if (page + P2SZ(count) == right_pg) {1652 } else if (page + (count << PAGE_WIDTH) == right_pg) { 1654 1653 /* 1655 1654 * The interval can be addded by simply moving base of … … 1678 1677 */ 1679 1678 1680 if (overlaps(page, P2SZ(count), left_pg, P2SZ(left_cnt))) { 1679 if (overlaps(page, count << PAGE_WIDTH, left_pg, 1680 left_cnt << PAGE_WIDTH)) { 1681 1681 /* The interval intersects with the left interval. */ 1682 1682 return false; 1683 } else if (left_pg + P2SZ(left_cnt) == page) {1683 } else if (left_pg + (left_cnt << PAGE_WIDTH) == page) { 1684 1684 /* 1685 1685 * The interval can be added by growing the left … … 1716 1716 */ 1717 1717 1718 if (overlaps(page, P2SZ(count), left_pg,1719 P2SZ(left_cnt))) {1718 if (overlaps(page, count << PAGE_WIDTH, left_pg, 1719 left_cnt << PAGE_WIDTH)) { 1720 1720 /* 1721 1721 * The interval intersects with the left … … 1723 1723 */ 1724 1724 return false; 1725 } else if (overlaps(page, P2SZ(count), right_pg,1726 P2SZ(right_cnt))) {1725 } else if (overlaps(page, count << PAGE_WIDTH, right_pg, 1726 right_cnt << PAGE_WIDTH)) { 1727 1727 /* 1728 1728 * The interval intersects with the right … … 1730 1730 */ 1731 1731 return false; 1732 } else if ((page == left_pg + P2SZ(left_cnt)) &&1733 (page + P2SZ(count) == right_pg)) {1732 } else if ((page == left_pg + (left_cnt << PAGE_WIDTH)) && 1733 (page + (count << PAGE_WIDTH) == right_pg)) { 1734 1734 /* 1735 1735 * The interval can be added by merging the two … … 1739 1739 btree_remove(&area->used_space, right_pg, leaf); 1740 1740 goto success; 1741 } else if (page == left_pg + P2SZ(left_cnt)) {1741 } else if (page == left_pg + (left_cnt << PAGE_WIDTH)) { 1742 1742 /* 1743 1743 * The interval can be added by simply growing … … 1746 1746 leaf->value[i - 1] += count; 1747 1747 goto success; 1748 } else if (page + P2SZ(count) == right_pg) {1748 } else if (page + (count << PAGE_WIDTH) == right_pg) { 1749 1749 /* 1750 1750 * The interval can be addded by simply moving … … 1812 1812 for (i = 0; i < leaf->keys; i++) { 1813 1813 if (leaf->key[i] == page) { 1814 leaf->key[i] += P2SZ(count);1814 leaf->key[i] += count << PAGE_WIDTH; 1815 1815 leaf->value[i] -= count; 1816 1816 goto success; … … 1822 1822 } 1823 1823 1824 btree_node_t *node = btree_leaf_node_left_neighbour(&area->used_space, 1825 leaf); 1824 btree_node_t *node = btree_leaf_node_left_neighbour(&area->used_space, leaf); 1826 1825 if ((node) && (page < leaf->key[0])) { 1827 1826 uintptr_t left_pg = node->key[node->keys - 1]; 1828 1827 size_t left_cnt = (size_t) node->value[node->keys - 1]; 1829 1828 1830 if (overlaps(left_pg, P2SZ(left_cnt), page, P2SZ(count))) { 1831 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)) { 1832 1833 /* 1833 1834 * The interval is contained in the rightmost … … 1838 1839 node->value[node->keys - 1] -= count; 1839 1840 goto success; 1840 } else if (page + P2SZ(count) < 1841 left_pg + P2SZ(left_cnt)) { 1842 size_t new_cnt; 1843 1841 } else if (page + (count << PAGE_WIDTH) < 1842 left_pg + (left_cnt << PAGE_WIDTH)) { 1844 1843 /* 1845 1844 * The interval is contained in the rightmost … … 1849 1848 * new interval. 1850 1849 */ 1851 new_cnt = ((left_pg + P2SZ(left_cnt)) -1852 (page + P2SZ(count))) >> PAGE_WIDTH;1850 size_t new_cnt = ((left_pg + (left_cnt << PAGE_WIDTH)) - 1851 (page + (count << PAGE_WIDTH))) >> PAGE_WIDTH; 1853 1852 node->value[node->keys - 1] -= count + new_cnt; 1854 1853 btree_insert(&area->used_space, page + 1855 P2SZ(count), (void *) new_cnt, leaf);1854 (count << PAGE_WIDTH), (void *) new_cnt, leaf); 1856 1855 goto success; 1857 1856 } … … 1866 1865 size_t left_cnt = (size_t) leaf->value[leaf->keys - 1]; 1867 1866 1868 if (overlaps(left_pg, P2SZ(left_cnt), page, P2SZ(count))) { 1869 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)) { 1870 1871 /* 1871 1872 * The interval is contained in the rightmost … … 1875 1876 leaf->value[leaf->keys - 1] -= count; 1876 1877 goto success; 1877 } else if (page + P2SZ(count) < left_pg + 1878 P2SZ(left_cnt)) { 1879 size_t new_cnt; 1880 1878 } else if (page + (count << PAGE_WIDTH) < left_pg + 1879 (left_cnt << PAGE_WIDTH)) { 1881 1880 /* 1882 1881 * The interval is contained in the rightmost … … 1886 1885 * interval. 1887 1886 */ 1888 new_cnt = ((left_pg + P2SZ(left_cnt)) -1889 (page + P2SZ(count))) >> PAGE_WIDTH;1887 size_t new_cnt = ((left_pg + (left_cnt << PAGE_WIDTH)) - 1888 (page + (count << PAGE_WIDTH))) >> PAGE_WIDTH; 1890 1889 leaf->value[leaf->keys - 1] -= count + new_cnt; 1891 1890 btree_insert(&area->used_space, page + 1892 P2SZ(count), (void *) new_cnt, leaf);1891 (count << PAGE_WIDTH), (void *) new_cnt, leaf); 1893 1892 goto success; 1894 1893 } … … 1912 1911 * to (i - 1) and i. 1913 1912 */ 1914 if (overlaps(left_pg, P2SZ(left_cnt), page,1915 P2SZ(count))) {1916 if (page + P2SZ(count) ==1917 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)) { 1918 1917 /* 1919 1918 * The interval is contained in the … … 1924 1923 leaf->value[i - 1] -= count; 1925 1924 goto success; 1926 } else if (page + P2SZ(count) < 1927 left_pg + P2SZ(left_cnt)) { 1928 size_t new_cnt; 1929 1925 } else if (page + (count << PAGE_WIDTH) < 1926 left_pg + (left_cnt << PAGE_WIDTH)) { 1930 1927 /* 1931 1928 * The interval is contained in the … … 1935 1932 * also inserting a new interval. 1936 1933 */ 1937 new_cnt = ((left_pg + P2SZ(left_cnt)) - 1938 (page + P2SZ(count))) >> 1934 size_t new_cnt = ((left_pg + 1935 (left_cnt << PAGE_WIDTH)) - 1936 (page + (count << PAGE_WIDTH))) >> 1939 1937 PAGE_WIDTH; 1940 1938 leaf->value[i - 1] -= count + new_cnt; 1941 1939 btree_insert(&area->used_space, page + 1942 P2SZ(count), (void *) new_cnt,1940 (count << PAGE_WIDTH), (void *) new_cnt, 1943 1941 leaf); 1944 1942 goto success; … … 2036 2034 btree_key_t i; 2037 2035 for (i = 0; (ret == 0) && (i < node->keys); i++) { 2038 uintptr_t addr;2039 2040 2036 as_area_t *area = (as_area_t *) node->value[i]; 2041 2037 2042 2038 mutex_lock(&area->lock); 2043 2039 2044 addr = ALIGN_UP(area->base + P2SZ(area->pages), 2040 uintptr_t addr = 2041 ALIGN_UP(area->base + (area->pages << PAGE_WIDTH), 2045 2042 PAGE_SIZE); 2046 2043 … … 2101 2098 2102 2099 info[area_idx].start_addr = area->base; 2103 info[area_idx].size = P2SZ(area->pages);2100 info[area_idx].size = FRAMES2SIZE(area->pages); 2104 2101 info[area_idx].flags = area->flags; 2105 2102 ++area_idx; … … 2139 2136 " (%p - %p)\n", area, (void *) area->base, 2140 2137 area->pages, (void *) area->base, 2141 (void *) (area->base + P2SZ(area->pages)));2138 (void *) (area->base + FRAMES2SIZE(area->pages))); 2142 2139 mutex_unlock(&area->lock); 2143 2140 }
Note:
See TracChangeset
for help on using the changeset viewer.