1d8315c79SWarner Losh /*-
24d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause
351369649SPedro F. Giffuni *
41e7dfc94SAndrew Turner * Copyright (c) 2014,2016 Svatopluk Kraus <onwahe@gmail.com>
51e7dfc94SAndrew Turner * Copyright (c) 2014,2016 Michal Meloun <meloun@miracle.cz>
61e7dfc94SAndrew Turner * Copyright (c) 1991 Regents of the University of California.
76fc729afSOlivier Houchard * All rights reserved.
86fc729afSOlivier Houchard *
91e7dfc94SAndrew Turner * This code is derived from software contributed to Berkeley by
101e7dfc94SAndrew Turner * the Systems Programming Group of the University of Utah Computer
111e7dfc94SAndrew Turner * Science Department and William Jolitz of UUNET Technologies Inc.
121e7dfc94SAndrew Turner *
136fc729afSOlivier Houchard * Redistribution and use in source and binary forms, with or without
146fc729afSOlivier Houchard * modification, are permitted provided that the following conditions
156fc729afSOlivier Houchard * are met:
166fc729afSOlivier Houchard * 1. Redistributions of source code must retain the above copyright
176fc729afSOlivier Houchard * notice, this list of conditions and the following disclaimer.
186fc729afSOlivier Houchard * 2. Redistributions in binary form must reproduce the above copyright
196fc729afSOlivier Houchard * notice, this list of conditions and the following disclaimer in the
206fc729afSOlivier Houchard * documentation and/or other materials provided with the distribution.
216fc729afSOlivier Houchard *
223e1cfdddSSvatopluk Kraus * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
236fc729afSOlivier Houchard * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
246fc729afSOlivier Houchard * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
253e1cfdddSSvatopluk Kraus * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
266fc729afSOlivier Houchard * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
276fc729afSOlivier Houchard * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
286fc729afSOlivier Houchard * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
296fc729afSOlivier Houchard * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
306fc729afSOlivier Houchard * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
316fc729afSOlivier Houchard * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
326fc729afSOlivier Houchard * SUCH DAMAGE.
336fc729afSOlivier Houchard *
341e7dfc94SAndrew Turner * The ARM version of this file was more or less based on the i386 version,
351e7dfc94SAndrew Turner * which has the following provenance...
361e7dfc94SAndrew Turner *
371e7dfc94SAndrew Turner * Derived from hp300 version by Mike Hibler, this version by William
381e7dfc94SAndrew Turner * Jolitz uses a recursive map [a pde points to the page directory] to
391e7dfc94SAndrew Turner * map the page tables using the pagetables themselves. This is done to
401e7dfc94SAndrew Turner * reduce the impact on kernel virtual memory for lots of sparse address
411e7dfc94SAndrew Turner * space, and to reduce the cost of memory to each process.
421e7dfc94SAndrew Turner * from: FreeBSD: src/sys/i386/include/pmap.h,v 1.70 2000/11/30
436fc729afSOlivier Houchard */
446fc729afSOlivier Houchard
456fc729afSOlivier Houchard #ifndef _MACHINE_PMAP_H_
466fc729afSOlivier Houchard #define _MACHINE_PMAP_H_
476fc729afSOlivier Houchard
481e7dfc94SAndrew Turner #include <sys/systm.h>
491e7dfc94SAndrew Turner #include <sys/queue.h>
501e7dfc94SAndrew Turner #include <sys/_cpuset.h>
511e7dfc94SAndrew Turner #include <sys/_lock.h>
521e7dfc94SAndrew Turner #include <sys/_mutex.h>
531e7dfc94SAndrew Turner #include <sys/_pv_entry.h>
541e7dfc94SAndrew Turner
551e7dfc94SAndrew Turner typedef uint32_t pt1_entry_t; /* L1 table entry */
561e7dfc94SAndrew Turner typedef uint32_t pt2_entry_t; /* L2 table entry */
571e7dfc94SAndrew Turner typedef uint32_t ttb_entry_t; /* TTB entry */
586fc729afSOlivier Houchard
5912fdcefcSSvatopluk Kraus #ifdef _KERNEL
601e7dfc94SAndrew Turner
611e7dfc94SAndrew Turner #if 0
621e7dfc94SAndrew Turner #define PMAP_PTE_NOCACHE // Use uncached page tables
631e7dfc94SAndrew Turner #endif
641e7dfc94SAndrew Turner
651e7dfc94SAndrew Turner /*
661e7dfc94SAndrew Turner * (1) During pmap bootstrap, physical pages for L2 page tables are
671e7dfc94SAndrew Turner * allocated in advance which are used for KVA continuous mapping
681e7dfc94SAndrew Turner * starting from KERNBASE. This makes things more simple.
691e7dfc94SAndrew Turner * (2) During vm subsystem initialization, only vm subsystem itself can
701e7dfc94SAndrew Turner * allocate physical memory safely. As pmap_map() is called during
711e7dfc94SAndrew Turner * this initialization, we must be prepared for that and have some
721e7dfc94SAndrew Turner * preallocated physical pages for L2 page tables.
731e7dfc94SAndrew Turner *
741e7dfc94SAndrew Turner * Note that some more pages for L2 page tables are preallocated too
751e7dfc94SAndrew Turner * for mappings laying above VM_MAX_KERNEL_ADDRESS.
761e7dfc94SAndrew Turner */
771e7dfc94SAndrew Turner #ifndef NKPT2PG
781e7dfc94SAndrew Turner /*
791e7dfc94SAndrew Turner * The optimal way is to define this in board configuration as
801e7dfc94SAndrew Turner * definition here must be safe enough. It means really big.
811e7dfc94SAndrew Turner *
821e7dfc94SAndrew Turner * 1 GB KVA <=> 256 kernel L2 page table pages
831e7dfc94SAndrew Turner *
841e7dfc94SAndrew Turner * From real platforms:
851e7dfc94SAndrew Turner * 1 GB physical memory <=> 10 pages is enough
861e7dfc94SAndrew Turner * 2 GB physical memory <=> 21 pages is enough
871e7dfc94SAndrew Turner */
881e7dfc94SAndrew Turner #define NKPT2PG 32
891e7dfc94SAndrew Turner #endif
901e7dfc94SAndrew Turner #endif /* _KERNEL */
911e7dfc94SAndrew Turner
921e7dfc94SAndrew Turner /*
931e7dfc94SAndrew Turner * Pmap stuff
941e7dfc94SAndrew Turner */
951e7dfc94SAndrew Turner struct md_page {
961e7dfc94SAndrew Turner TAILQ_HEAD(,pv_entry) pv_list;
971e7dfc94SAndrew Turner uint16_t pt2_wirecount[4];
981e7dfc94SAndrew Turner vm_memattr_t pat_mode;
991e7dfc94SAndrew Turner };
1001e7dfc94SAndrew Turner
1011e7dfc94SAndrew Turner struct pmap {
1021e7dfc94SAndrew Turner struct mtx pm_mtx;
1031e7dfc94SAndrew Turner pt1_entry_t *pm_pt1; /* KVA of pt1 */
1041e7dfc94SAndrew Turner pt2_entry_t *pm_pt2tab; /* KVA of pt2 pages table */
1051e7dfc94SAndrew Turner TAILQ_HEAD(,pv_chunk) pm_pvchunk; /* list of mappings in pmap */
1061e7dfc94SAndrew Turner cpuset_t pm_active; /* active on cpus */
1071e7dfc94SAndrew Turner struct pmap_statistics pm_stats; /* pmap statictics */
1081e7dfc94SAndrew Turner LIST_ENTRY(pmap) pm_list; /* List of all pmaps */
1091e7dfc94SAndrew Turner };
1101e7dfc94SAndrew Turner
1111e7dfc94SAndrew Turner typedef struct pmap *pmap_t;
1121e7dfc94SAndrew Turner
1131e7dfc94SAndrew Turner #ifdef _KERNEL
1141e7dfc94SAndrew Turner extern struct pmap kernel_pmap_store;
1151e7dfc94SAndrew Turner #define kernel_pmap (&kernel_pmap_store)
1161e7dfc94SAndrew Turner
1171e7dfc94SAndrew Turner #define PMAP_LOCK(pmap) mtx_lock(&(pmap)->pm_mtx)
1181e7dfc94SAndrew Turner #define PMAP_LOCK_ASSERT(pmap, type) \
1191e7dfc94SAndrew Turner mtx_assert(&(pmap)->pm_mtx, (type))
1201e7dfc94SAndrew Turner #define PMAP_LOCK_DESTROY(pmap) mtx_destroy(&(pmap)->pm_mtx)
1211e7dfc94SAndrew Turner #define PMAP_LOCK_INIT(pmap) mtx_init(&(pmap)->pm_mtx, "pmap", \
1221e7dfc94SAndrew Turner NULL, MTX_DEF | MTX_DUPOK)
1231e7dfc94SAndrew Turner #define PMAP_LOCKED(pmap) mtx_owned(&(pmap)->pm_mtx)
1241e7dfc94SAndrew Turner #define PMAP_MTX(pmap) (&(pmap)->pm_mtx)
1251e7dfc94SAndrew Turner #define PMAP_TRYLOCK(pmap) mtx_trylock(&(pmap)->pm_mtx)
1261e7dfc94SAndrew Turner #define PMAP_UNLOCK(pmap) mtx_unlock(&(pmap)->pm_mtx)
1271e7dfc94SAndrew Turner
1281e7dfc94SAndrew Turner extern ttb_entry_t pmap_kern_ttb; /* TTB for kernel pmap */
1291e7dfc94SAndrew Turner
1301e7dfc94SAndrew Turner #define pmap_page_get_memattr(m) ((m)->md.pat_mode)
1311e7dfc94SAndrew Turner
1321e7dfc94SAndrew Turner /*
1331e7dfc94SAndrew Turner * Only the following functions or macros may be used before pmap_bootstrap()
1341e7dfc94SAndrew Turner * is called: pmap_kenter(), pmap_kextract(), pmap_kremove(), vtophys(), and
1351e7dfc94SAndrew Turner * vtopte2().
1361e7dfc94SAndrew Turner */
1371e7dfc94SAndrew Turner void pmap_bootstrap(vm_offset_t);
1381e7dfc94SAndrew Turner void pmap_kenter(vm_offset_t, vm_paddr_t);
1391e7dfc94SAndrew Turner void pmap_kremove(vm_offset_t);
140*1f1b2286SJohn Baldwin bool pmap_page_is_mapped(vm_page_t);
1411e7dfc94SAndrew Turner bool pmap_ps_enabled(pmap_t pmap);
1421e7dfc94SAndrew Turner
1431e7dfc94SAndrew Turner void pmap_tlb_flush(pmap_t, vm_offset_t);
1441e7dfc94SAndrew Turner void pmap_tlb_flush_range(pmap_t, vm_offset_t, vm_size_t);
1451e7dfc94SAndrew Turner
1461e7dfc94SAndrew Turner vm_paddr_t pmap_dump_kextract(vm_offset_t, pt2_entry_t *);
1471e7dfc94SAndrew Turner
1481e7dfc94SAndrew Turner int pmap_fault(pmap_t, vm_offset_t, uint32_t, int, bool);
1491e7dfc94SAndrew Turner
1501e7dfc94SAndrew Turner void pmap_set_tex(void);
1511e7dfc94SAndrew Turner
1521e7dfc94SAndrew Turner /*
1531e7dfc94SAndrew Turner * Pre-bootstrap epoch functions set.
1541e7dfc94SAndrew Turner */
1551e7dfc94SAndrew Turner void pmap_bootstrap_prepare(vm_paddr_t);
1561e7dfc94SAndrew Turner vm_paddr_t pmap_preboot_get_pages(u_int);
1571e7dfc94SAndrew Turner void pmap_preboot_map_pages(vm_paddr_t, vm_offset_t, u_int);
1581e7dfc94SAndrew Turner vm_offset_t pmap_preboot_reserve_pages(u_int);
1591e7dfc94SAndrew Turner vm_offset_t pmap_preboot_get_vpages(u_int);
1601e7dfc94SAndrew Turner void pmap_preboot_map_attr(vm_paddr_t, vm_offset_t, vm_size_t, vm_prot_t,
1611e7dfc94SAndrew Turner vm_memattr_t);
1621e7dfc94SAndrew Turner void pmap_remap_vm_attr(vm_memattr_t old_attr, vm_memattr_t new_attr);
16312fdcefcSSvatopluk Kraus
16412fdcefcSSvatopluk Kraus extern char *_tmppt; /* poor name! */
16512fdcefcSSvatopluk Kraus
16612fdcefcSSvatopluk Kraus extern vm_offset_t virtual_avail;
16712fdcefcSSvatopluk Kraus extern vm_offset_t virtual_end;
16812fdcefcSSvatopluk Kraus
16912fdcefcSSvatopluk Kraus void *pmap_kenter_temporary(vm_paddr_t, int);
1705cff1f4dSMark Johnston #define pmap_page_is_write_mapped(m) (((m)->a.flags & PGA_WRITEABLE) != 0)
17112fdcefcSSvatopluk Kraus void pmap_page_set_memattr(vm_page_t, vm_memattr_t);
1721e0e335bSKonstantin Belousov #define pmap_map_delete(pmap, sva, eva) pmap_remove(pmap, sva, eva)
17312fdcefcSSvatopluk Kraus
17412fdcefcSSvatopluk Kraus void *pmap_mapdev(vm_paddr_t, vm_size_t);
1757ae99f80SJohn Baldwin void pmap_unmapdev(void *, vm_size_t);
17612fdcefcSSvatopluk Kraus
177bdbc1b76SMichal Meloun static inline void *
pmap_mapdev_attr(vm_paddr_t addr __unused,vm_size_t size __unused,int attr __unused)178daa0b64aSDavid E. O'Brien pmap_mapdev_attr(vm_paddr_t addr __unused, vm_size_t size __unused,
179daa0b64aSDavid E. O'Brien int attr __unused)
180bdbc1b76SMichal Meloun {
181bdbc1b76SMichal Meloun panic("%s is not implemented yet!\n", __func__);
182bdbc1b76SMichal Meloun }
183bdbc1b76SMichal Meloun
18412fdcefcSSvatopluk Kraus struct pcb;
18512fdcefcSSvatopluk Kraus void pmap_set_pcb_pagedir(pmap_t, struct pcb *);
18612fdcefcSSvatopluk Kraus
18712fdcefcSSvatopluk Kraus void pmap_kenter_device(vm_offset_t, vm_size_t, vm_paddr_t);
18812fdcefcSSvatopluk Kraus void pmap_kremove_device(vm_offset_t, vm_size_t);
18912fdcefcSSvatopluk Kraus
19012fdcefcSSvatopluk Kraus vm_paddr_t pmap_kextract(vm_offset_t);
19112fdcefcSSvatopluk Kraus #define vtophys(va) pmap_kextract((vm_offset_t)(va))
19212fdcefcSSvatopluk Kraus
193e7a9df16SKonstantin Belousov static inline int
pmap_vmspace_copy(pmap_t dst_pmap __unused,pmap_t src_pmap __unused)194e7a9df16SKonstantin Belousov pmap_vmspace_copy(pmap_t dst_pmap __unused, pmap_t src_pmap __unused)
195e7a9df16SKonstantin Belousov {
196e7a9df16SKonstantin Belousov
197e7a9df16SKonstantin Belousov return (0);
198e7a9df16SKonstantin Belousov }
199e7a9df16SKonstantin Belousov
20096448820SKonstantin Belousov #define PMAP_ENTER_QUICK_LOCKED 0x10000000
20196448820SKonstantin Belousov
202041b7317SKonstantin Belousov #define pmap_vm_page_alloc_check(m)
203041b7317SKonstantin Belousov
20412fdcefcSSvatopluk Kraus #endif /* _KERNEL */
2056fc729afSOlivier Houchard #endif /* !_MACHINE_PMAP_H_ */
206