linux/arch/riscv/include/asm/pgalloc.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Copyright (C) 2009 Chen Liqin <liqin.chen@sunplusct.com>
   4 * Copyright (C) 2012 Regents of the University of California
   5 */
   6
   7#ifndef _ASM_RISCV_PGALLOC_H
   8#define _ASM_RISCV_PGALLOC_H
   9
  10#include <linux/mm.h>
  11#include <asm/tlb.h>
  12
  13#ifdef CONFIG_MMU
  14#include <asm-generic/pgalloc.h>
  15
  16static inline void pmd_populate_kernel(struct mm_struct *mm,
  17        pmd_t *pmd, pte_t *pte)
  18{
  19        unsigned long pfn = virt_to_pfn(pte);
  20
  21        set_pmd(pmd, __pmd((pfn << _PAGE_PFN_SHIFT) | _PAGE_TABLE));
  22}
  23
  24static inline void pmd_populate(struct mm_struct *mm,
  25        pmd_t *pmd, pgtable_t pte)
  26{
  27        unsigned long pfn = virt_to_pfn(page_address(pte));
  28
  29        set_pmd(pmd, __pmd((pfn << _PAGE_PFN_SHIFT) | _PAGE_TABLE));
  30}
  31
  32#ifndef __PAGETABLE_PMD_FOLDED
  33static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
  34{
  35        unsigned long pfn = virt_to_pfn(pmd);
  36
  37        set_pud(pud, __pud((pfn << _PAGE_PFN_SHIFT) | _PAGE_TABLE));
  38}
  39#endif /* __PAGETABLE_PMD_FOLDED */
  40
  41static inline pgd_t *pgd_alloc(struct mm_struct *mm)
  42{
  43        pgd_t *pgd;
  44
  45        pgd = (pgd_t *)__get_free_page(GFP_KERNEL);
  46        if (likely(pgd != NULL)) {
  47                memset(pgd, 0, USER_PTRS_PER_PGD * sizeof(pgd_t));
  48                /* Copy kernel mappings */
  49                memcpy(pgd + USER_PTRS_PER_PGD,
  50                        init_mm.pgd + USER_PTRS_PER_PGD,
  51                        (PTRS_PER_PGD - USER_PTRS_PER_PGD) * sizeof(pgd_t));
  52        }
  53        return pgd;
  54}
  55
  56#ifndef __PAGETABLE_PMD_FOLDED
  57
  58#define __pmd_free_tlb(tlb, pmd, addr)  pmd_free((tlb)->mm, pmd)
  59
  60#endif /* __PAGETABLE_PMD_FOLDED */
  61
  62#define __pte_free_tlb(tlb, pte, buf)   \
  63do {                                    \
  64        pgtable_pte_page_dtor(pte);     \
  65        tlb_remove_page((tlb), pte);    \
  66} while (0)
  67#endif /* CONFIG_MMU */
  68
  69#endif /* _ASM_RISCV_PGALLOC_H */
  70