1*901d209aSJuergen Gross // SPDX-License-Identifier: GPL-2.0 2*901d209aSJuergen Gross 37e0563deSVitaly Kuznetsov #include <linux/pfn.h> 47e0563deSVitaly Kuznetsov #include <asm/xen/page.h> 59702785aSThomas Gleixner #include <asm/xen/hypercall.h> 6c0011dbfSJeremy Fitzhardinge #include <xen/interface/memory.h> 79702785aSThomas Gleixner 89702785aSThomas Gleixner #include "multicalls.h" 99702785aSThomas Gleixner #include "mmu.h" 10994025caSJeremy Fitzhardinge arbitrary_virt_to_mfn(void * vaddr)119976b39bSJeremy Fitzhardingeunsigned long arbitrary_virt_to_mfn(void *vaddr) 129976b39bSJeremy Fitzhardinge { 139976b39bSJeremy Fitzhardinge xmaddr_t maddr = arbitrary_virt_to_machine(vaddr); 149976b39bSJeremy Fitzhardinge 159976b39bSJeremy Fitzhardinge return PFN_DOWN(maddr.maddr); 169976b39bSJeremy Fitzhardinge } 179976b39bSJeremy Fitzhardinge arbitrary_virt_to_machine(void * vaddr)18ce803e70SJeremy Fitzhardingexmaddr_t arbitrary_virt_to_machine(void *vaddr) 199702785aSThomas Gleixner { 20ce803e70SJeremy Fitzhardinge unsigned long address = (unsigned long)vaddr; 21da7bfc50SHarvey Harrison unsigned int level; 229f32d21cSChris Lalancette pte_t *pte; 239f32d21cSChris Lalancette unsigned offset; 249702785aSThomas Gleixner 259f32d21cSChris Lalancette /* 269f32d21cSChris Lalancette * if the PFN is in the linear mapped vaddr range, we can just use 279f32d21cSChris Lalancette * the (quick) virt_to_machine() p2m lookup 289f32d21cSChris Lalancette */ 299f32d21cSChris Lalancette if (virt_addr_valid(vaddr)) 309f32d21cSChris Lalancette return virt_to_machine(vaddr); 319f32d21cSChris Lalancette 329f32d21cSChris Lalancette /* otherwise we have to do a (slower) full page-table walk */ 339f32d21cSChris Lalancette 349f32d21cSChris Lalancette pte = lookup_address(address, &level); 359702785aSThomas Gleixner BUG_ON(pte == NULL); 369f32d21cSChris Lalancette offset = address & ~PAGE_MASK; 37ebd879e3SJeremy Fitzhardinge return XMADDR(((phys_addr_t)pte_mfn(*pte) << PAGE_SHIFT) + offset); 389702785aSThomas Gleixner } 39de23be5fSStephen Rothwell EXPORT_SYMBOL_GPL(arbitrary_virt_to_machine); 409702785aSThomas Gleixner 419a032e39SIan Campbell /* Returns: 0 success */ xen_unmap_domain_gfn_range(struct vm_area_struct * vma,int nr,struct page ** pages)42a13d7201SJulien Grallint xen_unmap_domain_gfn_range(struct vm_area_struct *vma, 43ec4001c3SPaul Durrant int nr, struct page **pages) 449a032e39SIan Campbell { 45ec4001c3SPaul Durrant if (xen_feature(XENFEAT_auto_translated_physmap)) 46ec4001c3SPaul Durrant return xen_xlate_unmap_gfn_range(vma, nr, pages); 47ec4001c3SPaul Durrant 48ec4001c3SPaul Durrant if (!pages) 499a032e39SIan Campbell return 0; 509a032e39SIan Campbell 519a032e39SIan Campbell return -EINVAL; 529a032e39SIan Campbell } 53a13d7201SJulien Grall EXPORT_SYMBOL_GPL(xen_unmap_domain_gfn_range); 54