1*8859dfd9Sad /* $NetBSD: pmap_pv.h,v 1.17 2020/03/17 22:29:19 ad Exp $ */ 2ecf338e5Syamt 3ecf338e5Syamt /*- 4ecf338e5Syamt * Copyright (c)2008 YAMAMOTO Takashi, 5ecf338e5Syamt * All rights reserved. 6ecf338e5Syamt * 7ecf338e5Syamt * Redistribution and use in source and binary forms, with or without 8ecf338e5Syamt * modification, are permitted provided that the following conditions 9ecf338e5Syamt * are met: 10ecf338e5Syamt * 1. Redistributions of source code must retain the above copyright 11ecf338e5Syamt * notice, this list of conditions and the following disclaimer. 12ecf338e5Syamt * 2. Redistributions in binary form must reproduce the above copyright 13ecf338e5Syamt * notice, this list of conditions and the following disclaimer in the 14ecf338e5Syamt * documentation and/or other materials provided with the distribution. 15ecf338e5Syamt * 16ecf338e5Syamt * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17ecf338e5Syamt * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18ecf338e5Syamt * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19ecf338e5Syamt * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20ecf338e5Syamt * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21ecf338e5Syamt * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22ecf338e5Syamt * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23ecf338e5Syamt * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24ecf338e5Syamt * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25ecf338e5Syamt * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26ecf338e5Syamt * SUCH DAMAGE. 27ecf338e5Syamt */ 28ecf338e5Syamt 29ecf338e5Syamt #ifndef _X86_PMAP_PV_H_ 30ecf338e5Syamt #define _X86_PMAP_PV_H_ 31ecf338e5Syamt 32ecf338e5Syamt #include <sys/mutex.h> 33ecf338e5Syamt #include <sys/queue.h> 348dcd5a32Sad #include <sys/rbtree.h> 35ecf338e5Syamt 36ecf338e5Syamt struct vm_page; 37*8859dfd9Sad struct pmap_page; 38ecf338e5Syamt 39ecf338e5Syamt /* 40ecf338e5Syamt * structures to track P->V mapping 41ecf338e5Syamt * 42ecf338e5Syamt * this file is intended to be minimum as it's included by <machine/vmparam.h>. 43ecf338e5Syamt */ 44ecf338e5Syamt 45ecf338e5Syamt /* 46ecf338e5Syamt * pv_pte: describe a pte 47ecf338e5Syamt */ 48ecf338e5Syamt 49ecf338e5Syamt struct pv_pte { 50ecf338e5Syamt struct vm_page *pte_ptp; /* PTP; NULL for pmap_kernel() */ 51ecf338e5Syamt vaddr_t pte_va; /* VA */ 52ecf338e5Syamt }; 53ecf338e5Syamt 54ecf338e5Syamt /* 55*8859dfd9Sad * pv_entry: plug pv_pte into lists. 32 bytes on i386, 64 on amd64. 56ecf338e5Syamt */ 57ecf338e5Syamt 58ecf338e5Syamt struct pv_entry { 59ecf338e5Syamt struct pv_pte pve_pte; /* should be the first member */ 60375fab30Sad LIST_ENTRY(pv_entry) pve_list; /* on pmap_page::pp_pvlist */ 618dcd5a32Sad rb_node_t pve_rb; /* red-black tree node */ 62*8859dfd9Sad struct pmap_page *pve_pp; /* backpointer to mapped page */ 63ecf338e5Syamt }; 64ecf338e5Syamt #define pve_next pve_list.le_next 65ecf338e5Syamt 66ecf338e5Syamt /* 67ecf338e5Syamt * pmap_page: a structure which is embedded in each vm_page. 68ecf338e5Syamt */ 69ecf338e5Syamt 70ecf338e5Syamt struct pmap_page { 71ecf338e5Syamt union { 728dcd5a32Sad /* PTPs */ 738dcd5a32Sad rb_tree_t rb; 74ecf338e5Syamt 75*8859dfd9Sad /* PTPs, when being freed */ 768dcd5a32Sad LIST_ENTRY(vm_page) link; 778dcd5a32Sad 78*8859dfd9Sad /* Non-PTPs (i.e. normal pages) */ 798dcd5a32Sad struct { 808dcd5a32Sad struct pv_pte pte; 818dcd5a32Sad LIST_HEAD(, pv_entry) pvlist; 828dcd5a32Sad uint8_t attrs; 838dcd5a32Sad } s; 84ecf338e5Syamt } pp_u; 858dcd5a32Sad kmutex_t pp_lock; 868dcd5a32Sad #define pp_rb pp_u.rb 878dcd5a32Sad #define pp_link pp_u.link 888dcd5a32Sad #define pp_pte pp_u.s.pte 898dcd5a32Sad #define pp_pvlist pp_u.s.pvlist 908dcd5a32Sad #define pp_attrs pp_u.s.attrs 918dcd5a32Sad }; 928dcd5a32Sad 93d0dbdfd3Smaxv #define PP_ATTRS_D 0x01 /* Dirty */ 94d0dbdfd3Smaxv #define PP_ATTRS_A 0x02 /* Accessed */ 95e4552b50Smaxv #define PP_ATTRS_W 0x04 /* Writable */ 96ecf338e5Syamt 978dcd5a32Sad #define PMAP_PAGE_INIT(pp) \ 988dcd5a32Sad do { \ 998dcd5a32Sad LIST_INIT(&(pp)->pp_pvlist); \ 1008dcd5a32Sad mutex_init(&(pp)->pp_lock, MUTEX_NODEBUG, IPL_VM); \ 1018dcd5a32Sad } while (/* CONSTCOND */ 0); 102ecf338e5Syamt 103ecf338e5Syamt #endif /* !_X86_PMAP_PV_H_ */ 104