page.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:7k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef _PPC64_PAGE_H
  2. #define _PPC64_PAGE_H
  3. /*
  4.  * Copyright (C) 2001 PPC64 Team, IBM Corp
  5.  *
  6.  * This program is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU General Public License
  8.  * as published by the Free Software Foundation; either version
  9.  * 2 of the License, or (at your option) any later version.
  10.  */
  11. #include <linux/config.h>
  12. /* PAGE_SHIFT determines the page size */
  13. #define PAGE_SHIFT 12
  14. #define PAGE_SIZE (1UL << PAGE_SHIFT)
  15. #define PAGE_MASK (~(PAGE_SIZE-1))
  16. #define PAGE_OFFSET_MASK (PAGE_SIZE-1)
  17. #define SID_SHIFT       28
  18. #define SID_MASK        0xfffffffff
  19. #define GET_ESID(x)     (((x) >> SID_SHIFT) & SID_MASK)
  20. /* Define an illegal instr to trap on the bug.
  21.  * We don't use 0 because that marks the end of a function
  22.  * in the ELF ABI.  That's "Boo Boo" in case you wonder...
  23.  */
  24. #define BUG_OPCODE .long 0x00b00b00  /* For asm */
  25. #define BUG_ILLEGAL_INSTR "0x00b00b00" /* For BUG macro */
  26. #ifdef __KERNEL__
  27. #ifndef __ASSEMBLY__
  28. #include <asm/naca.h>
  29. #define STRICT_MM_TYPECHECKS
  30. #define REGION_SIZE   4UL
  31. #define OFFSET_SIZE   60UL
  32. #define REGION_SHIFT  60UL
  33. #define OFFSET_SHIFT  0UL
  34. #define REGION_MASK   (((1UL<<REGION_SIZE)-1UL)<<REGION_SHIFT)
  35. #define REGION_STRIDE (1UL << REGION_SHIFT)
  36. #ifdef ___powerpc64__
  37. typedef union ppc64_va {
  38.         struct {
  39.                 unsigned long off : OFFSET_SIZE;  /* intra-region offset */
  40.                 unsigned long reg : REGION_SIZE;  /* region number */
  41.         } f;
  42.         unsigned long l;
  43.         void *p;
  44. } ppc64_va;
  45. #endif /* ___powerpc64__ */
  46.        
  47. static __inline__ void clear_page(void *addr)
  48. {
  49. unsigned long lines, line_size;
  50. line_size = naca->dCacheL1LineSize; 
  51. lines = naca->dCacheL1LinesPerPage;
  52. __asm__ __volatile__(
  53. "   mtctr   %1n
  54. 1:      dcbz   0,%0n
  55. add %0,%0,%3n
  56. bdnz+ 1b"
  57.         : "=r" (addr)
  58.         : "r" (lines), "0" (addr), "r" (line_size)
  59. : "ctr", "memory");
  60. }
  61. extern void copy_page(void *to, void *from);
  62. struct page;
  63. extern void clear_user_page(void *page, unsigned long vaddr);
  64. extern void copy_user_page(void *to, void *from, unsigned long vaddr);
  65. #ifdef STRICT_MM_TYPECHECKS
  66. /*
  67.  * These are used to make use of C type-checking.  
  68.  * Entries in the pte table are 64b, while entries in the pgd & pmd are 32b.
  69.  */
  70. typedef struct { unsigned long pte; } pte_t;
  71. typedef struct { unsigned int  pmd; } pmd_t;
  72. typedef struct { unsigned int  pgd; } pgd_t;
  73. typedef struct { unsigned long pgprot; } pgprot_t;
  74. #define pte_val(x) ((x).pte)
  75. #define pmd_val(x) ((x).pmd)
  76. #define pgd_val(x) ((x).pgd)
  77. #define pgprot_val(x) ((x).pgprot)
  78. #define __pte(x) ((pte_t) { (x) } )
  79. #define __pmd(x) ((pmd_t) { (x) } )
  80. #define __pgd(x) ((pgd_t) { (x) } )
  81. #define __pgprot(x) ((pgprot_t) { (x) } )
  82. #else
  83. /*
  84.  * .. while these make it easier on the compiler
  85.  */
  86. typedef unsigned long pte_t;
  87. typedef unsigned int  pmd_t;
  88. typedef unsigned int  pgd_t;
  89. typedef unsigned long pgprot_t;
  90. #define pte_val(x) (x)
  91. #define pmd_val(x) (x)
  92. #define pgd_val(x) (x)
  93. #define pgprot_val(x) (x)
  94. #define __pte(x) (x)
  95. #define __pmd(x) (x)
  96. #define __pgd(x) (x)
  97. #define __pgprot(x) (x)
  98. #endif
  99. #ifdef CONFIG_XMON
  100. #include <asm/ptrace.h>
  101. extern void xmon(struct pt_regs *excp);
  102. #define BUG() do { 
  103. printk("kernel BUG at %s:%d!n", __FILE__, __LINE__); 
  104. xmon(0); 
  105. } while (0)
  106. #elif defined(CONFIG_KDB)
  107. #include <asm/ptrace.h>
  108. #include <linux/kdb.h>
  109. /* extern void kdb(kdb_reason_t reason, int error, kdb_eframe_t ef); */
  110. #define BUG() do { 
  111.       printk("kernel BUG at %s:%d!n", __FILE__, __LINE__); 
  112.       kdb(KDB_REASON_OOPS, 0, (kdb_eframe_t) 0); 
  113. } while (0)
  114. #else
  115. #define BUG() do { 
  116. printk("kernel BUG at %s:%d!n", __FILE__, __LINE__); 
  117. __asm__ __volatile__(".long " BUG_ILLEGAL_INSTR); 
  118. } while (0)
  119. #endif
  120. #define PAGE_BUG(page) do { BUG(); } while (0)
  121. /* Pure 2^n version of get_order */
  122. static inline int get_order(unsigned long size)
  123. {
  124. int order;
  125. size = (size-1) >> (PAGE_SHIFT-1);
  126. order = -1;
  127. do {
  128. size >>= 1;
  129. order++;
  130. } while (size);
  131. return order;
  132. }
  133. #define __pa(x) ((unsigned long)(x)-PAGE_OFFSET)
  134. #endif /* __ASSEMBLY__ */
  135. /* align addr on a size boundry - adjust address up/down if needed */
  136. #define _ALIGN_UP(addr,size) (((addr)+((size)-1))&(~((size)-1)))
  137. #define _ALIGN_DOWN(addr,size) ((addr)&(~((size)-1)))
  138. /* align addr on a size boundry - adjust address up if needed */
  139. #define _ALIGN(addr,size)     _ALIGN_UP(addr,size)
  140. /* to align the pointer to the (next) double word boundary */
  141. #define DOUBLEWORD_ALIGN(addr) _ALIGN(addr,sizeof(unsigned long))
  142. /* to align the pointer to the (next) page boundary */
  143. #define PAGE_ALIGN(addr) _ALIGN(addr, PAGE_SIZE)
  144. #ifdef MODULE
  145. #define __page_aligned __attribute__((__aligned__(PAGE_SIZE)))
  146. #else
  147. #define __page_aligned 
  148. __attribute__((__aligned__(PAGE_SIZE), 
  149. __section__(".data.page_aligned")))
  150. #endif
  151. /* This must match the -Ttext linker address            */
  152. /* Note: tophys & tovirt make assumptions about how     */
  153. /*       KERNELBASE is defined for performance reasons. */
  154. /*       When KERNELBASE moves, those macros may have   */
  155. /*             to change!                               */
  156. #define PAGE_OFFSET     0xC000000000000000
  157. #define KERNELBASE      PAGE_OFFSET
  158. #define VMALLOCBASE     0xD000000000000000
  159. #define IOREGIONBASE    0xE000000000000000
  160. #define BOLTEDBASE      0xB000000000000000
  161. #define IO_REGION_ID       (IOREGIONBASE>>REGION_SHIFT)
  162. #define VMALLOC_REGION_ID  (VMALLOCBASE>>REGION_SHIFT)
  163. #define KERNEL_REGION_ID   (KERNELBASE>>REGION_SHIFT)
  164. #define BOLTED_REGION_ID   (BOLTEDBASE>>REGION_SHIFT)
  165. #define USER_REGION_ID     (0UL)
  166. #define REGION_ID(X)    (((unsigned long)(X))>>REGION_SHIFT)
  167. /*
  168.  * Define valid/invalid EA bits (for all ranges)
  169.  */
  170. #define VALID_EA_BITS   (0x000001ffffffffffUL)
  171. #define INVALID_EA_BITS (~(REGION_MASK|VALID_EA_BITS))
  172. #define IS_VALID_REGION_ID(x) 
  173.         (((x) == USER_REGION_ID) || ((x) >= BOLTED_REGION_ID))
  174. #define IS_VALID_EA(x) 
  175.         ((!((x) & INVALID_EA_BITS)) && IS_VALID_REGION_ID(REGION_ID(x)))
  176. #define __bpn_to_ba(x) ((((unsigned long)(x))<<PAGE_SHIFT) + KERNELBASE)
  177. #define __ba_to_bpn(x) ((((unsigned long)(x)) & ~REGION_MASK) >> PAGE_SHIFT)
  178. #define __va(x) ((void *)((unsigned long)(x) + KERNELBASE))
  179. /* Given that physical addresses do not map 1-1 to absolute addresses, we
  180.  * use these macros to better specify exactly what we want to do.
  181.  * The only restriction on their use is that the absolute address
  182.  * macros cannot be used until after the LMB structure has been
  183.  * initialized in prom.c.  -Peter
  184.  */
  185. #define __v2p(x) ((void *) __pa(x))
  186. #define __v2a(x) ((void *) phys_to_absolute(__pa(x)))
  187. #define __p2a(x) ((void *) phys_to_absolute(x))
  188. #define __p2v(x) ((void *) __va(x))
  189. #define __a2p(x) ((void *) absolute_to_phys(x))
  190. #define __a2v(x) ((void *) __va(absolute_to_phys(x)))
  191. #define virt_to_page(kaddr) (mem_map+(__pa((unsigned long)kaddr) >> PAGE_SHIFT))
  192. #define VALID_PAGE(page)    ((page - mem_map) < max_mapnr)
  193. #define MAP_NR(addr)        (__pa(addr) >> PAGE_SHIFT)
  194. #define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | 
  195.  VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
  196. #endif /* __KERNEL__ */
  197. #endif /* _PPC64_PAGE_H */