xref: /freebsd-src/sys/i386/include/pmap_base.h (revision 1f1b2286fd5ae4cd7f8e6412723201e92d28771a)
19a527560SKonstantin Belousov /*-
24d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
39a527560SKonstantin Belousov  *
49a527560SKonstantin Belousov  * Copyright (c) 2018 The FreeBSD Foundation
59a527560SKonstantin Belousov  *
69a527560SKonstantin Belousov  * This software was developed by Konstantin Belousov <kib@FreeBSD.org>
79a527560SKonstantin Belousov  * under sponsorship from the FreeBSD Foundation.
89a527560SKonstantin Belousov  *
99a527560SKonstantin Belousov  * Redistribution and use in source and binary forms, with or without
109a527560SKonstantin Belousov  * modification, are permitted provided that the following conditions
119a527560SKonstantin Belousov  * are met:
129a527560SKonstantin Belousov  * 1. Redistributions of source code must retain the above copyright
139a527560SKonstantin Belousov  *    notice, this list of conditions and the following disclaimer.
149a527560SKonstantin Belousov  * 2. Redistributions in binary form must reproduce the above copyright
159a527560SKonstantin Belousov  *    notice, this list of conditions and the following disclaimer in the
169a527560SKonstantin Belousov  *    documentation and/or other materials provided with the distribution.
179a527560SKonstantin Belousov  *
189a527560SKonstantin Belousov  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
199a527560SKonstantin Belousov  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
209a527560SKonstantin Belousov  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
219a527560SKonstantin Belousov  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
229a527560SKonstantin Belousov  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
239a527560SKonstantin Belousov  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
249a527560SKonstantin Belousov  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
259a527560SKonstantin Belousov  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
269a527560SKonstantin Belousov  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
279a527560SKonstantin Belousov  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
289a527560SKonstantin Belousov  * SUCH DAMAGE.
299a527560SKonstantin Belousov  */
309a527560SKonstantin Belousov 
319a527560SKonstantin Belousov #ifndef _MACHINE_PMAP_BASE_H_
329a527560SKonstantin Belousov #define	_MACHINE_PMAP_BASE_H_
339a527560SKonstantin Belousov 
34c45cbc7aSJohn Baldwin /* Internal flags for pmap_mapdev_attr(). */
35c45cbc7aSJohn Baldwin #define	MAPDEV_SETATTR		0x0000001	/* Modify existing attrs. */
36c45cbc7aSJohn Baldwin 
379a527560SKonstantin Belousov struct pmap_methods {
389a527560SKonstantin Belousov 	void (*pm_ksetrw)(vm_offset_t);
399a527560SKonstantin Belousov 	void (*pm_remap_lower)(bool);
409a527560SKonstantin Belousov 	void (*pm_remap_lowptdi)(bool);
419a527560SKonstantin Belousov 	void (*pm_align_superpage)(vm_object_t object, vm_ooffset_t offset,
429a527560SKonstantin Belousov 	    vm_offset_t *addr, vm_size_t size);
439a527560SKonstantin Belousov 	vm_offset_t (*pm_quick_enter_page)(vm_page_t m);
449a527560SKonstantin Belousov 	void (*pm_quick_remove_page)(vm_offset_t addr);
459a527560SKonstantin Belousov 	void *(*pm_trm_alloc)(size_t size, int flags);
469a527560SKonstantin Belousov 	void (*pm_trm_free)(void *addr, size_t size);
479a527560SKonstantin Belousov 	vm_offset_t (*pm_get_map_low)(void);
489a527560SKonstantin Belousov 	vm_offset_t (*pm_get_vm_maxuser_address)(void);
499a527560SKonstantin Belousov 	vm_paddr_t (*pm_kextract)(vm_offset_t va);
509a527560SKonstantin Belousov 	vm_paddr_t (*pm_pg_frame)(vm_paddr_t pa);
519a527560SKonstantin Belousov 	void (*pm_sf_buf_map)(struct sf_buf *sf);
529a527560SKonstantin Belousov 	void (*pm_cp_slow0_map)(vm_offset_t kaddr, int plen, vm_page_t *ma);
539a527560SKonstantin Belousov 	u_int (*pm_get_kcr3)(void);
549a527560SKonstantin Belousov 	u_int (*pm_get_cr3)(pmap_t);
559a527560SKonstantin Belousov 	caddr_t (*pm_cmap3)(vm_paddr_t pa, u_int pte_flags);
569a527560SKonstantin Belousov 	void (*pm_basemem_setup)(u_int basemem);
579a527560SKonstantin Belousov 	void (*pm_set_nx)(void);
589a527560SKonstantin Belousov 	void *(*pm_bios16_enter)(void);
599a527560SKonstantin Belousov 	void (*pm_bios16_leave)(void *handle);
609a527560SKonstantin Belousov 	void (*pm_bootstrap)(vm_paddr_t firstaddr);
61*1f1b2286SJohn Baldwin 	bool (*pm_is_valid_memattr)(pmap_t, vm_memattr_t);
62*1f1b2286SJohn Baldwin 	int (*pm_cache_bits)(pmap_t, int, bool);
639a527560SKonstantin Belousov 	bool (*pm_ps_enabled)(pmap_t);
649a527560SKonstantin Belousov 	void (*pm_pinit0)(pmap_t);
659a527560SKonstantin Belousov 	int (*pm_pinit)(pmap_t);
669a527560SKonstantin Belousov 	void (*pm_activate)(struct thread *);
679a527560SKonstantin Belousov 	void (*pm_activate_boot)(pmap_t);
689a527560SKonstantin Belousov 	void (*pm_advise)(pmap_t, vm_offset_t, vm_offset_t, int);
699a527560SKonstantin Belousov 	void (*pm_clear_modify)(vm_page_t);
709a527560SKonstantin Belousov 	int (*pm_change_attr)(vm_offset_t, vm_size_t, int);
719a527560SKonstantin Belousov 	int (*pm_mincore)(pmap_t, vm_offset_t, vm_paddr_t *);
729a527560SKonstantin Belousov 	void (*pm_copy)(pmap_t, pmap_t, vm_offset_t, vm_size_t, vm_offset_t);
739a527560SKonstantin Belousov 	void (*pm_copy_page)(vm_page_t, vm_page_t);
749a527560SKonstantin Belousov 	void (*pm_copy_pages)(vm_page_t [], vm_offset_t, vm_page_t [],
759a527560SKonstantin Belousov 	    vm_offset_t, int);
769a527560SKonstantin Belousov 	void (*pm_zero_page)(vm_page_t);
779a527560SKonstantin Belousov 	void (*pm_zero_page_area)(vm_page_t, int, int);
789a527560SKonstantin Belousov 	int (*pm_enter)(pmap_t, vm_offset_t, vm_page_t, vm_prot_t, u_int,
799a527560SKonstantin Belousov 	    int8_t);
809a527560SKonstantin Belousov 	void (*pm_enter_object)(pmap_t, vm_offset_t, vm_offset_t,
819a527560SKonstantin Belousov 	    vm_page_t, vm_prot_t);
829a527560SKonstantin Belousov 	void (*pm_enter_quick)(pmap_t, vm_offset_t, vm_page_t, vm_prot_t);
839a527560SKonstantin Belousov 	void *(*pm_kenter_temporary)(vm_paddr_t pa, int);
849a527560SKonstantin Belousov 	void (*pm_object_init_pt)(pmap_t, vm_offset_t, vm_object_t,
859a527560SKonstantin Belousov 	    vm_pindex_t, vm_size_t);
869a527560SKonstantin Belousov 	void (*pm_unwire)(pmap_t, vm_offset_t, vm_offset_t);
87*1f1b2286SJohn Baldwin 	bool (*pm_page_exists_quick)(pmap_t, vm_page_t);
889a527560SKonstantin Belousov 	int (*pm_page_wired_mappings)(vm_page_t);
89*1f1b2286SJohn Baldwin 	bool (*pm_page_is_mapped)(vm_page_t);
909a527560SKonstantin Belousov 	void (*pm_remove_pages)(pmap_t);
91*1f1b2286SJohn Baldwin 	bool (*pm_is_modified)(vm_page_t);
92*1f1b2286SJohn Baldwin 	bool (*pm_is_prefaultable)(pmap_t, vm_offset_t);
93*1f1b2286SJohn Baldwin 	bool (*pm_is_referenced)(vm_page_t);
949a527560SKonstantin Belousov 	void (*pm_remove_write)(vm_page_t);
959a527560SKonstantin Belousov 	int (*pm_ts_referenced)(vm_page_t);
96c45cbc7aSJohn Baldwin 	void *(*pm_mapdev_attr)(vm_paddr_t, vm_size_t, int, int);
977ae99f80SJohn Baldwin 	void (*pm_unmapdev)(void *, vm_size_t);
989a527560SKonstantin Belousov 	void (*pm_page_set_memattr)(vm_page_t, vm_memattr_t);
999a527560SKonstantin Belousov 	vm_paddr_t (*pm_extract)(pmap_t, vm_offset_t);
1009a527560SKonstantin Belousov 	vm_page_t (*pm_extract_and_hold)(pmap_t, vm_offset_t, vm_prot_t);
1019a527560SKonstantin Belousov 	vm_offset_t (*pm_map)(vm_offset_t *, vm_paddr_t, vm_paddr_t, int);
1029a527560SKonstantin Belousov 	void (*pm_qenter)(vm_offset_t sva, vm_page_t *, int);
1039a527560SKonstantin Belousov 	void (*pm_qremove)(vm_offset_t, int);
1049a527560SKonstantin Belousov 	void (*pm_release)(pmap_t);
1059a527560SKonstantin Belousov 	void (*pm_protect)(pmap_t, vm_offset_t, vm_offset_t, vm_prot_t);
1069a527560SKonstantin Belousov 	void (*pm_remove)(pmap_t, vm_offset_t, vm_offset_t);
1079a527560SKonstantin Belousov 	void (*pm_remove_all)(vm_page_t);
1089a527560SKonstantin Belousov 	void (*pm_init)(void);
1099a527560SKonstantin Belousov 	void (*pm_init_pat)(void);
1109a527560SKonstantin Belousov 	void (*pm_growkernel)(vm_offset_t);
1119a527560SKonstantin Belousov 	void (*pm_invalidate_page)(pmap_t, vm_offset_t);
1129a527560SKonstantin Belousov 	void (*pm_invalidate_range)(pmap_t, vm_offset_t, vm_offset_t);
1139a527560SKonstantin Belousov 	void (*pm_invalidate_all)(pmap_t);
1149a527560SKonstantin Belousov 	void (*pm_invalidate_cache)(void);
1159a527560SKonstantin Belousov 	void (*pm_flush_page)(vm_page_t);
1169a527560SKonstantin Belousov 	void (*pm_kenter)(vm_offset_t, vm_paddr_t);
1179a527560SKonstantin Belousov 	void (*pm_kremove)(vm_offset_t);
118b223a692SKonstantin Belousov 	int (*pm_sysctl_kmaps)(SYSCTL_HANDLER_ARGS);
1199a527560SKonstantin Belousov };
1209a527560SKonstantin Belousov 
1219a527560SKonstantin Belousov void	pmap_cold(void);
1229a527560SKonstantin Belousov void	pmap_pae_cold(void);
1239a527560SKonstantin Belousov void	pmap_nopae_cold(void);
1249a527560SKonstantin Belousov 
1259a527560SKonstantin Belousov #endif
126