root/arch/arm64/include/asm/pgalloc.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. pmd_alloc_one
  2. pmd_free
  3. __pud_populate
  4. pud_populate
  5. __pud_populate
  6. pud_alloc_one
  7. pud_free
  8. __pgd_populate
  9. pgd_populate
  10. __pgd_populate
  11. __pmd_populate
  12. pmd_populate_kernel
  13. pmd_populate

   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 #include <asm-generic/pgalloc.h>        /* for pte_{alloc,free}_one */
  17 
  18 #define PGD_SIZE        (PTRS_PER_PGD * sizeof(pgd_t))
  19 
  20 #if CONFIG_PGTABLE_LEVELS > 2
  21 
  22 static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
  23 {
  24         gfp_t gfp = GFP_PGTABLE_USER;
  25         struct page *page;
  26 
  27         if (mm == &init_mm)
  28                 gfp = GFP_PGTABLE_KERNEL;
  29 
  30         page = alloc_page(gfp);
  31         if (!page)
  32                 return NULL;
  33         if (!pgtable_pmd_page_ctor(page)) {
  34                 __free_page(page);
  35                 return NULL;
  36         }
  37         return page_address(page);
  38 }
  39 
  40 static inline void pmd_free(struct mm_struct *mm, pmd_t *pmdp)
  41 {
  42         BUG_ON((unsigned long)pmdp & (PAGE_SIZE-1));
  43         pgtable_pmd_page_dtor(virt_to_page(pmdp));
  44         free_page((unsigned long)pmdp);
  45 }
  46 
  47 static inline void __pud_populate(pud_t *pudp, phys_addr_t pmdp, pudval_t prot)
  48 {
  49         set_pud(pudp, __pud(__phys_to_pud_val(pmdp) | prot));
  50 }
  51 
  52 static inline void pud_populate(struct mm_struct *mm, pud_t *pudp, pmd_t *pmdp)
  53 {
  54         __pud_populate(pudp, __pa(pmdp), PMD_TYPE_TABLE);
  55 }
  56 #else
  57 static inline void __pud_populate(pud_t *pudp, phys_addr_t pmdp, pudval_t prot)
  58 {
  59         BUILD_BUG();
  60 }
  61 #endif  /* CONFIG_PGTABLE_LEVELS > 2 */
  62 
  63 #if CONFIG_PGTABLE_LEVELS > 3
  64 
  65 static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr)
  66 {
  67         return (pud_t *)__get_free_page(GFP_PGTABLE_USER);
  68 }
  69 
  70 static inline void pud_free(struct mm_struct *mm, pud_t *pudp)
  71 {
  72         BUG_ON((unsigned long)pudp & (PAGE_SIZE-1));
  73         free_page((unsigned long)pudp);
  74 }
  75 
  76 static inline void __pgd_populate(pgd_t *pgdp, phys_addr_t pudp, pgdval_t prot)
  77 {
  78         set_pgd(pgdp, __pgd(__phys_to_pgd_val(pudp) | prot));
  79 }
  80 
  81 static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgdp, pud_t *pudp)
  82 {
  83         __pgd_populate(pgdp, __pa(pudp), PUD_TYPE_TABLE);
  84 }
  85 #else
  86 static inline void __pgd_populate(pgd_t *pgdp, phys_addr_t pudp, pgdval_t prot)
  87 {
  88         BUILD_BUG();
  89 }
  90 #endif  /* CONFIG_PGTABLE_LEVELS > 3 */
  91 
  92 extern pgd_t *pgd_alloc(struct mm_struct *mm);
  93 extern void pgd_free(struct mm_struct *mm, pgd_t *pgdp);
  94 
  95 static inline void __pmd_populate(pmd_t *pmdp, phys_addr_t ptep,
  96                                   pmdval_t prot)
  97 {
  98         set_pmd(pmdp, __pmd(__phys_to_pmd_val(ptep) | prot));
  99 }
 100 
 101 /*
 102  * Populate the pmdp entry with a pointer to the pte.  This pmd is part
 103  * of the mm address space.
 104  */
 105 static inline void
 106 pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp, pte_t *ptep)
 107 {
 108         /*
 109          * The pmd must be loaded with the physical address of the PTE table
 110          */
 111         __pmd_populate(pmdp, __pa(ptep), PMD_TYPE_TABLE);
 112 }
 113 
 114 static inline void
 115 pmd_populate(struct mm_struct *mm, pmd_t *pmdp, pgtable_t ptep)
 116 {
 117         __pmd_populate(pmdp, page_to_phys(ptep), PMD_TYPE_TABLE);
 118 }
 119 #define pmd_pgtable(pmd) pmd_page(pmd)
 120 
 121 #endif

/* [<][>][^][v][top][bottom][index][help] */