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

Linux/Unix编程

开发平台:

Unix_Linux

  1. #ifndef _X86_64_PAGE_H
  2. #define _X86_64_PAGE_H
  3. /* PAGE_SHIFT determines the page size */
  4. #define PAGE_SHIFT 12
  5. #ifdef __ASSEMBLY__
  6. #define PAGE_SIZE (0x1 << PAGE_SHIFT)
  7. #else
  8. #define PAGE_SIZE (1UL << PAGE_SHIFT)
  9. #endif
  10. #define PAGE_MASK (~(PAGE_SIZE-1))
  11. #define __PHYSICAL_MASK 0x0000ffffffffffffUL
  12. #define PHYSICAL_PAGE_MASK 0x0000fffffffff000UL
  13. #define LARGE_PAGE_MASK (~(LARGE_PAGE_SIZE-1))
  14. #define LARGE_PAGE_SIZE (1UL << PMD_SHIFT)
  15. #define LARGE_PFN (LARGE_PAGE_SIZE / PAGE_SIZE)
  16. #define KERNEL_TEXT_SIZE  (40UL*1024*1024)
  17. #define KERNEL_TEXT_START 0xffffffff80000000UL 
  18. /* Changing the next two defines should be enough to increase the kernel stack */
  19. /* We still hope 8K is enough, but ... */
  20. #define THREAD_ORDER    1
  21. #define THREAD_SIZE    (2*PAGE_SIZE)
  22. #define INIT_TASK_SIZE THREAD_SIZE
  23. #define CURRENT_MASK (~(THREAD_SIZE-1))
  24. #ifdef __KERNEL__
  25. #ifndef __ASSEMBLY__
  26. void clear_page(void *);
  27. void copy_page(void *, void *); 
  28. #define clear_user_page(page, vaddr) clear_page(page)
  29. #define copy_user_page(to, from, vaddr) copy_page(to, from)
  30. /*
  31.  * These are used to make use of C type-checking..
  32.  */
  33. typedef struct { unsigned long pte; } pte_t;
  34. typedef struct { unsigned long pmd; } pmd_t;
  35. typedef struct { unsigned long pgd; } pgd_t;
  36. typedef struct { unsigned long pml4; } pml4_t;
  37. #define PTE_MASK PAGE_MASK
  38. typedef struct { unsigned long pgprot; } pgprot_t;
  39. #define pte_val(x) ((x).pte)
  40. #define pmd_val(x) ((x).pmd)
  41. #define pgd_val(x) ((x).pgd)
  42. #define pml4_val(x) ((x).pml4)
  43. #define pgprot_val(x) ((x).pgprot)
  44. #define __pte(x) ((pte_t) { (x) } )
  45. #define __pmd(x) ((pmd_t) { (x) } )
  46. #define __pgd(x) ((pgd_t) { (x) } )
  47. #define __level4(x) ((level4_t) { (x) } )
  48. #define __pgprot(x) ((pgprot_t) { (x) } )
  49.  
  50. #endif /* !__ASSEMBLY__ */
  51. /* to align the pointer to the (next) page boundary */
  52. #define PAGE_ALIGN(addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK)
  53. /* See Documentation/X86_64/mm.txt for a description of the layout. */
  54. #define __START_KERNEL 0xffffffff80100000
  55. #define __START_KERNEL_map 0xffffffff80000000
  56. #define __PAGE_OFFSET           0x0000010000000000
  57. #ifndef __ASSEMBLY__
  58. #include <linux/config.h>
  59. #include <linux/stringify.h>
  60. /*
  61.  * Tell the user there is some problem.  The exception handler decodes this frame.
  62.  */
  63. struct bug_frame { 
  64.        unsigned char ud2[2];          
  65.        char *filename;    /* should use 32bit offset instead, but the assembler doesn't like it */ 
  66.        unsigned short line; 
  67. } __attribute__((packed)); 
  68. #define BUG() asm volatile("ud2 ; .quad %c1 ; .short %c0" :: "i"(__LINE__), 
  69. "i" (__stringify(KBUILD_BASENAME)))
  70. #define HEADER_BUG() asm volatile("ud2 ; .quad %c1 ; .short %c0" :: "i"(__LINE__), 
  71. "i" (__stringify(__FILE__)))
  72. #define PAGE_BUG(page) BUG()
  73. /* Pure 2^n version of get_order */
  74. extern __inline__ int get_order(unsigned long size)
  75. {
  76. int order;
  77. size = (size-1) >> (PAGE_SHIFT-1);
  78. order = -1;
  79. do {
  80. size >>= 1;
  81. order++;
  82. } while (size);
  83. return order;
  84. }
  85. #endif /* __ASSEMBLY__ */
  86. #define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET)
  87. /* Note: __pa(&symbol_visible_to_c) should be always replaced with __pa_symbol.
  88.    Otherwise you risk miscompilation. */ 
  89. #define __pa(x) (((unsigned long)(x)>=__START_KERNEL_map)?(unsigned long)(x) - (unsigned long)__START_KERNEL_map:(unsigned long)(x) - PAGE_OFFSET)
  90. /* __pa_symbol should use for C visible symbols, but only for them. 
  91.    This seems to be the official gcc blessed way to do such arithmetic. */ 
  92. #define __pa_symbol(x)
  93. ({unsigned long v;  
  94.   asm("" : "=r" (v) : "0" (x)); 
  95.  v - __START_KERNEL_map; })
  96. #define __pa_maybe_symbol(x)
  97. ({unsigned long v;  
  98.   asm("" : "=r" (v) : "0" (x)); 
  99.   __pa(v); })
  100. #define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET))
  101. #ifndef CONFIG_DISCONTIGMEM
  102. #define virt_to_page(kaddr) (mem_map + (__pa(kaddr) >> PAGE_SHIFT))
  103. #define pfn_to_page(pfn) (mem_map + (pfn)) 
  104. #define page_to_pfn(page)   ((page) - mem_map)
  105. #define page_to_phys(page) (((page) - mem_map) << PAGE_SHIFT)
  106. #define VALID_PAGE(page) (((page) - mem_map) < max_mapnr)
  107. #endif
  108. #define phys_to_pfn(phys) ((phys) >> PAGE_SHIFT)
  109. #define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | 
  110.  VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
  111. #endif /* __KERNEL__ */
  112. #endif /* _X86_64_PAGE_H */