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

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

Version: ~ [ linux-5.6-rc3 ] ~ [ linux-5.5.6 ] ~ [ linux-5.4.22 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.106 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.171 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.214 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.214 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.19.8 ] ~ [ linux-3.18.140 ] ~ [ linux-3.17.8 ] ~ [ linux-3.16.82 ] ~ [ linux-3.15.10 ] ~ [ linux-3.14.79 ] ~ [ linux-3.13.11 ] ~ [ linux-3.12.74 ] ~ [ linux-3.11.10 ] ~ [ linux-3.10.108 ] ~ [ linux-3.9.11 ] ~ [ linux-3.8.13 ] ~ [ linux-3.7.10 ] ~ [ linux-3.6.11 ] ~ [ linux-3.5.7 ] ~ [ linux-3.4.113 ] ~ [ linux-3.3.8 ] ~ [ linux-3.2.102 ] ~ [ linux-3.1.10 ] ~ [ linux-3.0.101 ] ~ [ 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_REPEAT | __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                 if (!PageHighMem(pte)) {
 56                         void *page = page_address(pte);
 57                         clean_dcache_area(page, PTRS_PER_PTE * sizeof(pte_t));
 58                 }
 59                 pgtable_page_ctor(pte);
 60         }
 61 
 62         return pte;
 63 }
 64 
 65 /*
 66  * Free one PTE table.
 67  */
 68 static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
 69 {
 70         if (pte)
 71                 free_page((unsigned long)pte);
 72 }
 73 
 74 static inline void pte_free(struct mm_struct *mm, pgtable_t pte)
 75 {
 76         pgtable_page_dtor(pte);
 77         __free_page(pte);
 78 }
 79 
 80 static inline void __pmd_populate(pmd_t *pmdp, unsigned long pmdval)
 81 {
 82         set_pmd(pmdp, __pmd(pmdval));
 83         flush_pmd_entry(pmdp);
 84 }
 85 
 86 /*
 87  * Populate the pmdp entry with a pointer to the pte.  This pmd is part
 88  * of the mm address space.
 89  */
 90 static inline void
 91 pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmdp, pte_t *ptep)
 92 {
 93         unsigned long pte_ptr = (unsigned long)ptep;
 94 
 95         /*
 96          * The pmd must be loaded with the physical
 97          * address of the PTE table
 98          */
 99         __pmd_populate(pmdp, __pa(pte_ptr) | _PAGE_KERNEL_TABLE);
100 }
101 
102 static inline void
103 pmd_populate(struct mm_struct *mm, pmd_t *pmdp, pgtable_t ptep)
104 {
105         __pmd_populate(pmdp,
106                         page_to_pfn(ptep) << PAGE_SHIFT | _PAGE_USER_TABLE);
107 }
108 #define pmd_pgtable(pmd) pmd_page(pmd)
109 
110 #endif
111 

~ [ 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