blob: 60e9c37fd79f7e4cceeed36559541403768911f2 [file] [log] [blame]
Juergen Gross901d2092018-08-28 09:40:15 +02001// SPDX-License-Identifier: GPL-2.0
2
Vitaly Kuznetsov7e0563d2017-04-04 14:48:17 +02003#include <linux/pfn.h>
4#include <asm/xen/page.h>
Jeremy Fitzhardinge3b827c12007-07-17 18:37:04 -07005#include <asm/xen/hypercall.h>
Jeremy Fitzhardingec0011db2010-02-04 14:46:34 -08006#include <xen/interface/memory.h>
Jeremy Fitzhardinge3b827c12007-07-17 18:37:04 -07007
Jeremy Fitzhardingef4f97b32007-07-17 18:37:05 -07008#include "multicalls.h"
Jeremy Fitzhardinge3b827c12007-07-17 18:37:04 -07009#include "mmu.h"
Jeremy Fitzhardinge994025c2008-08-20 17:02:19 -070010
Jeremy Fitzhardinge9976b392009-02-27 09:19:26 -080011unsigned long arbitrary_virt_to_mfn(void *vaddr)
12{
13 xmaddr_t maddr = arbitrary_virt_to_machine(vaddr);
14
15 return PFN_DOWN(maddr.maddr);
16}
17
Jeremy Fitzhardingece803e72008-07-08 15:06:55 -070018xmaddr_t arbitrary_virt_to_machine(void *vaddr)
Jeremy Fitzhardinge3b827c12007-07-17 18:37:04 -070019{
Jeremy Fitzhardingece803e72008-07-08 15:06:55 -070020 unsigned long address = (unsigned long)vaddr;
Harvey Harrisonda7bfc52008-02-09 23:24:08 +010021 unsigned int level;
Chris Lalancette9f32d212008-10-23 17:40:25 -070022 pte_t *pte;
23 unsigned offset;
Jeremy Fitzhardinge3b827c12007-07-17 18:37:04 -070024
Chris Lalancette9f32d212008-10-23 17:40:25 -070025 /*
26 * if the PFN is in the linear mapped vaddr range, we can just use
27 * the (quick) virt_to_machine() p2m lookup
28 */
29 if (virt_addr_valid(vaddr))
30 return virt_to_machine(vaddr);
31
32 /* otherwise we have to do a (slower) full page-table walk */
33
34 pte = lookup_address(address, &level);
Jeremy Fitzhardinge3b827c12007-07-17 18:37:04 -070035 BUG_ON(pte == NULL);
Chris Lalancette9f32d212008-10-23 17:40:25 -070036 offset = address & ~PAGE_MASK;
Jeremy Fitzhardingeebd879e2008-07-08 15:06:54 -070037 return XMADDR(((phys_addr_t)pte_mfn(*pte) << PAGE_SHIFT) + offset);
Jeremy Fitzhardinge3b827c12007-07-17 18:37:04 -070038}
Stephen Rothwellde23be52011-01-15 10:36:26 +110039EXPORT_SYMBOL_GPL(arbitrary_virt_to_machine);
Jeremy Fitzhardinge3b827c12007-07-17 18:37:04 -070040
Ian Campbell9a032e32012-10-17 13:37:49 -070041/* Returns: 0 success */
Julien Gralla13d7202015-08-07 17:34:41 +010042int xen_unmap_domain_gfn_range(struct vm_area_struct *vma,
Paul Durrantec4001c2017-11-03 17:04:11 +000043 int nr, struct page **pages)
Ian Campbell9a032e32012-10-17 13:37:49 -070044{
Paul Durrantec4001c2017-11-03 17:04:11 +000045 if (xen_feature(XENFEAT_auto_translated_physmap))
46 return xen_xlate_unmap_gfn_range(vma, nr, pages);
47
48 if (!pages)
Ian Campbell9a032e32012-10-17 13:37:49 -070049 return 0;
50
51 return -EINVAL;
52}
Julien Gralla13d7202015-08-07 17:34:41 +010053EXPORT_SYMBOL_GPL(xen_unmap_domain_gfn_range);