1 #ifndef _ASM_IA64_PAGE_H
2 #define _ASM_IA64_PAGE_H
4 * Pagetable related stuff.
6 * Copyright (C) 1998, 1999 Hewlett-Packard Co
7 * Copyright (C) 1998, 1999 David Mosberger-Tang <davidm@hpl.hp.com>
10 #include <linux/config.h>
12 #include <asm/types.h>
15 * PAGE_SHIFT determines the actual kernel page size.
17 #if defined(CONFIG_IA64_PAGE_SIZE_4KB)
18 # define PAGE_SHIFT 12
19 #elif defined(CONFIG_IA64_PAGE_SIZE_8KB)
20 # define PAGE_SHIFT 13
21 #elif defined(CONFIG_IA64_PAGE_SIZE_16KB)
22 # define PAGE_SHIFT 14
23 #elif defined(CONFIG_IA64_PAGE_SIZE_64KB)
24 # define PAGE_SHIFT 16
26 # error Unsupported page size!
29 #define PAGE_SIZE (__IA64_UL_CONST(1) << PAGE_SHIFT)
30 #define PAGE_MASK (~(PAGE_SIZE - 1))
31 #define PAGE_ALIGN(addr) (((addr) + PAGE_SIZE - 1) & PAGE_MASK)
34 # define __pa(x) ((x) - PAGE_OFFSET)
35 # define __va(x) ((x) + PAGE_OFFSET)
36 #else /* !__ASSEMBLY */
38 # define STRICT_MM_TYPECHECKS
40 extern void clear_page (void *page
);
41 extern void copy_page (void *to
, void *from
);
43 # ifdef STRICT_MM_TYPECHECKS
45 * These are used to make use of C type-checking..
47 typedef struct { unsigned long pte
; } pte_t
;
48 typedef struct { unsigned long pmd
; } pmd_t
;
49 typedef struct { unsigned long pgd
; } pgd_t
;
50 typedef struct { unsigned long pgprot
; } pgprot_t
;
52 #define pte_val(x) ((x).pte)
53 #define pmd_val(x) ((x).pmd)
54 #define pgd_val(x) ((x).pgd)
55 #define pgprot_val(x) ((x).pgprot)
57 #define __pte(x) ((pte_t) { (x) } )
58 #define __pgd(x) ((pgd_t) { (x) } )
59 #define __pgprot(x) ((pgprot_t) { (x) } )
61 # else /* !STRICT_MM_TYPECHECKS */
63 * .. while these make it easier on the compiler
65 typedef unsigned long pte_t
;
66 typedef unsigned long pmd_t
;
67 typedef unsigned long pgd_t
;
68 typedef unsigned long pgprot_t
;
70 #define pte_val(x) (x)
71 #define pmd_val(x) (x)
72 #define pgd_val(x) (x)
73 #define pgprot_val(x) (x)
77 #define __pgprot(x) (x)
79 # endif /* !STRICT_MM_TYPECHECKS */
82 * Note: the MAP_NR() macro can't use __pa() because MAP_NR(X) MUST
83 * map to something >= max_mapnr if X is outside the identity mapped
88 * The dense variant can be used as long as the size of memory holes isn't
91 #define MAP_NR_DENSE(addr) (((unsigned long) (addr) - PAGE_OFFSET) >> PAGE_SHIFT)
94 * This variant works well for the SGI SN1 architecture (which does have huge
95 * holes in the memory address space).
97 #define MAP_NR_SN1(addr) (((unsigned long) (addr) - PAGE_OFFSET) >> PAGE_SHIFT)
99 #ifdef CONFIG_IA64_GENERIC
100 # define MAP_NR(addr) platform_map_nr(addr)
101 #elif defined (CONFIG_IA64_SN_SN1_SIM)
102 # define MAP_NR(addr) MAP_NR_SN1(addr)
104 # define MAP_NR(addr) MAP_NR_DENSE(addr)
107 # endif /* __KERNEL__ */
109 typedef union ia64_va
{
111 unsigned long off
: 61; /* intra-region offset */
112 unsigned long reg
: 3; /* region number */
119 * Note: These macros depend on the fact that PAGE_OFFSET has all
120 * region bits set to 1 and all other bits set to zero. They are
121 * expressed in this way to ensure they result in a single "dep"
124 #define __pa(x) ({ia64_va _v; _v.l = (long) (x); _v.f.reg = 0; _v.l;})
125 #define __va(x) ({ia64_va _v; _v.l = (long) (x); _v.f.reg = -1; _v.p;})
127 #define BUG() do { printk("kernel BUG at %s:%d!\n", __FILE__, __LINE__); *(int *)0=0; } while (0)
128 #define PAGE_BUG(page) do { BUG(); } while (0)
130 extern __inline__
int
131 get_order (unsigned long size
)
136 __asm__ ("getf.exp %0=%1" : "=r"(order
) : "f"(d
));
137 order
= order
- PAGE_SHIFT
- 0xffff + 1;
143 #endif /* !ASSEMBLY */
145 #define PAGE_OFFSET 0xe000000000000000
147 #endif /* _ASM_IA64_PAGE_H */