~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/unicore32/include/asm/pgalloc.h

Version: ~ [ linux-5.16-rc3 ] ~ [ linux-5.15.5 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.82 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.162 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.218 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.256 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.291 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.293 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.18.140 ] ~ [ linux-3.16.85 ] ~ [ linux-3.14.79 ] ~ [ linux-3.12.74 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /*
  2  * linux/arch/unicore32/include/asm/pgalloc.h
  3  *
  4  * Code specific to PKUnity SoC and UniCore ISA
  5  *
  6  * Copyright (C) 2001-2010 GUAN Xue-tao
  7  *
  8  * This program is free software; you can redistribute it and/or modify
  9  * it under the terms of the GNU General Public License version 2 as
 10  * published by the Free Software Foundation.
 11  */
 12 #ifndef __UNICORE_PGALLOC_H__
 13 #define __UNICORE_PGALLOC_H__
 14 
 15 #include <asm/pgtable-hwdef.h>
 16 #include <asm/processor.h>
 17 #include <asm/cacheflush.h>
 18 #include <asm/tlbflush.h>
 19 
 20 #define check_pgt_cache()               do { } while (0)
 21 
 22 #define _PAGE_USER_TABLE        (PMD_TYPE_TABLE | PMD_PRESENT)
 23 #define _PAGE_KERNEL_TABLE      (PMD_TYPE_TABLE | PMD_PRESENT)
 24 
 25 extern pgd_t *get_pgd_slow(struct mm_struct *mm);
 26 extern void free_pgd_slow(struct mm_struct *mm, pgd_t *pgd);
 27 
 28 #define pgd_alloc(mm)                   get_pgd_slow(mm)
 29 #define pgd_free(mm, pgd)               free_pgd_slow(mm, pgd)
 30 
 31 #define PGALLOC_GFP     (GFP_KERNEL | __GFP_NOTRACK | __GFP_ZERO)
 32 
 33 /*
 34  * Allocate one PTE table.
 35  */
 36 static inline pte_t *
 37 pte_alloc_one_kernel(struct mm_struct *mm, unsigned long addr)
 38 {
 39         pte_t *pte;
 40 
 41         pte = (pte_t *)__get_free_page(PGALLOC_GFP);
 42         if (pte)
 43                 clean_dcache_area(pte, PTRS_PER_PTE * sizeof(pte_t));
 44 
 45         return pte;
 46 }
 47 
 48 static inline pgtable_t
 49 pte_alloc_one(struct mm_struct *mm, unsigned long addr)
 50 {
 51         struct page *pte;
 52 
 53         pte = alloc_pages(PGALLOC_GFP, 0);
 54         if (!pte)
 55                 return NULL;
 56         if (!PageHighMem(pte)) {
 57                 void *page = page_address(pte);
 58                 clean_dcache_area(page, PTRS_PER_PTE * sizeof(pte_t));
 59         }
 60         if (!pgtable_page_ctor(pte)) {
 61                 __free_page(pte);
 62         }
 63 
 64         return pte;
 65 }
 66 
 67 /*
 68  * Free one PTE table.
 69  */
 70 static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
 71 {
 72         if (pte)
 73                 free_page((unsigned long)pte);
 74 }
 75 
 76 static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
 77 {
 78         pgtable_page_dtor(pte);
 79         __free_page(pte);
 80 }
 81 
 82 static inline void __pmd_populate(pmd_t *pmdp, unsigned long pmdval)
 83 {
 84         set_pmd(pmdp, __pmd(pmdval));
 85         flush_pmd_entry(pmdp);
 86 }
 87 
 88 /*
 89  * Populate the pmdp entry with a pointer to the pte.  This pmd is part
 90  * of the mm address space.
 91  */
 92 static inline void
 93 pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp, pte_t *ptep)
 94 {
 95         unsigned long pte_ptr = (unsigned long)ptep;
 96 
 97         /*
 98          * The pmd must be loaded with the physical
 99          * address of the PTE table
100          */
101         __pmd_populate(pmdp, __pa(pte_ptr) | _PAGE_KERNEL_TABLE);
102 }
103 
104 static inline void
105 pmd_populate(struct mm_struct *mm, pmd_t *pmdp, pgtable_t ptep)
106 {
107         __pmd_populate(pmdp,
108                         page_to_pfn(ptep) << PAGE_SHIFT | _PAGE_USER_TABLE);
109 }
110 #define pmd_pgtable(pmd) pmd_page(pmd)
111 
112 #endif
113 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp