162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef _ASM_X86_XEN_PAGE_H 362306a36Sopenharmony_ci#define _ASM_X86_XEN_PAGE_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <linux/kernel.h> 662306a36Sopenharmony_ci#include <linux/types.h> 762306a36Sopenharmony_ci#include <linux/spinlock.h> 862306a36Sopenharmony_ci#include <linux/pfn.h> 962306a36Sopenharmony_ci#include <linux/mm.h> 1062306a36Sopenharmony_ci#include <linux/device.h> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <asm/extable.h> 1362306a36Sopenharmony_ci#include <asm/page.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include <xen/interface/xen.h> 1662306a36Sopenharmony_ci#include <xen/interface/grant_table.h> 1762306a36Sopenharmony_ci#include <xen/features.h> 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci/* Xen machine address */ 2062306a36Sopenharmony_citypedef struct xmaddr { 2162306a36Sopenharmony_ci phys_addr_t maddr; 2262306a36Sopenharmony_ci} xmaddr_t; 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci/* Xen pseudo-physical address */ 2562306a36Sopenharmony_citypedef struct xpaddr { 2662306a36Sopenharmony_ci phys_addr_t paddr; 2762306a36Sopenharmony_ci} xpaddr_t; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#ifdef CONFIG_X86_64 3062306a36Sopenharmony_ci#define XEN_PHYSICAL_MASK __sme_clr((1UL << 52) - 1) 3162306a36Sopenharmony_ci#else 3262306a36Sopenharmony_ci#define XEN_PHYSICAL_MASK __PHYSICAL_MASK 3362306a36Sopenharmony_ci#endif 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci#define XEN_PTE_MFN_MASK ((pteval_t)(((signed long)PAGE_MASK) & \ 3662306a36Sopenharmony_ci XEN_PHYSICAL_MASK)) 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci#define XMADDR(x) ((xmaddr_t) { .maddr = (x) }) 3962306a36Sopenharmony_ci#define XPADDR(x) ((xpaddr_t) { .paddr = (x) }) 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci/**** MACHINE <-> PHYSICAL CONVERSION MACROS ****/ 4262306a36Sopenharmony_ci#define INVALID_P2M_ENTRY (~0UL) 4362306a36Sopenharmony_ci#define FOREIGN_FRAME_BIT (1UL<<(BITS_PER_LONG-1)) 4462306a36Sopenharmony_ci#define IDENTITY_FRAME_BIT (1UL<<(BITS_PER_LONG-2)) 4562306a36Sopenharmony_ci#define FOREIGN_FRAME(m) ((m) | FOREIGN_FRAME_BIT) 4662306a36Sopenharmony_ci#define IDENTITY_FRAME(m) ((m) | IDENTITY_FRAME_BIT) 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci#define P2M_PER_PAGE (PAGE_SIZE / sizeof(unsigned long)) 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ciextern unsigned long *machine_to_phys_mapping; 5162306a36Sopenharmony_ciextern unsigned long machine_to_phys_nr; 5262306a36Sopenharmony_ciextern unsigned long *xen_p2m_addr; 5362306a36Sopenharmony_ciextern unsigned long xen_p2m_size; 5462306a36Sopenharmony_ciextern unsigned long xen_max_p2m_pfn; 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ciextern int xen_alloc_p2m_entry(unsigned long pfn); 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ciextern unsigned long get_phys_to_machine(unsigned long pfn); 5962306a36Sopenharmony_ciextern bool set_phys_to_machine(unsigned long pfn, unsigned long mfn); 6062306a36Sopenharmony_ciextern bool __set_phys_to_machine(unsigned long pfn, unsigned long mfn); 6162306a36Sopenharmony_ciextern unsigned long __init set_phys_range_identity(unsigned long pfn_s, 6262306a36Sopenharmony_ci unsigned long pfn_e); 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci#ifdef CONFIG_XEN_PV 6562306a36Sopenharmony_ciextern int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops, 6662306a36Sopenharmony_ci struct gnttab_map_grant_ref *kmap_ops, 6762306a36Sopenharmony_ci struct page **pages, unsigned int count); 6862306a36Sopenharmony_ciextern int clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops, 6962306a36Sopenharmony_ci struct gnttab_unmap_grant_ref *kunmap_ops, 7062306a36Sopenharmony_ci struct page **pages, unsigned int count); 7162306a36Sopenharmony_ci#else 7262306a36Sopenharmony_cistatic inline int 7362306a36Sopenharmony_ciset_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops, 7462306a36Sopenharmony_ci struct gnttab_map_grant_ref *kmap_ops, 7562306a36Sopenharmony_ci struct page **pages, unsigned int count) 7662306a36Sopenharmony_ci{ 7762306a36Sopenharmony_ci return 0; 7862306a36Sopenharmony_ci} 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_cistatic inline int 8162306a36Sopenharmony_ciclear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops, 8262306a36Sopenharmony_ci struct gnttab_unmap_grant_ref *kunmap_ops, 8362306a36Sopenharmony_ci struct page **pages, unsigned int count) 8462306a36Sopenharmony_ci{ 8562306a36Sopenharmony_ci return 0; 8662306a36Sopenharmony_ci} 8762306a36Sopenharmony_ci#endif 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci/* 9062306a36Sopenharmony_ci * Helper functions to write or read unsigned long values to/from 9162306a36Sopenharmony_ci * memory, when the access may fault. 9262306a36Sopenharmony_ci */ 9362306a36Sopenharmony_cistatic inline int xen_safe_write_ulong(unsigned long *addr, unsigned long val) 9462306a36Sopenharmony_ci{ 9562306a36Sopenharmony_ci int ret = 0; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci asm volatile("1: mov %[val], %[ptr]\n" 9862306a36Sopenharmony_ci "2:\n" 9962306a36Sopenharmony_ci _ASM_EXTABLE_TYPE_REG(1b, 2b, EX_TYPE_EFAULT_REG, %[ret]) 10062306a36Sopenharmony_ci : [ret] "+r" (ret), [ptr] "=m" (*addr) 10162306a36Sopenharmony_ci : [val] "r" (val)); 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci return ret; 10462306a36Sopenharmony_ci} 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_cistatic inline int xen_safe_read_ulong(const unsigned long *addr, 10762306a36Sopenharmony_ci unsigned long *val) 10862306a36Sopenharmony_ci{ 10962306a36Sopenharmony_ci unsigned long rval = ~0ul; 11062306a36Sopenharmony_ci int ret = 0; 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci asm volatile("1: mov %[ptr], %[rval]\n" 11362306a36Sopenharmony_ci "2:\n" 11462306a36Sopenharmony_ci _ASM_EXTABLE_TYPE_REG(1b, 2b, EX_TYPE_EFAULT_REG, %[ret]) 11562306a36Sopenharmony_ci : [ret] "+r" (ret), [rval] "+r" (rval) 11662306a36Sopenharmony_ci : [ptr] "m" (*addr)); 11762306a36Sopenharmony_ci *val = rval; 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci return ret; 12062306a36Sopenharmony_ci} 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci#ifdef CONFIG_XEN_PV 12362306a36Sopenharmony_ci/* 12462306a36Sopenharmony_ci * When to use pfn_to_mfn(), __pfn_to_mfn() or get_phys_to_machine(): 12562306a36Sopenharmony_ci * - pfn_to_mfn() returns either INVALID_P2M_ENTRY or the mfn. No indicator 12662306a36Sopenharmony_ci * bits (identity or foreign) are set. 12762306a36Sopenharmony_ci * - __pfn_to_mfn() returns the found entry of the p2m table. A possibly set 12862306a36Sopenharmony_ci * identity or foreign indicator will be still set. __pfn_to_mfn() is 12962306a36Sopenharmony_ci * encapsulating get_phys_to_machine() which is called in special cases only. 13062306a36Sopenharmony_ci * - get_phys_to_machine() is to be called by __pfn_to_mfn() only in special 13162306a36Sopenharmony_ci * cases needing an extended handling. 13262306a36Sopenharmony_ci */ 13362306a36Sopenharmony_cistatic inline unsigned long __pfn_to_mfn(unsigned long pfn) 13462306a36Sopenharmony_ci{ 13562306a36Sopenharmony_ci unsigned long mfn; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ci if (pfn < xen_p2m_size) 13862306a36Sopenharmony_ci mfn = xen_p2m_addr[pfn]; 13962306a36Sopenharmony_ci else if (unlikely(pfn < xen_max_p2m_pfn)) 14062306a36Sopenharmony_ci return get_phys_to_machine(pfn); 14162306a36Sopenharmony_ci else 14262306a36Sopenharmony_ci return IDENTITY_FRAME(pfn); 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_ci if (unlikely(mfn == INVALID_P2M_ENTRY)) 14562306a36Sopenharmony_ci return get_phys_to_machine(pfn); 14662306a36Sopenharmony_ci 14762306a36Sopenharmony_ci return mfn; 14862306a36Sopenharmony_ci} 14962306a36Sopenharmony_ci#else 15062306a36Sopenharmony_cistatic inline unsigned long __pfn_to_mfn(unsigned long pfn) 15162306a36Sopenharmony_ci{ 15262306a36Sopenharmony_ci return pfn; 15362306a36Sopenharmony_ci} 15462306a36Sopenharmony_ci#endif 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_cistatic inline unsigned long pfn_to_mfn(unsigned long pfn) 15762306a36Sopenharmony_ci{ 15862306a36Sopenharmony_ci unsigned long mfn; 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci /* 16162306a36Sopenharmony_ci * Some x86 code are still using pfn_to_mfn instead of 16262306a36Sopenharmony_ci * pfn_to_mfn. This will have to be removed when we figured 16362306a36Sopenharmony_ci * out which call. 16462306a36Sopenharmony_ci */ 16562306a36Sopenharmony_ci if (xen_feature(XENFEAT_auto_translated_physmap)) 16662306a36Sopenharmony_ci return pfn; 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci mfn = __pfn_to_mfn(pfn); 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci if (mfn != INVALID_P2M_ENTRY) 17162306a36Sopenharmony_ci mfn &= ~(FOREIGN_FRAME_BIT | IDENTITY_FRAME_BIT); 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_ci return mfn; 17462306a36Sopenharmony_ci} 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_cistatic inline int phys_to_machine_mapping_valid(unsigned long pfn) 17762306a36Sopenharmony_ci{ 17862306a36Sopenharmony_ci if (xen_feature(XENFEAT_auto_translated_physmap)) 17962306a36Sopenharmony_ci return 1; 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci return __pfn_to_mfn(pfn) != INVALID_P2M_ENTRY; 18262306a36Sopenharmony_ci} 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_cistatic inline unsigned long mfn_to_pfn_no_overrides(unsigned long mfn) 18562306a36Sopenharmony_ci{ 18662306a36Sopenharmony_ci unsigned long pfn; 18762306a36Sopenharmony_ci int ret; 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ci if (unlikely(mfn >= machine_to_phys_nr)) 19062306a36Sopenharmony_ci return ~0; 19162306a36Sopenharmony_ci 19262306a36Sopenharmony_ci /* 19362306a36Sopenharmony_ci * The array access can fail (e.g., device space beyond end of RAM). 19462306a36Sopenharmony_ci * In such cases it doesn't matter what we return (we return garbage), 19562306a36Sopenharmony_ci * but we must handle the fault without crashing! 19662306a36Sopenharmony_ci */ 19762306a36Sopenharmony_ci ret = xen_safe_read_ulong(&machine_to_phys_mapping[mfn], &pfn); 19862306a36Sopenharmony_ci if (ret < 0) 19962306a36Sopenharmony_ci return ~0; 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_ci return pfn; 20262306a36Sopenharmony_ci} 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_cistatic inline unsigned long mfn_to_pfn(unsigned long mfn) 20562306a36Sopenharmony_ci{ 20662306a36Sopenharmony_ci unsigned long pfn; 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci /* 20962306a36Sopenharmony_ci * Some x86 code are still using mfn_to_pfn instead of 21062306a36Sopenharmony_ci * gfn_to_pfn. This will have to be removed when we figure 21162306a36Sopenharmony_ci * out which call. 21262306a36Sopenharmony_ci */ 21362306a36Sopenharmony_ci if (xen_feature(XENFEAT_auto_translated_physmap)) 21462306a36Sopenharmony_ci return mfn; 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci pfn = mfn_to_pfn_no_overrides(mfn); 21762306a36Sopenharmony_ci if (__pfn_to_mfn(pfn) != mfn) 21862306a36Sopenharmony_ci pfn = ~0; 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci /* 22162306a36Sopenharmony_ci * pfn is ~0 if there are no entries in the m2p for mfn or the 22262306a36Sopenharmony_ci * entry doesn't map back to the mfn. 22362306a36Sopenharmony_ci */ 22462306a36Sopenharmony_ci if (pfn == ~0 && __pfn_to_mfn(mfn) == IDENTITY_FRAME(mfn)) 22562306a36Sopenharmony_ci pfn = mfn; 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci return pfn; 22862306a36Sopenharmony_ci} 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_cistatic inline xmaddr_t phys_to_machine(xpaddr_t phys) 23162306a36Sopenharmony_ci{ 23262306a36Sopenharmony_ci unsigned offset = phys.paddr & ~PAGE_MASK; 23362306a36Sopenharmony_ci return XMADDR(PFN_PHYS(pfn_to_mfn(PFN_DOWN(phys.paddr))) | offset); 23462306a36Sopenharmony_ci} 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_cistatic inline xpaddr_t machine_to_phys(xmaddr_t machine) 23762306a36Sopenharmony_ci{ 23862306a36Sopenharmony_ci unsigned offset = machine.maddr & ~PAGE_MASK; 23962306a36Sopenharmony_ci return XPADDR(PFN_PHYS(mfn_to_pfn(PFN_DOWN(machine.maddr))) | offset); 24062306a36Sopenharmony_ci} 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci/* Pseudo-physical <-> Guest conversion */ 24362306a36Sopenharmony_cistatic inline unsigned long pfn_to_gfn(unsigned long pfn) 24462306a36Sopenharmony_ci{ 24562306a36Sopenharmony_ci if (xen_feature(XENFEAT_auto_translated_physmap)) 24662306a36Sopenharmony_ci return pfn; 24762306a36Sopenharmony_ci else 24862306a36Sopenharmony_ci return pfn_to_mfn(pfn); 24962306a36Sopenharmony_ci} 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_cistatic inline unsigned long gfn_to_pfn(unsigned long gfn) 25262306a36Sopenharmony_ci{ 25362306a36Sopenharmony_ci if (xen_feature(XENFEAT_auto_translated_physmap)) 25462306a36Sopenharmony_ci return gfn; 25562306a36Sopenharmony_ci else 25662306a36Sopenharmony_ci return mfn_to_pfn(gfn); 25762306a36Sopenharmony_ci} 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci/* Pseudo-physical <-> Bus conversion */ 26062306a36Sopenharmony_ci#define pfn_to_bfn(pfn) pfn_to_gfn(pfn) 26162306a36Sopenharmony_ci#define bfn_to_pfn(bfn) gfn_to_pfn(bfn) 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_ci/* 26462306a36Sopenharmony_ci * We detect special mappings in one of two ways: 26562306a36Sopenharmony_ci * 1. If the MFN is an I/O page then Xen will set the m2p entry 26662306a36Sopenharmony_ci * to be outside our maximum possible pseudophys range. 26762306a36Sopenharmony_ci * 2. If the MFN belongs to a different domain then we will certainly 26862306a36Sopenharmony_ci * not have MFN in our p2m table. Conversely, if the page is ours, 26962306a36Sopenharmony_ci * then we'll have p2m(m2p(MFN))==MFN. 27062306a36Sopenharmony_ci * If we detect a special mapping then it doesn't have a 'struct page'. 27162306a36Sopenharmony_ci * We force !pfn_valid() by returning an out-of-range pointer. 27262306a36Sopenharmony_ci * 27362306a36Sopenharmony_ci * NB. These checks require that, for any MFN that is not in our reservation, 27462306a36Sopenharmony_ci * there is no PFN such that p2m(PFN) == MFN. Otherwise we can get confused if 27562306a36Sopenharmony_ci * we are foreign-mapping the MFN, and the other domain as m2p(MFN) == PFN. 27662306a36Sopenharmony_ci * Yikes! Various places must poke in INVALID_P2M_ENTRY for safety. 27762306a36Sopenharmony_ci * 27862306a36Sopenharmony_ci * NB2. When deliberately mapping foreign pages into the p2m table, you *must* 27962306a36Sopenharmony_ci * use FOREIGN_FRAME(). This will cause pte_pfn() to choke on it, as we 28062306a36Sopenharmony_ci * require. In all the cases we care about, the FOREIGN_FRAME bit is 28162306a36Sopenharmony_ci * masked (e.g., pfn_to_mfn()) so behaviour there is correct. 28262306a36Sopenharmony_ci */ 28362306a36Sopenharmony_cistatic inline unsigned long bfn_to_local_pfn(unsigned long mfn) 28462306a36Sopenharmony_ci{ 28562306a36Sopenharmony_ci unsigned long pfn; 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_ci if (xen_feature(XENFEAT_auto_translated_physmap)) 28862306a36Sopenharmony_ci return mfn; 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ci pfn = mfn_to_pfn(mfn); 29162306a36Sopenharmony_ci if (__pfn_to_mfn(pfn) != mfn) 29262306a36Sopenharmony_ci return -1; /* force !pfn_valid() */ 29362306a36Sopenharmony_ci return pfn; 29462306a36Sopenharmony_ci} 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci/* VIRT <-> MACHINE conversion */ 29762306a36Sopenharmony_ci#define virt_to_machine(v) (phys_to_machine(XPADDR(__pa(v)))) 29862306a36Sopenharmony_cistatic inline unsigned long virt_to_pfn(const void *v) 29962306a36Sopenharmony_ci{ 30062306a36Sopenharmony_ci return PFN_DOWN(__pa(v)); 30162306a36Sopenharmony_ci} 30262306a36Sopenharmony_ci#define virt_to_mfn(v) (pfn_to_mfn(virt_to_pfn(v))) 30362306a36Sopenharmony_ci#define mfn_to_virt(m) (__va(mfn_to_pfn(m) << PAGE_SHIFT)) 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_ci/* VIRT <-> GUEST conversion */ 30662306a36Sopenharmony_ci#define virt_to_gfn(v) (pfn_to_gfn(virt_to_pfn(v))) 30762306a36Sopenharmony_ci#define gfn_to_virt(g) (__va(gfn_to_pfn(g) << PAGE_SHIFT)) 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_cistatic inline unsigned long pte_mfn(pte_t pte) 31062306a36Sopenharmony_ci{ 31162306a36Sopenharmony_ci return (pte.pte & XEN_PTE_MFN_MASK) >> PAGE_SHIFT; 31262306a36Sopenharmony_ci} 31362306a36Sopenharmony_ci 31462306a36Sopenharmony_cistatic inline pte_t mfn_pte(unsigned long page_nr, pgprot_t pgprot) 31562306a36Sopenharmony_ci{ 31662306a36Sopenharmony_ci pte_t pte; 31762306a36Sopenharmony_ci 31862306a36Sopenharmony_ci pte.pte = ((phys_addr_t)page_nr << PAGE_SHIFT) | 31962306a36Sopenharmony_ci massage_pgprot(pgprot); 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_ci return pte; 32262306a36Sopenharmony_ci} 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_cistatic inline pteval_t pte_val_ma(pte_t pte) 32562306a36Sopenharmony_ci{ 32662306a36Sopenharmony_ci return pte.pte; 32762306a36Sopenharmony_ci} 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_cistatic inline pte_t __pte_ma(pteval_t x) 33062306a36Sopenharmony_ci{ 33162306a36Sopenharmony_ci return (pte_t) { .pte = x }; 33262306a36Sopenharmony_ci} 33362306a36Sopenharmony_ci 33462306a36Sopenharmony_ci#define pmd_val_ma(v) ((v).pmd) 33562306a36Sopenharmony_ci#ifdef __PAGETABLE_PUD_FOLDED 33662306a36Sopenharmony_ci#define pud_val_ma(v) ((v).p4d.pgd.pgd) 33762306a36Sopenharmony_ci#else 33862306a36Sopenharmony_ci#define pud_val_ma(v) ((v).pud) 33962306a36Sopenharmony_ci#endif 34062306a36Sopenharmony_ci#define __pmd_ma(x) ((pmd_t) { (x) } ) 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ci#ifdef __PAGETABLE_P4D_FOLDED 34362306a36Sopenharmony_ci#define p4d_val_ma(x) ((x).pgd.pgd) 34462306a36Sopenharmony_ci#else 34562306a36Sopenharmony_ci#define p4d_val_ma(x) ((x).p4d) 34662306a36Sopenharmony_ci#endif 34762306a36Sopenharmony_ci 34862306a36Sopenharmony_cixmaddr_t arbitrary_virt_to_machine(void *address); 34962306a36Sopenharmony_ciunsigned long arbitrary_virt_to_mfn(void *vaddr); 35062306a36Sopenharmony_civoid make_lowmem_page_readonly(void *vaddr); 35162306a36Sopenharmony_civoid make_lowmem_page_readwrite(void *vaddr); 35262306a36Sopenharmony_ci 35362306a36Sopenharmony_cistatic inline bool xen_arch_need_swiotlb(struct device *dev, 35462306a36Sopenharmony_ci phys_addr_t phys, 35562306a36Sopenharmony_ci dma_addr_t dev_addr) 35662306a36Sopenharmony_ci{ 35762306a36Sopenharmony_ci return false; 35862306a36Sopenharmony_ci} 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci#endif /* _ASM_X86_XEN_PAGE_H */ 361