1 /* $NetBSD: xenpmap.h,v 1.38 2014/05/06 04:26:24 cherry Exp $ */ 2 3 /* 4 * 5 * Copyright (c) 2004 Christian Limpach. 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 30 #ifndef _XEN_XENPMAP_H_ 31 #define _XEN_XENPMAP_H_ 32 33 #ifdef _KERNEL_OPT 34 #include "opt_xen.h" 35 #endif 36 37 #include <sys/types.h> 38 #include <sys/kcpuset.h> 39 40 #define INVALID_P2M_ENTRY (~0UL) 41 42 void xpq_queue_machphys_update(paddr_t, paddr_t); 43 void xpq_queue_invlpg(vaddr_t); 44 void xpq_queue_pte_update(paddr_t, pt_entry_t); 45 void xpq_queue_pt_switch(paddr_t); 46 void xpq_flush_queue(void); 47 void xpq_queue_set_ldt(vaddr_t, uint32_t); 48 void xpq_queue_tlb_flush(void); 49 void xpq_queue_pin_table(paddr_t, int); 50 void xpq_queue_unpin_table(paddr_t); 51 int xpq_update_foreign(paddr_t, pt_entry_t, int); 52 void xen_vcpu_mcast_invlpg(vaddr_t, vaddr_t, kcpuset_t *); 53 void xen_vcpu_bcast_invlpg(vaddr_t, vaddr_t); 54 void xen_mcast_tlbflush(kcpuset_t *); 55 void xen_bcast_tlbflush(void); 56 void xen_mcast_invlpg(vaddr_t, kcpuset_t *); 57 void xen_bcast_invlpg(vaddr_t); 58 void xen_copy_page(paddr_t, paddr_t); 59 void xen_pagezero(paddr_t); 60 61 void pmap_xen_resume(void); 62 void pmap_xen_suspend(void); 63 void pmap_map_recursive_entries(void); 64 void pmap_unmap_recursive_entries(void); 65 66 #if defined(PAE) || defined(__x86_64__) 67 void xen_kpm_sync(struct pmap *, int); 68 #endif /* PAE || __x86_64__ */ 69 70 #define xpq_queue_pin_l1_table(pa) \ 71 xpq_queue_pin_table(pa, MMUEXT_PIN_L1_TABLE) 72 #define xpq_queue_pin_l2_table(pa) \ 73 xpq_queue_pin_table(pa, MMUEXT_PIN_L2_TABLE) 74 #define xpq_queue_pin_l3_table(pa) \ 75 xpq_queue_pin_table(pa, MMUEXT_PIN_L3_TABLE) 76 #define xpq_queue_pin_l4_table(pa) \ 77 xpq_queue_pin_table(pa, MMUEXT_PIN_L4_TABLE) 78 79 extern unsigned long *xpmap_phys_to_machine_mapping; 80 81 static __inline paddr_t 82 xpmap_mtop_masked(paddr_t mpa) 83 { 84 return ( 85 (paddr_t)machine_to_phys_mapping[mpa >> PAGE_SHIFT] << PAGE_SHIFT); 86 } 87 88 static __inline paddr_t 89 xpmap_mtop(paddr_t mpa) 90 { 91 return (xpmap_mtop_masked(mpa) | (mpa & ~PG_FRAME)); 92 } 93 94 static __inline paddr_t 95 xpmap_ptom_masked(paddr_t ppa) 96 { 97 return ( 98 (paddr_t)xpmap_phys_to_machine_mapping[ppa >> PAGE_SHIFT] 99 << PAGE_SHIFT); 100 } 101 102 static __inline paddr_t 103 xpmap_ptom(paddr_t ppa) 104 { 105 return (xpmap_ptom_masked(ppa) | (ppa & ~PG_FRAME)); 106 } 107 108 static __inline void 109 xpmap_ptom_map(paddr_t ppa, paddr_t mpa) 110 { 111 xpmap_phys_to_machine_mapping[ppa >> PAGE_SHIFT] = mpa >> PAGE_SHIFT; 112 } 113 114 static __inline void 115 xpmap_ptom_unmap(paddr_t ppa) 116 { 117 xpmap_phys_to_machine_mapping[ppa >> PAGE_SHIFT] = INVALID_P2M_ENTRY; 118 } 119 120 static __inline bool 121 xpmap_ptom_isvalid(paddr_t ppa) 122 { 123 return ( 124 xpmap_phys_to_machine_mapping[ppa >> PAGE_SHIFT] 125 != INVALID_P2M_ENTRY); 126 } 127 128 static inline void 129 MULTI_update_va_mapping( 130 multicall_entry_t *mcl, vaddr_t va, 131 pt_entry_t new_val, unsigned long flags) 132 { 133 mcl->op = __HYPERVISOR_update_va_mapping; 134 mcl->args[0] = va; 135 #if defined(__x86_64__) 136 mcl->args[1] = new_val; 137 mcl->args[2] = flags; 138 #else 139 mcl->args[1] = (new_val & 0xffffffff); 140 #ifdef PAE 141 mcl->args[2] = (new_val >> 32); 142 #else 143 mcl->args[2] = 0; 144 #endif 145 mcl->args[3] = flags; 146 #endif 147 } 148 149 static inline void 150 MULTI_update_va_mapping_otherdomain( 151 multicall_entry_t *mcl, vaddr_t va, 152 pt_entry_t new_val, unsigned long flags, domid_t domid) 153 { 154 mcl->op = __HYPERVISOR_update_va_mapping_otherdomain; 155 mcl->args[0] = va; 156 #if defined(__x86_64__) 157 mcl->args[1] = new_val; 158 mcl->args[2] = flags; 159 mcl->args[3] = domid; 160 #else 161 mcl->args[1] = (new_val & 0xffffffff); 162 #ifdef PAE 163 mcl->args[2] = (new_val >> 32); 164 #else 165 mcl->args[2] = 0; 166 #endif 167 mcl->args[3] = flags; 168 mcl->args[4] = domid; 169 #endif 170 } 171 #if defined(__x86_64__) 172 #define MULTI_UVMFLAGS_INDEX 2 173 #define MULTI_UVMDOMID_INDEX 3 174 #else 175 #define MULTI_UVMFLAGS_INDEX 3 176 #define MULTI_UVMDOMID_INDEX 4 177 #endif 178 179 #if defined(__x86_64__) 180 void xen_set_user_pgd(paddr_t); 181 #endif 182 183 #endif /* _XEN_XENPMAP_H_ */ 184