pgtable.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:5k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/include/asm-arm/pgtable.h
  3.  *
  4.  *  Copyright (C) 2000-2001 Russell King
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify
  7.  * it under the terms of the GNU General Public License version 2 as
  8.  * published by the Free Software Foundation.
  9.  */
  10. #ifndef _ASMARM_PGTABLE_H
  11. #define _ASMARM_PGTABLE_H
  12. #include <linux/config.h>
  13. #include <asm/arch/memory.h>
  14. #include <asm/proc-fns.h>
  15. /*
  16.  * PMD_SHIFT determines the size of the area a second-level page table can map
  17.  * PGDIR_SHIFT determines what a third-level page table entry can map
  18.  */
  19. #define PMD_SHIFT 20
  20. #define PGDIR_SHIFT 20
  21. #define LIBRARY_TEXT_START 0x0c000000
  22. #ifndef __ASSEMBLY__
  23. extern void __pte_error(const char *file, int line, unsigned long val);
  24. extern void __pmd_error(const char *file, int line, unsigned long val);
  25. extern void __pgd_error(const char *file, int line, unsigned long val);
  26. #define pte_ERROR(pte) __pte_error(__FILE__, __LINE__, pte_val(pte))
  27. #define pmd_ERROR(pmd) __pmd_error(__FILE__, __LINE__, pmd_val(pmd))
  28. #define pgd_ERROR(pgd) __pgd_error(__FILE__, __LINE__, pgd_val(pgd))
  29. #endif /* !__ASSEMBLY__ */
  30. #define PMD_SIZE (1UL << PMD_SHIFT)
  31. #define PMD_MASK (~(PMD_SIZE-1))
  32. #define PGDIR_SIZE (1UL << PGDIR_SHIFT)
  33. #define PGDIR_MASK (~(PGDIR_SIZE-1))
  34. #define FIRST_USER_PGD_NR 1
  35. #define USER_PTRS_PER_PGD ((TASK_SIZE/PGDIR_SIZE) - FIRST_USER_PGD_NR)
  36. /*
  37.  * The table below defines the page protection levels that we insert into our
  38.  * Linux page table version.  These get translated into the best that the
  39.  * architecture can perform.  Note that on most ARM hardware:
  40.  *  1) We cannot do execute protection
  41.  *  2) If we could do execute protection, then read is implied
  42.  *  3) write implies read permissions
  43.  */
  44. #define __P000  PAGE_NONE
  45. #define __P001  PAGE_READONLY
  46. #define __P010  PAGE_COPY
  47. #define __P011  PAGE_COPY
  48. #define __P100  PAGE_READONLY
  49. #define __P101  PAGE_READONLY
  50. #define __P110  PAGE_COPY
  51. #define __P111  PAGE_COPY
  52. #define __S000  PAGE_NONE
  53. #define __S001  PAGE_READONLY
  54. #define __S010  PAGE_SHARED
  55. #define __S011  PAGE_SHARED
  56. #define __S100  PAGE_READONLY
  57. #define __S101  PAGE_READONLY
  58. #define __S110  PAGE_SHARED
  59. #define __S111  PAGE_SHARED
  60. #ifndef __ASSEMBLY__
  61. /*
  62.  * ZERO_PAGE is a global shared page that is always zero: used
  63.  * for zero-mapped memory areas etc..
  64.  */
  65. extern struct page *empty_zero_page;
  66. #define ZERO_PAGE(vaddr) (empty_zero_page)
  67. #define pte_none(pte) (!pte_val(pte))
  68. #define pte_clear(ptep) set_pte((ptep), __pte(0))
  69. #ifndef CONFIG_DISCONTIGMEM
  70. #define pte_page(x) (mem_map + (pte_val((x)) >> PAGE_SHIFT) - 
  71.  (PHYS_OFFSET >> PAGE_SHIFT))
  72. #else
  73. /*
  74.  * I'm not happy with this - we needlessly convert a physical address
  75.  * to a virtual one, and then immediately back to a physical address,
  76.  * which, if __va and __pa are expensive causes twice the expense for
  77.  * zero gain. --rmk
  78.  */
  79. #define pte_page(x) (virt_to_page(__va(pte_val((x)))))
  80. #endif
  81. #define pmd_none(pmd) (!pmd_val(pmd))
  82. #define pmd_present(pmd) (pmd_val(pmd))
  83. #define pmd_clear(pmdp) set_pmd(pmdp, __pmd(0))
  84. /*
  85.  * Permanent address of a page. We never have highmem, so this is trivial.
  86.  */
  87. #define page_address(page) ((page)->virtual)
  88. #define pages_to_mb(x) ((x) >> (20 - PAGE_SHIFT))
  89. /*
  90.  * Conversion functions: convert a page and protection to a page entry,
  91.  * and a page entry and page directory to the page they refer to.
  92.  */
  93. static inline pte_t mk_pte_phys(unsigned long physpage, pgprot_t pgprot)
  94. {
  95. pte_t pte;
  96. pte_val(pte) = physpage | pgprot_val(pgprot);
  97. return pte;
  98. }
  99. #define mk_pte(page,pgprot)
  100. ({
  101. pte_t __pte;
  102. pte_val(__pte) = __pa(page_address(page)) +
  103.    pgprot_val(pgprot);
  104. __pte;
  105. })
  106. /*
  107.  * The "pgd_xxx()" functions here are trivial for a folded two-level
  108.  * setup: the pgd is never bad, and a pmd always exists (as it's folded
  109.  * into the pgd entry)
  110.  */
  111. #define pgd_none(pgd) (0)
  112. #define pgd_bad(pgd) (0)
  113. #define pgd_present(pgd) (1)
  114. #define pgd_clear(pgdp)
  115. #define page_pte_prot(page,prot) mk_pte(page, prot)
  116. #define page_pte(page) mk_pte(page, __pgprot(0))
  117. /* to find an entry in a page-table-directory */
  118. #define pgd_index(addr) ((addr) >> PGDIR_SHIFT)
  119. #define __pgd_offset(addr) pgd_index(addr)
  120. #define pgd_offset(mm, addr) ((mm)->pgd+pgd_index(addr))
  121. /* to find an entry in a kernel page-table-directory */
  122. #define pgd_offset_k(addr) pgd_offset(&init_mm, addr)
  123. /* Find an entry in the second-level page table.. */
  124. #define pmd_offset(dir, addr) ((pmd_t *)(dir))
  125. /* Find an entry in the third-level page table.. */
  126. #define __pte_offset(addr) (((addr) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
  127. #define pte_offset(dir, addr) ((pte_t *)pmd_page(*(dir)) + __pte_offset(addr))
  128. #include <asm/proc/pgtable.h>
  129. static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
  130. {
  131. pte_val(pte) = (pte_val(pte) & _PAGE_CHG_MASK) | pgprot_val(newprot);
  132. return pte;
  133. }
  134. extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
  135. /* Encode and decode a swap entry.
  136.  *
  137.  * We support up to 32GB of swap on 4k machines
  138.  */
  139. #define SWP_TYPE(x) (((x).val >> 2) & 0x7f)
  140. #define SWP_OFFSET(x) ((x).val >> 9)
  141. #define SWP_ENTRY(type,offset) ((swp_entry_t) { ((type) << 2) | ((offset) << 9) })
  142. #define pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) })
  143. #define swp_entry_to_pte(swp) ((pte_t) { (swp).val })
  144. /* Needs to be defined here and not in linux/mm.h, as it is arch dependent */
  145. /* FIXME: this is not correct */
  146. #define kern_addr_valid(addr) (1)
  147. #include <asm-generic/pgtable.h>
  148. extern void pgtable_cache_init(void);
  149. #endif /* !__ASSEMBLY__ */
  150. #endif /* _ASMARM_PGTABLE_H */