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

pgalloc.h (2269B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * Based on arch/arm/include/asm/pgalloc.h
      4 *
      5 * Copyright (C) 2000-2001 Russell King
      6 * Copyright (C) 2012 ARM Ltd.
      7 */
      8#ifndef __ASM_PGALLOC_H
      9#define __ASM_PGALLOC_H
     10
     11#include <asm/pgtable-hwdef.h>
     12#include <asm/processor.h>
     13#include <asm/cacheflush.h>
     14#include <asm/tlbflush.h>
     15
     16#define __HAVE_ARCH_PGD_FREE
     17#include <asm-generic/pgalloc.h>
     18
     19#define PGD_SIZE	(PTRS_PER_PGD * sizeof(pgd_t))
     20
     21#if CONFIG_PGTABLE_LEVELS > 2
     22
     23static inline void __pud_populate(pud_t *pudp, phys_addr_t pmdp, pudval_t prot)
     24{
     25	set_pud(pudp, __pud(__phys_to_pud_val(pmdp) | prot));
     26}
     27
     28static inline void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmdp)
     29{
     30	pudval_t pudval = PUD_TYPE_TABLE;
     31
     32	pudval |= (mm == &init_mm) ? PUD_TABLE_UXN : PUD_TABLE_PXN;
     33	__pud_populate(pudp, __pa(pmdp), pudval);
     34}
     35#else
     36static inline void __pud_populate(pud_t *pudp, phys_addr_t pmdp, pudval_t prot)
     37{
     38	BUILD_BUG();
     39}
     40#endif	/* CONFIG_PGTABLE_LEVELS > 2 */
     41
     42#if CONFIG_PGTABLE_LEVELS > 3
     43
     44static inline void __p4d_populate(p4d_t *p4dp, phys_addr_t pudp, p4dval_t prot)
     45{
     46	set_p4d(p4dp, __p4d(__phys_to_p4d_val(pudp) | prot));
     47}
     48
     49static inline void p4d_populate(struct mm_struct *mm, p4d_t *p4dp, pud_t *pudp)
     50{
     51	p4dval_t p4dval = P4D_TYPE_TABLE;
     52
     53	p4dval |= (mm == &init_mm) ? P4D_TABLE_UXN : P4D_TABLE_PXN;
     54	__p4d_populate(p4dp, __pa(pudp), p4dval);
     55}
     56#else
     57static inline void __p4d_populate(p4d_t *p4dp, phys_addr_t pudp, p4dval_t prot)
     58{
     59	BUILD_BUG();
     60}
     61#endif	/* CONFIG_PGTABLE_LEVELS > 3 */
     62
     63extern pgd_t *pgd_alloc(struct mm_struct *mm);
     64extern void pgd_free(struct mm_struct *mm, pgd_t *pgdp);
     65
     66static inline void __pmd_populate(pmd_t *pmdp, phys_addr_t ptep,
     67				  pmdval_t prot)
     68{
     69	set_pmd(pmdp, __pmd(__phys_to_pmd_val(ptep) | prot));
     70}
     71
     72/*
     73 * Populate the pmdp entry with a pointer to the pte.  This pmd is part
     74 * of the mm address space.
     75 */
     76static inline void
     77pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp, pte_t *ptep)
     78{
     79	VM_BUG_ON(mm && mm != &init_mm);
     80	__pmd_populate(pmdp, __pa(ptep), PMD_TYPE_TABLE | PMD_TABLE_UXN);
     81}
     82
     83static inline void
     84pmd_populate(struct mm_struct *mm, pmd_t *pmdp, pgtable_t ptep)
     85{
     86	VM_BUG_ON(mm == &init_mm);
     87	__pmd_populate(pmdp, page_to_phys(ptep), PMD_TYPE_TABLE | PMD_TABLE_PXN);
     88}
     89
     90#endif