home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / arch / powerpc / include / asm / page.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  6.5 KB  |  237 lines

  1. #ifndef _ASM_POWERPC_PAGE_H
  2. #define _ASM_POWERPC_PAGE_H
  3.  
  4. /*
  5.  * Copyright (C) 2001,2005 IBM Corporation.
  6.  *
  7.  * This program is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU General Public License
  9.  * as published by the Free Software Foundation; either version
  10.  * 2 of the License, or (at your option) any later version.
  11.  */
  12.  
  13. #ifndef __ASSEMBLY__
  14. #include <linux/types.h>
  15. #else
  16. #include <asm/types.h>
  17. #endif
  18. #include <asm/asm-compat.h>
  19. #include <asm/kdump.h>
  20.  
  21. /*
  22.  * On PPC32 page size is 4K. For PPC64 we support either 4K or 64K software
  23.  * page size. When using 64K pages however, whether we are really supporting
  24.  * 64K pages in HW or not is irrelevant to those definitions.
  25.  */
  26. #ifdef CONFIG_PPC_64K_PAGES
  27. #define PAGE_SHIFT        16
  28. #else
  29. #define PAGE_SHIFT        12
  30. #endif
  31.  
  32. #define PAGE_SIZE        (ASM_CONST(1) << PAGE_SHIFT)
  33.  
  34. /* We do define AT_SYSINFO_EHDR but don't use the gate mechanism */
  35. #define __HAVE_ARCH_GATE_AREA        1
  36.  
  37. /*
  38.  * Subtle: (1 << PAGE_SHIFT) is an int, not an unsigned long. So if we
  39.  * assign PAGE_MASK to a larger type it gets extended the way we want
  40.  * (i.e. with 1s in the high bits)
  41.  */
  42. #define PAGE_MASK      (~((1 << PAGE_SHIFT) - 1))
  43.  
  44. /*
  45.  * KERNELBASE is the virtual address of the start of the kernel, it's often
  46.  * the same as PAGE_OFFSET, but _might not be_.
  47.  *
  48.  * The kdump dump kernel is one example where KERNELBASE != PAGE_OFFSET.
  49.  *
  50.  * PAGE_OFFSET is the virtual address of the start of lowmem.
  51.  *
  52.  * PHYSICAL_START is the physical address of the start of the kernel.
  53.  *
  54.  * MEMORY_START is the physical address of the start of lowmem.
  55.  *
  56.  * KERNELBASE, PAGE_OFFSET, and PHYSICAL_START are all configurable on
  57.  * ppc32 and based on how they are set we determine MEMORY_START.
  58.  *
  59.  * For the linear mapping the following equation should be true:
  60.  * KERNELBASE - PAGE_OFFSET = PHYSICAL_START - MEMORY_START
  61.  *
  62.  * Also, KERNELBASE >= PAGE_OFFSET and PHYSICAL_START >= MEMORY_START
  63.  *
  64.  * There are two was to determine a physical address from a virtual one:
  65.  * va = pa + PAGE_OFFSET - MEMORY_START
  66.  * va = pa + KERNELBASE - PHYSICAL_START
  67.  *
  68.  * If you want to know something's offset from the start of the kernel you
  69.  * should subtract KERNELBASE.
  70.  *
  71.  * If you want to test if something's a kernel address, use is_kernel_addr().
  72.  */
  73.  
  74. #define KERNELBASE      ASM_CONST(CONFIG_KERNEL_START)
  75. #define PAGE_OFFSET    ASM_CONST(CONFIG_PAGE_OFFSET)
  76. #define LOAD_OFFSET    ASM_CONST((CONFIG_KERNEL_START-CONFIG_PHYSICAL_START))
  77.  
  78. #if defined(CONFIG_RELOCATABLE)
  79. #ifndef __ASSEMBLY__
  80.  
  81. extern phys_addr_t memstart_addr;
  82. extern phys_addr_t kernstart_addr;
  83. #endif
  84. #define PHYSICAL_START    kernstart_addr
  85. #else
  86. #define PHYSICAL_START    ASM_CONST(CONFIG_PHYSICAL_START)
  87. #endif
  88.  
  89. #ifdef CONFIG_PPC64
  90. #define MEMORY_START    0UL
  91. #elif defined(CONFIG_RELOCATABLE)
  92. #define MEMORY_START    memstart_addr
  93. #else
  94. #define MEMORY_START    (PHYSICAL_START + PAGE_OFFSET - KERNELBASE)
  95. #endif
  96.  
  97. #ifdef CONFIG_FLATMEM
  98. #define ARCH_PFN_OFFSET        (MEMORY_START >> PAGE_SHIFT)
  99. #define pfn_valid(pfn)        ((pfn) >= ARCH_PFN_OFFSET && (pfn) < (ARCH_PFN_OFFSET + max_mapnr))
  100. #endif
  101.  
  102. #define virt_to_page(kaddr)    pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
  103. #define pfn_to_kaddr(pfn)    __va((pfn) << PAGE_SHIFT)
  104. #define virt_addr_valid(kaddr)    pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
  105.  
  106. #define __va(x) ((void *)((unsigned long)(x) + PAGE_OFFSET - MEMORY_START))
  107. #define __pa(x) ((unsigned long)(x) - PAGE_OFFSET + MEMORY_START)
  108.  
  109. /*
  110.  * Unfortunately the PLT is in the BSS in the PPC32 ELF ABI,
  111.  * and needs to be executable.  This means the whole heap ends
  112.  * up being executable.
  113.  */
  114. #define VM_DATA_DEFAULT_FLAGS32    (VM_READ | VM_WRITE | VM_EXEC | \
  115.                  VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
  116.  
  117. #define VM_DATA_DEFAULT_FLAGS64    (VM_READ | VM_WRITE | \
  118.                  VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
  119.  
  120. #ifdef __powerpc64__
  121. #include <asm/page_64.h>
  122. #else
  123. #include <asm/page_32.h>
  124. #endif
  125.  
  126. /* align addr on a size boundary - adjust address up/down if needed */
  127. #define _ALIGN_UP(addr,size)    (((addr)+((size)-1))&(~((size)-1)))
  128. #define _ALIGN_DOWN(addr,size)    ((addr)&(~((size)-1)))
  129.  
  130. /* align addr on a size boundary - adjust address up if needed */
  131. #define _ALIGN(addr,size)     _ALIGN_UP(addr,size)
  132.  
  133. /*
  134.  * Don't compare things with KERNELBASE or PAGE_OFFSET to test for
  135.  * "kernelness", use is_kernel_addr() - it should do what you want.
  136.  */
  137. #define is_kernel_addr(x)    ((x) >= PAGE_OFFSET)
  138.  
  139. #ifndef __ASSEMBLY__
  140.  
  141. #undef STRICT_MM_TYPECHECKS
  142.  
  143. #ifdef STRICT_MM_TYPECHECKS
  144. /* These are used to make use of C type-checking. */
  145.  
  146. /* PTE level */
  147. typedef struct { pte_basic_t pte; } pte_t;
  148. #define pte_val(x)    ((x).pte)
  149. #define __pte(x)    ((pte_t) { (x) })
  150.  
  151. /* 64k pages additionally define a bigger "real PTE" type that gathers
  152.  * the "second half" part of the PTE for pseudo 64k pages
  153.  */
  154. #ifdef CONFIG_PPC_64K_PAGES
  155. typedef struct { pte_t pte; unsigned long hidx; } real_pte_t;
  156. #else
  157. typedef struct { pte_t pte; } real_pte_t;
  158. #endif
  159.  
  160. /* PMD level */
  161. #ifdef CONFIG_PPC64
  162. typedef struct { unsigned long pmd; } pmd_t;
  163. #define pmd_val(x)    ((x).pmd)
  164. #define __pmd(x)    ((pmd_t) { (x) })
  165.  
  166. /* PUD level exusts only on 4k pages */
  167. #ifndef CONFIG_PPC_64K_PAGES
  168. typedef struct { unsigned long pud; } pud_t;
  169. #define pud_val(x)    ((x).pud)
  170. #define __pud(x)    ((pud_t) { (x) })
  171. #endif /* !CONFIG_PPC_64K_PAGES */
  172. #endif /* CONFIG_PPC64 */
  173.  
  174. /* PGD level */
  175. typedef struct { unsigned long pgd; } pgd_t;
  176. #define pgd_val(x)    ((x).pgd)
  177. #define __pgd(x)    ((pgd_t) { (x) })
  178.  
  179. /* Page protection bits */
  180. typedef struct { unsigned long pgprot; } pgprot_t;
  181. #define pgprot_val(x)    ((x).pgprot)
  182. #define __pgprot(x)    ((pgprot_t) { (x) })
  183.  
  184. #else
  185.  
  186. /*
  187.  * .. while these make it easier on the compiler
  188.  */
  189.  
  190. typedef pte_basic_t pte_t;
  191. #define pte_val(x)    (x)
  192. #define __pte(x)    (x)
  193.  
  194. #ifdef CONFIG_PPC_64K_PAGES
  195. typedef struct { pte_t pte; unsigned long hidx; } real_pte_t;
  196. #else
  197. typedef unsigned long real_pte_t;
  198. #endif
  199.  
  200.  
  201. #ifdef CONFIG_PPC64
  202. typedef unsigned long pmd_t;
  203. #define pmd_val(x)    (x)
  204. #define __pmd(x)    (x)
  205.  
  206. #ifndef CONFIG_PPC_64K_PAGES
  207. typedef unsigned long pud_t;
  208. #define pud_val(x)    (x)
  209. #define __pud(x)    (x)
  210. #endif /* !CONFIG_PPC_64K_PAGES */
  211. #endif /* CONFIG_PPC64 */
  212.  
  213. typedef unsigned long pgd_t;
  214. #define pgd_val(x)    (x)
  215. #define pgprot_val(x)    (x)
  216.  
  217. typedef unsigned long pgprot_t;
  218. #define __pgd(x)    (x)
  219. #define __pgprot(x)    (x)
  220.  
  221. #endif
  222.  
  223. struct page;
  224. extern void clear_user_page(void *page, unsigned long vaddr, struct page *pg);
  225. extern void copy_user_page(void *to, void *from, unsigned long vaddr,
  226.         struct page *p);
  227. extern int page_is_ram(unsigned long pfn);
  228.  
  229. struct vm_area_struct;
  230.  
  231. typedef struct page *pgtable_t;
  232.  
  233. #include <asm-generic/memory_model.h>
  234. #endif /* __ASSEMBLY__ */
  235.  
  236. #endif /* _ASM_POWERPC_PAGE_H */
  237.