cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

mmu.c (1264B)


      1// SPDX-License-Identifier: GPL-2.0
      2
      3#include <linux/pfn.h>
      4#include <asm/xen/page.h>
      5#include <asm/xen/hypercall.h>
      6#include <xen/interface/memory.h>
      7
      8#include "multicalls.h"
      9#include "mmu.h"
     10
     11unsigned 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
     18xmaddr_t arbitrary_virt_to_machine(void *vaddr)
     19{
     20	unsigned long address = (unsigned long)vaddr;
     21	unsigned int level;
     22	pte_t *pte;
     23	unsigned offset;
     24
     25	/*
     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);
     35	BUG_ON(pte == NULL);
     36	offset = address & ~PAGE_MASK;
     37	return XMADDR(((phys_addr_t)pte_mfn(*pte) << PAGE_SHIFT) + offset);
     38}
     39EXPORT_SYMBOL_GPL(arbitrary_virt_to_machine);
     40
     41/* Returns: 0 success */
     42int xen_unmap_domain_gfn_range(struct vm_area_struct *vma,
     43			       int nr, struct page **pages)
     44{
     45	if (xen_feature(XENFEAT_auto_translated_physmap))
     46		return xen_xlate_unmap_gfn_range(vma, nr, pages);
     47
     48	if (!pages)
     49		return 0;
     50
     51	return -EINVAL;
     52}
     53EXPORT_SYMBOL_GPL(xen_unmap_domain_gfn_range);