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-3level.h (2645B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * Copyright 2003 PathScale Inc
      4 * Derived from include/asm-i386/pgtable.h
      5 */
      6
      7#ifndef __UM_PGTABLE_3LEVEL_H
      8#define __UM_PGTABLE_3LEVEL_H
      9
     10#include <asm-generic/pgtable-nopud.h>
     11
     12/* PGDIR_SHIFT determines what a third-level page table entry can map */
     13
     14#ifdef CONFIG_64BIT
     15#define PGDIR_SHIFT	30
     16#else
     17#define PGDIR_SHIFT	31
     18#endif
     19#define PGDIR_SIZE	(1UL << PGDIR_SHIFT)
     20#define PGDIR_MASK	(~(PGDIR_SIZE-1))
     21
     22/* PMD_SHIFT determines the size of the area a second-level page table can
     23 * map
     24 */
     25
     26#define PMD_SHIFT	21
     27#define PMD_SIZE	(1UL << PMD_SHIFT)
     28#define PMD_MASK	(~(PMD_SIZE-1))
     29
     30/*
     31 * entries per page directory level
     32 */
     33
     34#define PTRS_PER_PTE 512
     35#ifdef CONFIG_64BIT
     36#define PTRS_PER_PMD 512
     37#define PTRS_PER_PGD 512
     38#else
     39#define PTRS_PER_PMD 1024
     40#define PTRS_PER_PGD 1024
     41#endif
     42
     43#define USER_PTRS_PER_PGD ((TASK_SIZE + (PGDIR_SIZE - 1)) / PGDIR_SIZE)
     44
     45#define pte_ERROR(e) \
     46        printk("%s:%d: bad pte %p(%016lx).\n", __FILE__, __LINE__, &(e), \
     47	       pte_val(e))
     48#define pmd_ERROR(e) \
     49        printk("%s:%d: bad pmd %p(%016lx).\n", __FILE__, __LINE__, &(e), \
     50	       pmd_val(e))
     51#define pgd_ERROR(e) \
     52        printk("%s:%d: bad pgd %p(%016lx).\n", __FILE__, __LINE__, &(e), \
     53	       pgd_val(e))
     54
     55#define pud_none(x)	(!(pud_val(x) & ~_PAGE_NEWPAGE))
     56#define	pud_bad(x)	((pud_val(x) & (~PAGE_MASK & ~_PAGE_USER)) != _KERNPG_TABLE)
     57#define pud_present(x)	(pud_val(x) & _PAGE_PRESENT)
     58#define pud_populate(mm, pud, pmd) \
     59	set_pud(pud, __pud(_PAGE_TABLE + __pa(pmd)))
     60
     61#ifdef CONFIG_64BIT
     62#define set_pud(pudptr, pudval) set_64bit((u64 *) (pudptr), pud_val(pudval))
     63#else
     64#define set_pud(pudptr, pudval) (*(pudptr) = (pudval))
     65#endif
     66
     67static inline int pgd_newpage(pgd_t pgd)
     68{
     69	return(pgd_val(pgd) & _PAGE_NEWPAGE);
     70}
     71
     72static inline void pgd_mkuptodate(pgd_t pgd) { pgd_val(pgd) &= ~_PAGE_NEWPAGE; }
     73
     74#ifdef CONFIG_64BIT
     75#define set_pmd(pmdptr, pmdval) set_64bit((u64 *) (pmdptr), pmd_val(pmdval))
     76#else
     77#define set_pmd(pmdptr, pmdval) (*(pmdptr) = (pmdval))
     78#endif
     79
     80static inline void pud_clear (pud_t *pud)
     81{
     82	set_pud(pud, __pud(_PAGE_NEWPAGE));
     83}
     84
     85#define pud_page(pud) phys_to_page(pud_val(pud) & PAGE_MASK)
     86#define pud_pgtable(pud) ((pmd_t *) __va(pud_val(pud) & PAGE_MASK))
     87
     88static inline unsigned long pte_pfn(pte_t pte)
     89{
     90	return phys_to_pfn(pte_val(pte));
     91}
     92
     93static inline pte_t pfn_pte(unsigned long page_nr, pgprot_t pgprot)
     94{
     95	pte_t pte;
     96	phys_t phys = pfn_to_phys(page_nr);
     97
     98	pte_set_val(pte, phys, pgprot);
     99	return pte;
    100}
    101
    102static inline pmd_t pfn_pmd(unsigned long page_nr, pgprot_t pgprot)
    103{
    104	return __pmd((page_nr << PAGE_SHIFT) | pgprot_val(pgprot));
    105}
    106
    107#endif
    108