1*36d47be6Sbouyer /* $NetBSD: xenpmap.h,v 1.44 2020/05/26 10:10:32 bouyer Exp $ */
241d325dcScl
341d325dcScl /*
441d325dcScl *
541d325dcScl * Copyright (c) 2004 Christian Limpach.
641d325dcScl * All rights reserved.
741d325dcScl *
841d325dcScl * Redistribution and use in source and binary forms, with or without
941d325dcScl * modification, are permitted provided that the following conditions
1041d325dcScl * are met:
1141d325dcScl * 1. Redistributions of source code must retain the above copyright
1241d325dcScl * notice, this list of conditions and the following disclaimer.
1341d325dcScl * 2. Redistributions in binary form must reproduce the above copyright
1441d325dcScl * notice, this list of conditions and the following disclaimer in the
1541d325dcScl * documentation and/or other materials provided with the distribution.
1641d325dcScl *
1741d325dcScl * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
1841d325dcScl * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
1941d325dcScl * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
2041d325dcScl * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
2141d325dcScl * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
2241d325dcScl * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2341d325dcScl * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2441d325dcScl * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2541d325dcScl * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
2641d325dcScl * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2741d325dcScl */
2841d325dcScl
2941d325dcScl
3041d325dcScl #ifndef _XEN_XENPMAP_H_
3141d325dcScl #define _XEN_XENPMAP_H_
32648bc71cSmrg
33648bc71cSmrg #ifdef _KERNEL_OPT
3498a8e8b4Sbouyer #include "opt_xen.h"
35648bc71cSmrg #endif
3641d325dcScl
370c794722Srmind #include <sys/types.h>
380c794722Srmind #include <sys/kcpuset.h>
390c794722Srmind
40396b8b4aScherry #define INVALID_P2M_ENTRY (~0UL)
41787e5fb0Scherry
4254ecd3d8Sbouyer void xpq_queue_machphys_update(paddr_t, paddr_t);
4341d325dcScl void xpq_queue_invlpg(vaddr_t);
4498a8e8b4Sbouyer void xpq_queue_pte_update(paddr_t, pt_entry_t);
4541d325dcScl void xpq_queue_pt_switch(paddr_t);
4641d325dcScl void xpq_flush_queue(void);
4741d325dcScl void xpq_queue_set_ldt(vaddr_t, uint32_t);
4841d325dcScl void xpq_queue_tlb_flush(void);
4971d70847Sjym void xpq_queue_pin_table(paddr_t, int);
5041d325dcScl void xpq_queue_unpin_table(paddr_t);
51*36d47be6Sbouyer int xpq_update_foreign(paddr_t, pt_entry_t, int, u_int);
520c794722Srmind void xen_mcast_tlbflush(kcpuset_t *);
531f0a8a80Scherry void xen_bcast_tlbflush(void);
540c794722Srmind void xen_mcast_invlpg(vaddr_t, kcpuset_t *);
551f0a8a80Scherry void xen_bcast_invlpg(vaddr_t);
56b3b58e3bScherry void xen_copy_page(paddr_t, paddr_t);
57b3b58e3bScherry void xen_pagezero(paddr_t);
581f0a8a80Scherry
591eaed4e6Sjym void pmap_xen_resume(void);
601eaed4e6Sjym void pmap_xen_suspend(void);
611eaed4e6Sjym void pmap_map_recursive_entries(void);
621eaed4e6Sjym void pmap_unmap_recursive_entries(void);
6341d325dcScl
64d12f2f3bScherry void xen_kpm_sync(struct pmap *, int);
65d12f2f3bScherry
6671d70847Sjym #define xpq_queue_pin_l1_table(pa) \
6771d70847Sjym xpq_queue_pin_table(pa, MMUEXT_PIN_L1_TABLE)
6871d70847Sjym #define xpq_queue_pin_l2_table(pa) \
6971d70847Sjym xpq_queue_pin_table(pa, MMUEXT_PIN_L2_TABLE)
7071d70847Sjym #define xpq_queue_pin_l3_table(pa) \
7171d70847Sjym xpq_queue_pin_table(pa, MMUEXT_PIN_L3_TABLE)
7271d70847Sjym #define xpq_queue_pin_l4_table(pa) \
7371d70847Sjym xpq_queue_pin_table(pa, MMUEXT_PIN_L4_TABLE)
7471d70847Sjym
7514037d51Scherry #ifdef XENPV
7698a8e8b4Sbouyer extern unsigned long *xpmap_phys_to_machine_mapping;
7741d325dcScl
78*36d47be6Sbouyer /* MD PMAP flags */
79*36d47be6Sbouyer /* mmu_update with MMU_PT_UPDATE_NO_TRANSLATE */
80*36d47be6Sbouyer #define PMAP_MD_XEN_NOTR 0x01000000
81*36d47be6Sbouyer
82fbae48b9Sperry static __inline paddr_t
xpmap_mtop_masked(paddr_t mpa)834e541343Sbouyer xpmap_mtop_masked(paddr_t mpa)
844e541343Sbouyer {
85f5f016d3Sbouyer return (
86b6169c06Sjym (paddr_t)machine_to_phys_mapping[mpa >> PAGE_SHIFT] << PAGE_SHIFT);
874e541343Sbouyer }
884e541343Sbouyer
894e541343Sbouyer static __inline paddr_t
xpmap_mtop(paddr_t mpa)9021afd04aSjym xpmap_mtop(paddr_t mpa)
9141d325dcScl {
92d50e7f2aSmaxv return (xpmap_mtop_masked(mpa) | (mpa & ~PTE_4KFRAME));
93f720882cScl }
94f720882cScl
95fbae48b9Sperry static __inline paddr_t
xpmap_ptom_masked(paddr_t ppa)96f720882cScl xpmap_ptom_masked(paddr_t ppa)
97f720882cScl {
984b5a093dSjym return (
994b5a093dSjym (paddr_t)xpmap_phys_to_machine_mapping[ppa >> PAGE_SHIFT]
100b6169c06Sjym << PAGE_SHIFT);
10141d325dcScl }
10241d325dcScl
10321afd04aSjym static __inline paddr_t
xpmap_ptom(paddr_t ppa)10421afd04aSjym xpmap_ptom(paddr_t ppa)
10521afd04aSjym {
106d50e7f2aSmaxv return (xpmap_ptom_masked(ppa) | (ppa & ~PTE_4KFRAME));
10721afd04aSjym }
10821afd04aSjym
1094b5a093dSjym static __inline void
xpmap_ptom_map(paddr_t ppa,paddr_t mpa)1104b5a093dSjym xpmap_ptom_map(paddr_t ppa, paddr_t mpa)
1114b5a093dSjym {
1124b5a093dSjym xpmap_phys_to_machine_mapping[ppa >> PAGE_SHIFT] = mpa >> PAGE_SHIFT;
1134b5a093dSjym }
1144b5a093dSjym
1154b5a093dSjym static __inline void
xpmap_ptom_unmap(paddr_t ppa)1164b5a093dSjym xpmap_ptom_unmap(paddr_t ppa)
1174b5a093dSjym {
1184b5a093dSjym xpmap_phys_to_machine_mapping[ppa >> PAGE_SHIFT] = INVALID_P2M_ENTRY;
1194b5a093dSjym }
1204b5a093dSjym
1214b5a093dSjym static __inline bool
xpmap_ptom_isvalid(paddr_t ppa)1224b5a093dSjym xpmap_ptom_isvalid(paddr_t ppa)
1234b5a093dSjym {
1244b5a093dSjym return (
1254b5a093dSjym xpmap_phys_to_machine_mapping[ppa >> PAGE_SHIFT]
1264b5a093dSjym != INVALID_P2M_ENTRY);
1274b5a093dSjym }
1284b5a093dSjym
12914037d51Scherry
1309c7083dfSbouyer static inline void
MULTI_update_va_mapping(multicall_entry_t * mcl,vaddr_t va,pt_entry_t new_val,unsigned long flags)1319c7083dfSbouyer MULTI_update_va_mapping(
1329c7083dfSbouyer multicall_entry_t *mcl, vaddr_t va,
13398a8e8b4Sbouyer pt_entry_t new_val, unsigned long flags)
1349c7083dfSbouyer {
1359c7083dfSbouyer mcl->op = __HYPERVISOR_update_va_mapping;
1369c7083dfSbouyer mcl->args[0] = va;
1379c7083dfSbouyer #if defined(__x86_64__)
1389c7083dfSbouyer mcl->args[1] = new_val;
1399c7083dfSbouyer mcl->args[2] = flags;
1409c7083dfSbouyer #else
14198a8e8b4Sbouyer mcl->args[1] = (new_val & 0xffffffff);
14298a8e8b4Sbouyer mcl->args[2] = (new_val >> 32);
1439c7083dfSbouyer mcl->args[3] = flags;
1449c7083dfSbouyer #endif
1459c7083dfSbouyer }
1469c7083dfSbouyer
1479c7083dfSbouyer static inline void
MULTI_update_va_mapping_otherdomain(multicall_entry_t * mcl,vaddr_t va,pt_entry_t new_val,unsigned long flags,domid_t domid)1489c7083dfSbouyer MULTI_update_va_mapping_otherdomain(
1499c7083dfSbouyer multicall_entry_t *mcl, vaddr_t va,
15098a8e8b4Sbouyer pt_entry_t new_val, unsigned long flags, domid_t domid)
1519c7083dfSbouyer {
1529c7083dfSbouyer mcl->op = __HYPERVISOR_update_va_mapping_otherdomain;
1539c7083dfSbouyer mcl->args[0] = va;
1549c7083dfSbouyer #if defined(__x86_64__)
1559c7083dfSbouyer mcl->args[1] = new_val;
1569c7083dfSbouyer mcl->args[2] = flags;
1579c7083dfSbouyer mcl->args[3] = domid;
1589c7083dfSbouyer #else
15998a8e8b4Sbouyer mcl->args[1] = (new_val & 0xffffffff);
16098a8e8b4Sbouyer mcl->args[2] = (new_val >> 32);
1619c7083dfSbouyer mcl->args[3] = flags;
1629c7083dfSbouyer mcl->args[4] = domid;
1639c7083dfSbouyer #endif
1649c7083dfSbouyer }
1659c7083dfSbouyer #if defined(__x86_64__)
1669c7083dfSbouyer #define MULTI_UVMFLAGS_INDEX 2
1679c7083dfSbouyer #define MULTI_UVMDOMID_INDEX 3
1689c7083dfSbouyer #else
1699c7083dfSbouyer #define MULTI_UVMFLAGS_INDEX 3
1709c7083dfSbouyer #define MULTI_UVMDOMID_INDEX 4
1719c7083dfSbouyer #endif
1729c7083dfSbouyer
1734e541343Sbouyer #if defined(__x86_64__)
1744e541343Sbouyer void xen_set_user_pgd(paddr_t);
1754e541343Sbouyer #endif
176c24c993fSbouyer #endif /* XENPV */
1774e541343Sbouyer
178*36d47be6Sbouyer int pmap_enter_gnt(struct pmap *, vaddr_t, vaddr_t, int,
179*36d47be6Sbouyer const struct gnttab_map_grant_ref *);
180*36d47be6Sbouyer
18141d325dcScl #endif /* _XEN_XENPMAP_H_ */
182