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

outercache.h (3268B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * arch/arm/include/asm/outercache.h
      4 *
      5 * Copyright (C) 2010 ARM Ltd.
      6 * Written by Catalin Marinas <catalin.marinas@arm.com>
      7 */
      8
      9#ifndef __ASM_OUTERCACHE_H
     10#define __ASM_OUTERCACHE_H
     11
     12#include <linux/types.h>
     13
     14struct l2x0_regs;
     15
     16struct outer_cache_fns {
     17	void (*inv_range)(unsigned long, unsigned long);
     18	void (*clean_range)(unsigned long, unsigned long);
     19	void (*flush_range)(unsigned long, unsigned long);
     20	void (*flush_all)(void);
     21	void (*disable)(void);
     22#ifdef CONFIG_OUTER_CACHE_SYNC
     23	void (*sync)(void);
     24#endif
     25	void (*resume)(void);
     26
     27	/* This is an ARM L2C thing */
     28	void (*write_sec)(unsigned long, unsigned);
     29	void (*configure)(const struct l2x0_regs *);
     30};
     31
     32extern struct outer_cache_fns outer_cache;
     33
     34#ifdef CONFIG_OUTER_CACHE
     35/**
     36 * outer_inv_range - invalidate range of outer cache lines
     37 * @start: starting physical address, inclusive
     38 * @end: end physical address, exclusive
     39 */
     40static inline void outer_inv_range(phys_addr_t start, phys_addr_t end)
     41{
     42	if (outer_cache.inv_range)
     43		outer_cache.inv_range(start, end);
     44}
     45
     46/**
     47 * outer_clean_range - clean dirty outer cache lines
     48 * @start: starting physical address, inclusive
     49 * @end: end physical address, exclusive
     50 */
     51static inline void outer_clean_range(phys_addr_t start, phys_addr_t end)
     52{
     53	if (outer_cache.clean_range)
     54		outer_cache.clean_range(start, end);
     55}
     56
     57/**
     58 * outer_flush_range - clean and invalidate outer cache lines
     59 * @start: starting physical address, inclusive
     60 * @end: end physical address, exclusive
     61 */
     62static inline void outer_flush_range(phys_addr_t start, phys_addr_t end)
     63{
     64	if (outer_cache.flush_range)
     65		outer_cache.flush_range(start, end);
     66}
     67
     68/**
     69 * outer_flush_all - clean and invalidate all cache lines in the outer cache
     70 *
     71 * Note: depending on implementation, this may not be atomic - it must
     72 * only be called with interrupts disabled and no other active outer
     73 * cache masters.
     74 *
     75 * It is intended that this function is only used by implementations
     76 * needing to override the outer_cache.disable() method due to security.
     77 * (Some implementations perform this as a clean followed by an invalidate.)
     78 */
     79static inline void outer_flush_all(void)
     80{
     81	if (outer_cache.flush_all)
     82		outer_cache.flush_all();
     83}
     84
     85/**
     86 * outer_disable - clean, invalidate and disable the outer cache
     87 *
     88 * Disable the outer cache, ensuring that any data contained in the outer
     89 * cache is pushed out to lower levels of system memory.  The note and
     90 * conditions above concerning outer_flush_all() applies here.
     91 */
     92extern void outer_disable(void);
     93
     94/**
     95 * outer_resume - restore the cache configuration and re-enable outer cache
     96 *
     97 * Restore any configuration that the cache had when previously enabled,
     98 * and re-enable the outer cache.
     99 */
    100static inline void outer_resume(void)
    101{
    102	if (outer_cache.resume)
    103		outer_cache.resume();
    104}
    105
    106#else
    107
    108static inline void outer_inv_range(phys_addr_t start, phys_addr_t end)
    109{ }
    110static inline void outer_clean_range(phys_addr_t start, phys_addr_t end)
    111{ }
    112static inline void outer_flush_range(phys_addr_t start, phys_addr_t end)
    113{ }
    114static inline void outer_flush_all(void) { }
    115static inline void outer_disable(void) { }
    116static inline void outer_resume(void) { }
    117
    118#endif
    119
    120#endif	/* __ASM_OUTERCACHE_H */