home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / asm-powerpc / page.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  5.5 KB  |  208 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. #ifdef __KERNEL__
  14. #include <asm/asm-compat.h>
  15.  
  16. /*
  17.  * On PPC32 page size is 4K. For PPC64 we support either 4K or 64K software
  18.  * page size. When using 64K pages however, whether we are really supporting
  19.  * 64K pages in HW or not is irrelevant to those definitions.
  20.  */
  21. #ifdef CONFIG_PPC_64K_PAGES
  22. #define PAGE_SHIFT        16
  23. #else
  24. #define PAGE_SHIFT        12
  25. #endif
  26.  
  27. #define PAGE_SIZE        (ASM_CONST(1) << PAGE_SHIFT)
  28.  
  29. /* We do define AT_SYSINFO_EHDR but don't use the gate mechanism */
  30. #define __HAVE_ARCH_GATE_AREA        1
  31.  
  32. /*
  33.  * Subtle: (1 << PAGE_SHIFT) is an int, not an unsigned long. So if we
  34.  * assign PAGE_MASK to a larger type it gets extended the way we want
  35.  * (i.e. with 1s in the high bits)
  36.  */
  37. #define PAGE_MASK      (~((1 << PAGE_SHIFT) - 1))
  38.  
  39. /*
  40.  * KERNELBASE is the virtual address of the start of the kernel, it's often
  41.  * the same as PAGE_OFFSET, but _might not be_.
  42.  *
  43.  * The kdump dump kernel is one example where KERNELBASE != PAGE_OFFSET.
  44.  *
  45.  * To get a physical address from a virtual one you subtract PAGE_OFFSET,
  46.  * _not_ KERNELBASE.
  47.  *
  48.  * If you want to know something's offset from the start of the kernel you
  49.  * should subtract KERNELBASE.
  50.  *
  51.  * If you want to test if something's a kernel address, use is_kernel_addr().
  52.  */
  53.  
  54. #ifdef CONFIG_CRASH_DUMP
  55. /* Kdump kernel runs at 32 MB, change at your peril. */
  56. #define PHYSICAL_START    0x2000000
  57. #else
  58. #define PHYSICAL_START    0x0
  59. #endif
  60.  
  61. #define PAGE_OFFSET     ASM_CONST(CONFIG_KERNEL_START)
  62. #define KERNELBASE      (PAGE_OFFSET + PHYSICAL_START)
  63.  
  64. #ifdef CONFIG_DISCONTIGMEM
  65. #define page_to_pfn(page)    discontigmem_page_to_pfn(page)
  66. #define pfn_to_page(pfn)    discontigmem_pfn_to_page(pfn)
  67. #define pfn_valid(pfn)        discontigmem_pfn_valid(pfn)
  68. #endif
  69.  
  70. #ifdef CONFIG_FLATMEM
  71. #define pfn_valid(pfn)        ((pfn) < max_mapnr)
  72. #endif
  73.  
  74. #define virt_to_page(kaddr)    pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
  75. #define pfn_to_kaddr(pfn)    __va((pfn) << PAGE_SHIFT)
  76. #define virt_addr_valid(kaddr)    pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
  77.  
  78. #define __va(x) ((void *)((unsigned long)(x) + PAGE_OFFSET))
  79. #define __pa(x) ((unsigned long)(x) - PAGE_OFFSET)
  80.  
  81. /*
  82.  * Unfortunately the PLT is in the BSS in the PPC32 ELF ABI,
  83.  * and needs to be executable.  This means the whole heap ends
  84.  * up being executable.
  85.  */
  86. #define VM_DATA_DEFAULT_FLAGS32    (VM_READ | VM_WRITE | VM_EXEC | \
  87.                  VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
  88.  
  89. #define VM_DATA_DEFAULT_FLAGS64    (VM_READ | VM_WRITE | \
  90.                  VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
  91.  
  92. #ifdef __powerpc64__
  93. #include <asm/page_64.h>
  94. #else
  95. #include <asm/page_32.h>
  96. #endif
  97.  
  98. /* align addr on a size boundary - adjust address up/down if needed */
  99. #define _ALIGN_UP(addr,size)    (((addr)+((size)-1))&(~((size)-1)))
  100. #define _ALIGN_DOWN(addr,size)    ((addr)&(~((size)-1)))
  101.  
  102. /* align addr on a size boundary - adjust address up if needed */
  103. #define _ALIGN(addr,size)     _ALIGN_UP(addr,size)
  104.  
  105. /* to align the pointer to the (next) page boundary */
  106. #define PAGE_ALIGN(addr)    _ALIGN(addr, PAGE_SIZE)
  107.  
  108. /*
  109.  * Don't compare things with KERNELBASE or PAGE_OFFSET to test for
  110.  * "kernelness", use is_kernel_addr() - it should do what you want.
  111.  */
  112. #define is_kernel_addr(x)    ((x) >= PAGE_OFFSET)
  113.  
  114. #ifndef __ASSEMBLY__
  115.  
  116. #undef STRICT_MM_TYPECHECKS
  117.  
  118. #ifdef STRICT_MM_TYPECHECKS
  119. /* These are used to make use of C type-checking. */
  120.  
  121. /* PTE level */
  122. typedef struct { pte_basic_t pte; } pte_t;
  123. #define pte_val(x)    ((x).pte)
  124. #define __pte(x)    ((pte_t) { (x) })
  125.  
  126. /* 64k pages additionally define a bigger "real PTE" type that gathers
  127.  * the "second half" part of the PTE for pseudo 64k pages
  128.  */
  129. #ifdef CONFIG_PPC_64K_PAGES
  130. typedef struct { pte_t pte; unsigned long hidx; } real_pte_t;
  131. #else
  132. typedef struct { pte_t pte; } real_pte_t;
  133. #endif
  134.  
  135. /* PMD level */
  136. typedef struct { unsigned long pmd; } pmd_t;
  137. #define pmd_val(x)    ((x).pmd)
  138. #define __pmd(x)    ((pmd_t) { (x) })
  139.  
  140. /* PUD level exusts only on 4k pages */
  141. #ifndef CONFIG_PPC_64K_PAGES
  142. typedef struct { unsigned long pud; } pud_t;
  143. #define pud_val(x)    ((x).pud)
  144. #define __pud(x)    ((pud_t) { (x) })
  145. #endif
  146.  
  147. /* PGD level */
  148. typedef struct { unsigned long pgd; } pgd_t;
  149. #define pgd_val(x)    ((x).pgd)
  150. #define __pgd(x)    ((pgd_t) { (x) })
  151.  
  152. /* Page protection bits */
  153. typedef struct { unsigned long pgprot; } pgprot_t;
  154. #define pgprot_val(x)    ((x).pgprot)
  155. #define __pgprot(x)    ((pgprot_t) { (x) })
  156.  
  157. #else
  158.  
  159. /*
  160.  * .. while these make it easier on the compiler
  161.  */
  162.  
  163. typedef pte_basic_t pte_t;
  164. #define pte_val(x)    (x)
  165. #define __pte(x)    (x)
  166.  
  167. #ifdef CONFIG_PPC_64K_PAGES
  168. typedef struct { pte_t pte; unsigned long hidx; } real_pte_t;
  169. #else
  170. typedef unsigned long real_pte_t;
  171. #endif
  172.  
  173.  
  174. typedef unsigned long pmd_t;
  175. #define pmd_val(x)    (x)
  176. #define __pmd(x)    (x)
  177.  
  178. #if defined(CONFIG_PPC64) && !defined(CONFIG_PPC_64K_PAGES)
  179. typedef unsigned long pud_t;
  180. #define pud_val(x)    (x)
  181. #define __pud(x)    (x)
  182. #endif
  183.  
  184. typedef unsigned long pgd_t;
  185. #define pgd_val(x)    (x)
  186. #define pgprot_val(x)    (x)
  187.  
  188. typedef unsigned long pgprot_t;
  189. #define __pgd(x)    (x)
  190. #define __pgprot(x)    (x)
  191.  
  192. #endif
  193.  
  194. struct page;
  195. extern void clear_user_page(void *page, unsigned long vaddr, struct page *pg);
  196. extern void copy_user_page(void *to, void *from, unsigned long vaddr,
  197.         struct page *p);
  198. extern int page_is_ram(unsigned long pfn);
  199.  
  200. #define devmem_is_allowed(x) 1
  201.  
  202. #include <asm-generic/memory_model.h>
  203. #endif /* __ASSEMBLY__ */
  204.  
  205. #endif /* __KERNEL__ */
  206.  
  207. #endif /* _ASM_POWERPC_PAGE_H */
  208.