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

fixmap.c (988B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * fixmaps for parisc
      4 *
      5 * Copyright (c) 2019 Sven Schnelle <svens@stackframe.org>
      6 */
      7
      8#include <linux/kprobes.h>
      9#include <linux/mm.h>
     10#include <asm/cacheflush.h>
     11#include <asm/fixmap.h>
     12
     13void notrace set_fixmap(enum fixed_addresses idx, phys_addr_t phys)
     14{
     15	unsigned long vaddr = __fix_to_virt(idx);
     16	pgd_t *pgd = pgd_offset_k(vaddr);
     17	p4d_t *p4d = p4d_offset(pgd, vaddr);
     18	pud_t *pud = pud_offset(p4d, vaddr);
     19	pmd_t *pmd = pmd_offset(pud, vaddr);
     20	pte_t *pte;
     21
     22	if (pmd_none(*pmd))
     23		pte = pte_alloc_kernel(pmd, vaddr);
     24
     25	pte = pte_offset_kernel(pmd, vaddr);
     26	set_pte_at(&init_mm, vaddr, pte, __mk_pte(phys, PAGE_KERNEL_RWX));
     27	flush_tlb_kernel_range(vaddr, vaddr + PAGE_SIZE);
     28}
     29
     30void notrace clear_fixmap(enum fixed_addresses idx)
     31{
     32	unsigned long vaddr = __fix_to_virt(idx);
     33	pte_t *pte = virt_to_kpte(vaddr);
     34
     35	if (WARN_ON(pte_none(*pte)))
     36		return;
     37
     38	pte_clear(&init_mm, vaddr, pte);
     39
     40	flush_tlb_kernel_range(vaddr, vaddr + PAGE_SIZE);
     41}