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

pgtable-types.h (2250B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef _ASM_POWERPC_PGTABLE_TYPES_H
      3#define _ASM_POWERPC_PGTABLE_TYPES_H
      4
      5#if defined(__CHECKER__) || !defined(CONFIG_PPC32)
      6#define STRICT_MM_TYPECHECKS
      7#endif
      8
      9/* PTE level */
     10#if defined(CONFIG_PPC_8xx) && defined(CONFIG_PPC_16K_PAGES)
     11typedef struct { pte_basic_t pte, pte1, pte2, pte3; } pte_t;
     12#elif defined(STRICT_MM_TYPECHECKS)
     13typedef struct { pte_basic_t pte; } pte_t;
     14#else
     15typedef pte_basic_t pte_t;
     16#endif
     17
     18#if defined(STRICT_MM_TYPECHECKS) || \
     19    (defined(CONFIG_PPC_8xx) && defined(CONFIG_PPC_16K_PAGES))
     20#define __pte(x)	((pte_t) { (x) })
     21static inline pte_basic_t pte_val(pte_t x)
     22{
     23	return x.pte;
     24}
     25#else
     26#define __pte(x)	((pte_t)(x))
     27static inline pte_basic_t pte_val(pte_t x)
     28{
     29	return x;
     30}
     31#endif
     32
     33/* PMD level */
     34#ifdef CONFIG_PPC64
     35typedef struct { unsigned long pmd; } pmd_t;
     36#define __pmd(x)	((pmd_t) { (x) })
     37static inline unsigned long pmd_val(pmd_t x)
     38{
     39	return x.pmd;
     40}
     41
     42/* 64 bit always use 4 level table. */
     43typedef struct { unsigned long pud; } pud_t;
     44#define __pud(x)	((pud_t) { (x) })
     45static inline unsigned long pud_val(pud_t x)
     46{
     47	return x.pud;
     48}
     49#endif /* CONFIG_PPC64 */
     50
     51/* PGD level */
     52typedef struct { unsigned long pgd; } pgd_t;
     53#define __pgd(x)	((pgd_t) { (x) })
     54static inline unsigned long pgd_val(pgd_t x)
     55{
     56	return x.pgd;
     57}
     58
     59/* Page protection bits */
     60typedef struct { unsigned long pgprot; } pgprot_t;
     61#define pgprot_val(x)	((x).pgprot)
     62#define __pgprot(x)	((pgprot_t) { (x) })
     63
     64/*
     65 * With hash config 64k pages additionally define a bigger "real PTE" type that
     66 * gathers the "second half" part of the PTE for pseudo 64k pages
     67 */
     68#ifdef CONFIG_PPC_64K_PAGES
     69typedef struct { pte_t pte; unsigned long hidx; } real_pte_t;
     70#else
     71typedef struct { pte_t pte; } real_pte_t;
     72#endif
     73
     74#ifdef CONFIG_PPC_BOOK3S_64
     75#include <asm/cmpxchg.h>
     76
     77static inline bool pte_xchg(pte_t *ptep, pte_t old, pte_t new)
     78{
     79	unsigned long *p = (unsigned long *)ptep;
     80
     81	/* See comment in switch_mm_irqs_off() */
     82	return pte_val(old) == __cmpxchg_u64(p, pte_val(old), pte_val(new));
     83}
     84#endif
     85
     86typedef struct { unsigned long pd; } hugepd_t;
     87#define __hugepd(x) ((hugepd_t) { (x) })
     88static inline unsigned long hpd_val(hugepd_t x)
     89{
     90	return x.pd;
     91}
     92
     93#endif /* _ASM_POWERPC_PGTABLE_TYPES_H */