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

kmap.c (1520B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * arch/sh/mm/kmap.c
      4 *
      5 * Copyright (C) 1999, 2000, 2002  Niibe Yutaka
      6 * Copyright (C) 2002 - 2009  Paul Mundt
      7 */
      8#include <linux/mm.h>
      9#include <linux/init.h>
     10#include <linux/mutex.h>
     11#include <linux/fs.h>
     12#include <linux/highmem.h>
     13#include <linux/module.h>
     14#include <asm/mmu_context.h>
     15#include <asm/cacheflush.h>
     16
     17static pte_t *kmap_coherent_pte;
     18
     19void __init kmap_coherent_init(void)
     20{
     21	unsigned long vaddr;
     22
     23	/* cache the first coherent kmap pte */
     24	vaddr = __fix_to_virt(FIX_CMAP_BEGIN);
     25	kmap_coherent_pte = virt_to_kpte(vaddr);
     26}
     27
     28void *kmap_coherent(struct page *page, unsigned long addr)
     29{
     30	enum fixed_addresses idx;
     31	unsigned long vaddr;
     32
     33	BUG_ON(!test_bit(PG_dcache_clean, &page->flags));
     34
     35	preempt_disable();
     36	pagefault_disable();
     37
     38	idx = FIX_CMAP_END -
     39		(((addr >> PAGE_SHIFT) & (FIX_N_COLOURS - 1)) +
     40		 (FIX_N_COLOURS * smp_processor_id()));
     41
     42	vaddr = __fix_to_virt(idx);
     43
     44	BUG_ON(!pte_none(*(kmap_coherent_pte - idx)));
     45	set_pte(kmap_coherent_pte - idx, mk_pte(page, PAGE_KERNEL));
     46
     47	return (void *)vaddr;
     48}
     49
     50void kunmap_coherent(void *kvaddr)
     51{
     52	if (kvaddr >= (void *)FIXADDR_START) {
     53		unsigned long vaddr = (unsigned long)kvaddr & PAGE_MASK;
     54		enum fixed_addresses idx = __virt_to_fix(vaddr);
     55
     56		/* XXX.. Kill this later, here for sanity at the moment.. */
     57		__flush_purge_region((void *)vaddr, PAGE_SIZE);
     58
     59		pte_clear(&init_mm, vaddr, kmap_coherent_pte - idx);
     60		local_flush_tlb_one(get_asid(), vaddr);
     61	}
     62
     63	pagefault_enable();
     64	preempt_enable();
     65}