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 (2571B)


      1/*
      2 * This file is subject to the terms and conditions of the GNU General Public
      3 * License.  See the file "COPYING" in the main directory of this archive
      4 * for more details.
      5 *
      6 * Copyright (C) 1994 - 2001, 2003 by Ralf Baechle
      7 * Copyright (C) 1999, 2000, 2001 Silicon Graphics, Inc.
      8 */
      9#ifndef _ASM_PGALLOC_H
     10#define _ASM_PGALLOC_H
     11
     12#include <linux/highmem.h>
     13#include <linux/mm.h>
     14#include <linux/sched.h>
     15
     16#define __HAVE_ARCH_PMD_ALLOC_ONE
     17#define __HAVE_ARCH_PUD_ALLOC_ONE
     18#define __HAVE_ARCH_PGD_FREE
     19#include <asm-generic/pgalloc.h>
     20
     21static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd,
     22	pte_t *pte)
     23{
     24	set_pmd(pmd, __pmd((unsigned long)pte));
     25}
     26
     27static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
     28	pgtable_t pte)
     29{
     30	set_pmd(pmd, __pmd((unsigned long)page_address(pte)));
     31}
     32
     33/*
     34 * Initialize a new pmd table with invalid pointers.
     35 */
     36extern void pmd_init(unsigned long page, unsigned long pagetable);
     37
     38#ifndef __PAGETABLE_PMD_FOLDED
     39
     40static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
     41{
     42	set_pud(pud, __pud((unsigned long)pmd));
     43}
     44#endif
     45
     46/*
     47 * Initialize a new pgd / pmd table with invalid pointers.
     48 */
     49extern void pgd_init(unsigned long page);
     50extern pgd_t *pgd_alloc(struct mm_struct *mm);
     51
     52static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
     53{
     54	free_pages((unsigned long)pgd, PGD_ORDER);
     55}
     56
     57#define __pte_free_tlb(tlb,pte,address)			\
     58do {							\
     59	pgtable_pte_page_dtor(pte);			\
     60	tlb_remove_page((tlb), pte);			\
     61} while (0)
     62
     63#ifndef __PAGETABLE_PMD_FOLDED
     64
     65static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
     66{
     67	pmd_t *pmd;
     68	struct page *pg;
     69
     70	pg = alloc_pages(GFP_KERNEL_ACCOUNT, PMD_ORDER);
     71	if (!pg)
     72		return NULL;
     73
     74	if (!pgtable_pmd_page_ctor(pg)) {
     75		__free_pages(pg, PMD_ORDER);
     76		return NULL;
     77	}
     78
     79	pmd = (pmd_t *)page_address(pg);
     80	pmd_init((unsigned long)pmd, (unsigned long)invalid_pte_table);
     81	return pmd;
     82}
     83
     84#define __pmd_free_tlb(tlb, x, addr)	pmd_free((tlb)->mm, x)
     85
     86#endif
     87
     88#ifndef __PAGETABLE_PUD_FOLDED
     89
     90static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long address)
     91{
     92	pud_t *pud;
     93
     94	pud = (pud_t *) __get_free_pages(GFP_KERNEL, PUD_ORDER);
     95	if (pud)
     96		pud_init((unsigned long)pud, (unsigned long)invalid_pmd_table);
     97	return pud;
     98}
     99
    100static inline void p4d_populate(struct mm_struct *mm, p4d_t *p4d, pud_t *pud)
    101{
    102	set_p4d(p4d, __p4d((unsigned long)pud));
    103}
    104
    105#define __pud_free_tlb(tlb, x, addr)	pud_free((tlb)->mm, x)
    106
    107#endif /* __PAGETABLE_PUD_FOLDED */
    108
    109extern void pagetable_init(void);
    110
    111#endif /* _ASM_PGALLOC_H */