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

dvma.c (1282B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * linux/arch/m68k/sun3/dvma.c
      4 *
      5 * Written by Sam Creasey
      6 *
      7 * Sun3 IOMMU routines used for dvma accesses.
      8 *
      9 */
     10
     11#include <linux/init.h>
     12#include <linux/kernel.h>
     13#include <linux/mm.h>
     14#include <linux/memblock.h>
     15#include <linux/list.h>
     16#include <asm/page.h>
     17#include <asm/sun3mmu.h>
     18#include <asm/dvma.h>
     19
     20
     21static unsigned long ptelist[120];
     22
     23static unsigned long dvma_page(unsigned long kaddr, unsigned long vaddr)
     24{
     25	unsigned long pte;
     26	unsigned long j;
     27	pte_t ptep;
     28
     29	j = *(volatile unsigned long *)kaddr;
     30	*(volatile unsigned long *)kaddr = j;
     31
     32	ptep = pfn_pte(virt_to_pfn(kaddr), PAGE_KERNEL);
     33	pte = pte_val(ptep);
     34//	pr_info("dvma_remap: addr %lx -> %lx pte %08lx\n", kaddr, vaddr, pte);
     35	if(ptelist[(vaddr & 0xff000) >> PAGE_SHIFT] != pte) {
     36		sun3_put_pte(vaddr, pte);
     37		ptelist[(vaddr & 0xff000) >> PAGE_SHIFT] = pte;
     38	}
     39
     40	return (vaddr + (kaddr & ~PAGE_MASK));
     41
     42}
     43
     44int dvma_map_iommu(unsigned long kaddr, unsigned long baddr,
     45			      int len)
     46{
     47
     48	unsigned long end;
     49	unsigned long vaddr;
     50
     51	vaddr = dvma_btov(baddr);
     52
     53	end = vaddr + len;
     54
     55	while(vaddr < end) {
     56		dvma_page(kaddr, vaddr);
     57		kaddr += PAGE_SIZE;
     58		vaddr += PAGE_SIZE;
     59	}
     60
     61	return 0;
     62
     63}
     64
     65void __init sun3_dvma_init(void)
     66{
     67	memset(ptelist, 0, sizeof(ptelist));
     68}