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

cacheflush.h (2913B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef _PARISC_CACHEFLUSH_H
      3#define _PARISC_CACHEFLUSH_H
      4
      5#include <linux/mm.h>
      6#include <linux/uaccess.h>
      7#include <asm/tlbflush.h>
      8
      9/* The usual comment is "Caches aren't brain-dead on the <architecture>".
     10 * Unfortunately, that doesn't apply to PA-RISC. */
     11
     12#include <linux/jump_label.h>
     13
     14DECLARE_STATIC_KEY_TRUE(parisc_has_cache);
     15DECLARE_STATIC_KEY_TRUE(parisc_has_dcache);
     16DECLARE_STATIC_KEY_TRUE(parisc_has_icache);
     17
     18#define flush_cache_dup_mm(mm) flush_cache_mm(mm)
     19
     20void flush_user_icache_range_asm(unsigned long, unsigned long);
     21void flush_kernel_icache_range_asm(unsigned long, unsigned long);
     22void flush_user_dcache_range_asm(unsigned long, unsigned long);
     23void flush_kernel_dcache_range_asm(unsigned long, unsigned long);
     24void purge_kernel_dcache_range_asm(unsigned long, unsigned long);
     25void flush_kernel_dcache_page_asm(void *);
     26void flush_kernel_icache_page(void *);
     27
     28/* Cache flush operations */
     29
     30void flush_cache_all_local(void);
     31void flush_cache_all(void);
     32void flush_cache_mm(struct mm_struct *mm);
     33
     34void flush_kernel_dcache_page_addr(void *addr);
     35
     36#define flush_kernel_dcache_range(start,size) \
     37	flush_kernel_dcache_range_asm((start), (start)+(size));
     38
     39#define ARCH_IMPLEMENTS_FLUSH_KERNEL_VMAP_RANGE 1
     40void flush_kernel_vmap_range(void *vaddr, int size);
     41void invalidate_kernel_vmap_range(void *vaddr, int size);
     42
     43#define flush_cache_vmap(start, end)		flush_cache_all()
     44#define flush_cache_vunmap(start, end)		flush_cache_all()
     45
     46#define ARCH_IMPLEMENTS_FLUSH_DCACHE_PAGE 1
     47void flush_dcache_page(struct page *page);
     48
     49#define flush_dcache_mmap_lock(mapping)		xa_lock_irq(&mapping->i_pages)
     50#define flush_dcache_mmap_unlock(mapping)	xa_unlock_irq(&mapping->i_pages)
     51
     52#define flush_icache_page(vma,page)	do { 		\
     53	flush_kernel_dcache_page_addr(page_address(page)); \
     54	flush_kernel_icache_page(page_address(page)); 	\
     55} while (0)
     56
     57#define flush_icache_range(s,e)		do { 		\
     58	flush_kernel_dcache_range_asm(s,e); 		\
     59	flush_kernel_icache_range_asm(s,e); 		\
     60} while (0)
     61
     62void copy_to_user_page(struct vm_area_struct *vma, struct page *page,
     63		unsigned long user_vaddr, void *dst, void *src, int len);
     64void copy_from_user_page(struct vm_area_struct *vma, struct page *page,
     65		unsigned long user_vaddr, void *dst, void *src, int len);
     66void flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr,
     67		unsigned long pfn);
     68void flush_cache_range(struct vm_area_struct *vma,
     69		unsigned long start, unsigned long end);
     70
     71/* defined in pacache.S exported in cache.c used by flush_anon_page */
     72void flush_dcache_page_asm(unsigned long phys_addr, unsigned long vaddr);
     73
     74#define ARCH_HAS_FLUSH_ANON_PAGE
     75void flush_anon_page(struct vm_area_struct *vma, struct page *page, unsigned long vmaddr);
     76
     77#define ARCH_HAS_FLUSH_ON_KUNMAP
     78static inline void kunmap_flush_on_unmap(void *addr)
     79{
     80	flush_kernel_dcache_page_addr(addr);
     81}
     82
     83#endif /* _PARISC_CACHEFLUSH_H */
     84