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

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2.  *  linux/include/asm-arm/proc-armv/pgtable.h
  3.  *
  4.  *  Copyright (C) 1995-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.  *  12-Jan-1997 RMK Altered flushing routines to use function pointers
  11.  * now possible to combine ARM6, ARM7 and StrongARM versions.
  12.  *  17-Apr-1999 RMK Now pass an area size to clean_cache_area and
  13.  * flush_icache_area.
  14.  */
  15. #ifndef __ASM_PROC_PGTABLE_H
  16. #define __ASM_PROC_PGTABLE_H
  17. /*
  18.  * entries per page directory level: they are two-level, so
  19.  * we don't really have any PMD directory.
  20.  */
  21. #define PTRS_PER_PTE 256
  22. #define PTRS_PER_PMD 1
  23. #define PTRS_PER_PGD 4096
  24. /*
  25.  * Hardware page table definitions.
  26.  *
  27.  * + Level 1 descriptor (PMD)
  28.  *   - common
  29.  */
  30. #define PMD_TYPE_MASK (3 << 0)
  31. #define PMD_TYPE_FAULT (0 << 0)
  32. #define PMD_TYPE_TABLE (1 << 0)
  33. #define PMD_TYPE_SECT (2 << 0)
  34. #define PMD_UPDATABLE (1 << 4)
  35. #define PMD_DOMAIN(x) ((x) << 5)
  36. #define PMD_PROTECTION (1 << 9) /* v5 */
  37. /*
  38.  *   - section
  39.  */
  40. #define PMD_SECT_BUFFERABLE (1 << 2)
  41. #define PMD_SECT_CACHEABLE (1 << 3)
  42. #define PMD_SECT_AP_WRITE (1 << 10)
  43. #define PMD_SECT_AP_READ (1 << 11)
  44. #define PMD_SECT_TEX(x) ((x) << 12) /* v5 */
  45. /*
  46.  *   - coarse table
  47.  */
  48. /*
  49.  * + Level 2 descriptor (PTE)
  50.  *   - common
  51.  */
  52. #define PTE_TYPE_MASK (3 << 0)
  53. #define PTE_TYPE_FAULT (0 << 0)
  54. #define PTE_TYPE_LARGE (1 << 0)
  55. #define PTE_TYPE_SMALL (2 << 0)
  56. #define PTE_TYPE_EXT (3 << 0) /* v5 */
  57. #define PTE_BUFFERABLE (1 << 2)
  58. #define PTE_CACHEABLE (1 << 3)
  59. /*
  60.  *   - extended small page/tiny page
  61.  */
  62. #define PTE_EXT_AP_UNO_SRO (0 << 4)
  63. #define PTE_EXT_AP_UNO_SRW (1 << 4)
  64. #define PTE_EXT_AP_URO_SRW (2 << 4)
  65. #define PTE_EXT_AP_URW_SRW (3 << 4)
  66. #define PTE_EXT_TEX(x) ((x) << 6) /* v5 */
  67. /*
  68.  *   - small page
  69.  */
  70. #define PTE_SMALL_AP_UNO_SRO (0x00 << 4)
  71. #define PTE_SMALL_AP_UNO_SRW (0x55 << 4)
  72. #define PTE_SMALL_AP_URO_SRW (0xaa << 4)
  73. #define PTE_SMALL_AP_URW_SRW (0xff << 4)
  74. #define PTE_AP_READ PTE_SMALL_AP_URO_SRW
  75. #define PTE_AP_WRITE PTE_SMALL_AP_UNO_SRW
  76. /*
  77.  * "Linux" PTE definitions.
  78.  *
  79.  * We keep two sets of PTEs - the hardware and the linux version.
  80.  * This allows greater flexibility in the way we map the Linux bits
  81.  * onto the hardware tables, and allows us to have YOUNG and DIRTY
  82.  * bits.
  83.  *
  84.  * The PTE table pointer refers to the hardware entries; the "Linux"
  85.  * entries are stored 1024 bytes below.
  86.  */
  87. #define L_PTE_PRESENT (1 << 0)
  88. #define L_PTE_YOUNG (1 << 1)
  89. #define L_PTE_BUFFERABLE (1 << 2) /* matches PTE */
  90. #define L_PTE_CACHEABLE (1 << 3) /* matches PTE */
  91. #define L_PTE_USER (1 << 4)
  92. #define L_PTE_WRITE (1 << 5)
  93. #define L_PTE_EXEC (1 << 6)
  94. #define L_PTE_DIRTY (1 << 7)
  95. #ifndef __ASSEMBLY__
  96. #include <asm/proc/domain.h>
  97. #include <asm/arch/vmalloc.h>
  98. #define _PAGE_USER_TABLE (PMD_TYPE_TABLE | PMD_DOMAIN(DOMAIN_USER))
  99. #define _PAGE_KERNEL_TABLE (PMD_TYPE_TABLE | PMD_DOMAIN(DOMAIN_KERNEL))
  100. #define pmd_bad(pmd) (pmd_val(pmd) & 2)
  101. #define set_pmd(pmdp,pmd) cpu_set_pmd(pmdp, pmd)
  102. static inline pmd_t __mk_pmd(pte_t *ptep, unsigned long prot)
  103. {
  104. unsigned long pte_ptr = (unsigned long)ptep;
  105. pmd_t pmd;
  106. pte_ptr -= PTRS_PER_PTE * sizeof(void *);
  107. /*
  108.  * The pmd must be loaded with the physical
  109.  * address of the PTE table
  110.  */
  111. pmd_val(pmd) = __virt_to_phys(pte_ptr) | prot;
  112. return pmd;
  113. }
  114. static inline unsigned long pmd_page(pmd_t pmd)
  115. {
  116. unsigned long ptr;
  117. ptr = pmd_val(pmd) & ~(PTRS_PER_PTE * sizeof(void *) - 1);
  118. ptr += PTRS_PER_PTE * sizeof(void *);
  119. return __phys_to_virt(ptr);
  120. }
  121. #define set_pte(ptep, pte) cpu_set_pte(ptep,pte)
  122. /*
  123.  * The following macros handle the cache and bufferable bits...
  124.  */
  125. #define _L_PTE_DEFAULT L_PTE_PRESENT | L_PTE_YOUNG
  126. #define _L_PTE_READ L_PTE_USER | L_PTE_CACHEABLE | L_PTE_BUFFERABLE
  127. #define PAGE_NONE       __pgprot(_L_PTE_DEFAULT)
  128. #define PAGE_COPY       __pgprot(_L_PTE_DEFAULT | _L_PTE_READ)
  129. #define PAGE_SHARED     __pgprot(_L_PTE_DEFAULT | _L_PTE_READ | L_PTE_WRITE)
  130. #define PAGE_READONLY   __pgprot(_L_PTE_DEFAULT | _L_PTE_READ)
  131. #define PAGE_KERNEL     __pgprot(_L_PTE_DEFAULT | L_PTE_CACHEABLE | L_PTE_BUFFERABLE | L_PTE_DIRTY | L_PTE_WRITE)
  132. #define _PAGE_CHG_MASK (PAGE_MASK | L_PTE_DIRTY | L_PTE_YOUNG)
  133. /*
  134.  * The following only work if pte_present() is true.
  135.  * Undefined behaviour if not..
  136.  */
  137. #define pte_present(pte) (pte_val(pte) & L_PTE_PRESENT)
  138. #define pte_read(pte) (pte_val(pte) & L_PTE_USER)
  139. #define pte_write(pte) (pte_val(pte) & L_PTE_WRITE)
  140. #define pte_exec(pte) (pte_val(pte) & L_PTE_EXEC)
  141. #define pte_dirty(pte) (pte_val(pte) & L_PTE_DIRTY)
  142. #define pte_young(pte) (pte_val(pte) & L_PTE_YOUNG)
  143. #define PTE_BIT_FUNC(fn,op)
  144. static inline pte_t pte_##fn(pte_t pte) { pte_val(pte) op; return pte; }
  145. /*PTE_BIT_FUNC(rdprotect, &= ~L_PTE_USER);*/
  146. /*PTE_BIT_FUNC(mkread,    |= L_PTE_USER);*/
  147. PTE_BIT_FUNC(wrprotect, &= ~L_PTE_WRITE);
  148. PTE_BIT_FUNC(mkwrite,   |= L_PTE_WRITE);
  149. PTE_BIT_FUNC(exprotect, &= ~L_PTE_EXEC);
  150. PTE_BIT_FUNC(mkexec,    |= L_PTE_EXEC);
  151. PTE_BIT_FUNC(mkclean,   &= ~L_PTE_DIRTY);
  152. PTE_BIT_FUNC(mkdirty,   |= L_PTE_DIRTY);
  153. PTE_BIT_FUNC(mkold,     &= ~L_PTE_YOUNG);
  154. PTE_BIT_FUNC(mkyoung,   |= L_PTE_YOUNG);
  155. /*
  156.  * Mark the prot value as uncacheable and unbufferable.
  157.  */
  158. #define pgprot_noncached(prot) __pgprot(pgprot_val(prot) & ~(L_PTE_CACHEABLE | L_PTE_BUFFERABLE))
  159. #endif /* __ASSEMBLY__ */
  160. #endif /* __ASM_PROC_PGTABLE_H */