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


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef _ASM_PGALLOC_H
      3#define _ASM_PGALLOC_H
      4
      5#include <linux/gfp.h>
      6#include <linux/mm.h>
      7#include <linux/threads.h>
      8#include <asm/processor.h>
      9#include <asm/fixmap.h>
     10
     11#include <asm/cache.h>
     12
     13#define __HAVE_ARCH_PMD_ALLOC_ONE
     14#define __HAVE_ARCH_PMD_FREE
     15#define __HAVE_ARCH_PGD_FREE
     16#include <asm-generic/pgalloc.h>
     17
     18/* Allocate the top level pgd (page directory) */
     19static inline pgd_t *pgd_alloc(struct mm_struct *mm)
     20{
     21	pgd_t *pgd;
     22
     23	pgd = (pgd_t *) __get_free_pages(GFP_KERNEL, PGD_ORDER);
     24	if (unlikely(pgd == NULL))
     25		return NULL;
     26
     27	memset(pgd, 0, PAGE_SIZE << PGD_ORDER);
     28
     29	return pgd;
     30}
     31
     32static inline void pgd_free(struct mm_struct *mm, pgd_t *pgd)
     33{
     34	free_pages((unsigned long)pgd, PGD_ORDER);
     35}
     36
     37#if CONFIG_PGTABLE_LEVELS == 3
     38
     39/* Three Level Page Table Support for pmd's */
     40
     41static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
     42{
     43	set_pud(pud, __pud((PxD_FLAG_PRESENT | PxD_FLAG_VALID) +
     44			(__u32)(__pa((unsigned long)pmd) >> PxD_VALUE_SHIFT)));
     45}
     46
     47static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long address)
     48{
     49	pmd_t *pmd;
     50
     51	pmd = (pmd_t *)__get_free_pages(GFP_PGTABLE_KERNEL, PMD_TABLE_ORDER);
     52	if (likely(pmd))
     53		memset ((void *)pmd, 0, PAGE_SIZE << PMD_TABLE_ORDER);
     54	return pmd;
     55}
     56
     57static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd)
     58{
     59	free_pages((unsigned long)pmd, PMD_TABLE_ORDER);
     60}
     61#endif
     62
     63static inline void
     64pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, pte_t *pte)
     65{
     66	set_pmd(pmd, __pmd((PxD_FLAG_PRESENT | PxD_FLAG_VALID)
     67		+ (__u32)(__pa((unsigned long)pte) >> PxD_VALUE_SHIFT)));
     68}
     69
     70#define pmd_populate(mm, pmd, pte_page) \
     71	pmd_populate_kernel(mm, pmd, page_address(pte_page))
     72
     73#endif