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


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2/*
      3 * OpenRISC Linux
      4 *
      5 * Linux architectural port borrowing liberally from similar works of
      6 * others.  All original copyrights apply as per the original source
      7 * declaration.
      8 *
      9 * OpenRISC implementation:
     10 * Copyright (C) 2003 Matjaz Breskvar <phoenix@bsemi.com>
     11 * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se>
     12 * et al.
     13 */
     14
     15#ifndef __ASM_OPENRISC_PGALLOC_H
     16#define __ASM_OPENRISC_PGALLOC_H
     17
     18#include <asm/page.h>
     19#include <linux/threads.h>
     20#include <linux/mm.h>
     21#include <linux/memblock.h>
     22
     23#define __HAVE_ARCH_PTE_ALLOC_ONE_KERNEL
     24#include <asm-generic/pgalloc.h>
     25
     26extern int mem_init_done;
     27
     28#define pmd_populate_kernel(mm, pmd, pte) \
     29	set_pmd(pmd, __pmd(_KERNPG_TABLE + __pa(pte)))
     30
     31static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd,
     32				struct page *pte)
     33{
     34	set_pmd(pmd, __pmd(_KERNPG_TABLE +
     35		     ((unsigned long)page_to_pfn(pte) <<
     36		     (unsigned long) PAGE_SHIFT)));
     37}
     38
     39/*
     40 * Allocate and free page tables.
     41 */
     42static inline pgd_t *pgd_alloc(struct mm_struct *mm)
     43{
     44	pgd_t *ret = (pgd_t *)__get_free_page(GFP_KERNEL);
     45
     46	if (ret) {
     47		memset(ret, 0, USER_PTRS_PER_PGD * sizeof(pgd_t));
     48		memcpy(ret + USER_PTRS_PER_PGD,
     49		       swapper_pg_dir + USER_PTRS_PER_PGD,
     50		       (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
     51
     52	}
     53	return ret;
     54}
     55
     56#if 0
     57/* FIXME: This seems to be the preferred style, but we are using
     58 * current_pgd (from mm->pgd) to load kernel pages so we need it
     59 * initialized.  This needs to be looked into.
     60 */
     61extern inline pgd_t *pgd_alloc(struct mm_struct *mm)
     62{
     63	return (pgd_t *)get_zeroed_page(GFP_KERNEL);
     64}
     65#endif
     66
     67extern pte_t *pte_alloc_one_kernel(struct mm_struct *mm);
     68
     69#define __pte_free_tlb(tlb, pte, addr)	\
     70do {					\
     71	pgtable_pte_page_dtor(pte);	\
     72	tlb_remove_page((tlb), (pte));	\
     73} while (0)
     74
     75#endif