pmap.c (305531) | pmap.c (305540) |
---|---|
1/*- 2 * Copyright (c) 1991 Regents of the University of California. 3 * All rights reserved. 4 * Copyright (c) 1994 John S. Dyson 5 * All rights reserved. 6 * Copyright (c) 1994 David Greenman 7 * All rights reserved. 8 * Copyright (c) 2003 Peter Wemm --- 70 unchanged lines hidden (view full) --- 79 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 80 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 81 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 82 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 83 * SUCH DAMAGE. 84 */ 85 86#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 1991 Regents of the University of California. 3 * All rights reserved. 4 * Copyright (c) 1994 John S. Dyson 5 * All rights reserved. 6 * Copyright (c) 1994 David Greenman 7 * All rights reserved. 8 * Copyright (c) 2003 Peter Wemm --- 70 unchanged lines hidden (view full) --- 79 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 80 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 81 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 82 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 83 * SUCH DAMAGE. 84 */ 85 86#include <sys/cdefs.h> |
87__FBSDID("$FreeBSD: stable/11/sys/arm64/arm64/pmap.c 305531 2016-09-07 12:33:04Z andrew $"); | 87__FBSDID("$FreeBSD: stable/11/sys/arm64/arm64/pmap.c 305540 2016-09-07 15:37:39Z andrew $"); |
88 89/* 90 * Manages physical address maps. 91 * 92 * Since the information managed by this module is 93 * also stored by the logical address mapping module, 94 * this module may throw away valid virtual-to-physical 95 * mappings at almost any time. However, invalidations --- 755 unchanged lines hidden (view full) --- 851 /* 852 * Initialize the pool of pv list locks. 853 */ 854 for (i = 0; i < NPV_LIST_LOCKS; i++) 855 rw_init(&pv_list_locks[i], "pmap pv list"); 856} 857 858/* | 88 89/* 90 * Manages physical address maps. 91 * 92 * Since the information managed by this module is 93 * also stored by the logical address mapping module, 94 * this module may throw away valid virtual-to-physical 95 * mappings at almost any time. However, invalidations --- 755 unchanged lines hidden (view full) --- 851 /* 852 * Initialize the pool of pv list locks. 853 */ 854 for (i = 0; i < NPV_LIST_LOCKS; i++) 855 rw_init(&pv_list_locks[i], "pmap pv list"); 856} 857 858/* |
859 * Normal, non-SMP, invalidation functions. 860 * We inline these within pmap.c for speed. | 859 * Invalidate a single TLB entry. |
861 */ 862PMAP_INLINE void 863pmap_invalidate_page(pmap_t pmap, vm_offset_t va) 864{ 865 866 sched_pin(); 867 __asm __volatile( | 860 */ 861PMAP_INLINE void 862pmap_invalidate_page(pmap_t pmap, vm_offset_t va) 863{ 864 865 sched_pin(); 866 __asm __volatile( |
868 "dsb sy \n" | 867 "dsb ishst \n" |
869 "tlbi vaae1is, %0 \n" | 868 "tlbi vaae1is, %0 \n" |
870 "dsb sy \n" | 869 "dsb ish \n" |
871 "isb \n" 872 : : "r"(va >> PAGE_SHIFT)); 873 sched_unpin(); 874} 875 876PMAP_INLINE void 877pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) 878{ 879 vm_offset_t addr; 880 881 sched_pin(); | 870 "isb \n" 871 : : "r"(va >> PAGE_SHIFT)); 872 sched_unpin(); 873} 874 875PMAP_INLINE void 876pmap_invalidate_range(pmap_t pmap, vm_offset_t sva, vm_offset_t eva) 877{ 878 vm_offset_t addr; 879 880 sched_pin(); |
882 __asm __volatile("dsb sy"); | 881 dsb(ishst); |
883 for (addr = sva; addr < eva; addr += PAGE_SIZE) { 884 __asm __volatile( 885 "tlbi vaae1is, %0" : : "r"(addr >> PAGE_SHIFT)); 886 } 887 __asm __volatile( | 882 for (addr = sva; addr < eva; addr += PAGE_SIZE) { 883 __asm __volatile( 884 "tlbi vaae1is, %0" : : "r"(addr >> PAGE_SHIFT)); 885 } 886 __asm __volatile( |
888 "dsb sy \n" | 887 "dsb ish \n" |
889 "isb \n"); 890 sched_unpin(); 891} 892 893PMAP_INLINE void 894pmap_invalidate_all(pmap_t pmap) 895{ 896 897 sched_pin(); 898 __asm __volatile( | 888 "isb \n"); 889 sched_unpin(); 890} 891 892PMAP_INLINE void 893pmap_invalidate_all(pmap_t pmap) 894{ 895 896 sched_pin(); 897 __asm __volatile( |
899 "dsb sy \n" | 898 "dsb ishst \n" |
900 "tlbi vmalle1is \n" | 899 "tlbi vmalle1is \n" |
901 "dsb sy \n" | 900 "dsb ish \n" |
902 "isb \n"); 903 sched_unpin(); 904} 905 906/* 907 * Routine: pmap_extract 908 * Function: 909 * Extract the physical page address associated --- 2681 unchanged lines hidden --- | 901 "isb \n"); 902 sched_unpin(); 903} 904 905/* 906 * Routine: pmap_extract 907 * Function: 908 * Extract the physical page address associated --- 2681 unchanged lines hidden --- |