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

tlbflush.h (1770B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * Copyright (C) 2009 Chen Liqin <liqin.chen@sunplusct.com>
      4 * Copyright (C) 2012 Regents of the University of California
      5 */
      6
      7#ifndef _ASM_RISCV_TLBFLUSH_H
      8#define _ASM_RISCV_TLBFLUSH_H
      9
     10#include <linux/mm_types.h>
     11#include <asm/smp.h>
     12#include <asm/errata_list.h>
     13
     14#ifdef CONFIG_MMU
     15static inline void local_flush_tlb_all(void)
     16{
     17	__asm__ __volatile__ ("sfence.vma" : : : "memory");
     18}
     19
     20/* Flush one page from local TLB */
     21static inline void local_flush_tlb_page(unsigned long addr)
     22{
     23	ALT_FLUSH_TLB_PAGE(__asm__ __volatile__ ("sfence.vma %0" : : "r" (addr) : "memory"));
     24}
     25#else /* CONFIG_MMU */
     26#define local_flush_tlb_all()			do { } while (0)
     27#define local_flush_tlb_page(addr)		do { } while (0)
     28#endif /* CONFIG_MMU */
     29
     30#if defined(CONFIG_SMP) && defined(CONFIG_MMU)
     31void flush_tlb_all(void);
     32void flush_tlb_mm(struct mm_struct *mm);
     33void flush_tlb_page(struct vm_area_struct *vma, unsigned long addr);
     34void flush_tlb_range(struct vm_area_struct *vma, unsigned long start,
     35		     unsigned long end);
     36#ifdef CONFIG_TRANSPARENT_HUGEPAGE
     37#define __HAVE_ARCH_FLUSH_PMD_TLB_RANGE
     38void flush_pmd_tlb_range(struct vm_area_struct *vma, unsigned long start,
     39			unsigned long end);
     40#endif
     41#else /* CONFIG_SMP && CONFIG_MMU */
     42
     43#define flush_tlb_all() local_flush_tlb_all()
     44#define flush_tlb_page(vma, addr) local_flush_tlb_page(addr)
     45
     46static inline void flush_tlb_range(struct vm_area_struct *vma,
     47		unsigned long start, unsigned long end)
     48{
     49	local_flush_tlb_all();
     50}
     51
     52#define flush_tlb_mm(mm) flush_tlb_all()
     53#endif /* !CONFIG_SMP || !CONFIG_MMU */
     54
     55/* Flush a range of kernel pages */
     56static inline void flush_tlb_kernel_range(unsigned long start,
     57	unsigned long end)
     58{
     59	flush_tlb_all();
     60}
     61
     62#endif /* _ASM_RISCV_TLBFLUSH_H */