File: /usr/src/linux/include/asm-sparc64/page.h

1     /* $Id: page.h,v 1.36 2000/08/10 01:04:53 davem Exp $ */
2     
3     #ifndef _SPARC64_PAGE_H
4     #define _SPARC64_PAGE_H
5     
6     #define PAGE_SHIFT   13
7     #ifndef __ASSEMBLY__
8     /* I have my suspicions... -DaveM */
9     #define PAGE_SIZE    (1UL << PAGE_SHIFT)
10     #else
11     #define PAGE_SIZE    (1 << PAGE_SHIFT)
12     #endif
13     
14     #define PAGE_MASK    (~(PAGE_SIZE-1))
15     
16     
17     #ifdef __KERNEL__
18     
19     #ifndef __ASSEMBLY__
20     
21     #define BUG()		__builtin_trap()
22     #define PAGE_BUG(page)	BUG()
23     
24     extern void _clear_page(void *page);
25     extern void _copy_page(void *to, void *from);
26     #define clear_page(X)	_clear_page((void *)(X))
27     #define copy_page(X,Y)	_copy_page((void *)(X), (void *)(Y))
28     extern void clear_user_page(void *page, unsigned long vaddr);
29     extern void copy_user_page(void *to, void *from, unsigned long vaddr);
30     
31     /* GROSS, defining this makes gcc pass these types as aggregates,
32      * and thus on the stack, turn this crap off... -DaveM
33      */
34     
35     /* #define STRICT_MM_TYPECHECKS */
36     
37     #ifdef STRICT_MM_TYPECHECKS
38     /* These are used to make use of C type-checking.. */
39     typedef struct { unsigned long pte; } pte_t;
40     typedef struct { unsigned long iopte; } iopte_t;
41     typedef struct { unsigned int pmd; } pmd_t;
42     typedef struct { unsigned int pgd; } pgd_t;
43     typedef struct { unsigned long ctxd; } ctxd_t;
44     typedef struct { unsigned long pgprot; } pgprot_t;
45     typedef struct { unsigned long iopgprot; } iopgprot_t;
46     
47     #define pte_val(x)	((x).pte)
48     #define iopte_val(x)	((x).iopte)
49     #define pmd_val(x)      ((unsigned long)(x).pmd)
50     #define pgd_val(x)	((unsigned long)(x).pgd)
51     #define ctxd_val(x)	((x).ctxd)
52     #define pgprot_val(x)	((x).pgprot)
53     #define iopgprot_val(x)	((x).iopgprot)
54     
55     #define __pte(x)	((pte_t) { (x) } )
56     #define __iopte(x)	((iopte_t) { (x) } )
57     #define __pmd(x)        ((pmd_t) { (x) } )
58     #define __pgd(x)	((pgd_t) { (x) } )
59     #define __ctxd(x)	((ctxd_t) { (x) } )
60     #define __pgprot(x)	((pgprot_t) { (x) } )
61     #define __iopgprot(x)	((iopgprot_t) { (x) } )
62     
63     #else
64     /* .. while these make it easier on the compiler */
65     typedef unsigned long pte_t;
66     typedef unsigned long iopte_t;
67     typedef unsigned int pmd_t;
68     typedef unsigned int pgd_t;
69     typedef unsigned long ctxd_t;
70     typedef unsigned long pgprot_t;
71     typedef unsigned long iopgprot_t;
72     
73     #define pte_val(x)	(x)
74     #define iopte_val(x)	(x)
75     #define pmd_val(x)      ((unsigned long)(x))
76     #define pgd_val(x)	((unsigned long)(x))
77     #define ctxd_val(x)	(x)
78     #define pgprot_val(x)	(x)
79     #define iopgprot_val(x)	(x)
80     
81     #define __pte(x)	(x)
82     #define __iopte(x)	(x)
83     #define __pmd(x)        (x)
84     #define __pgd(x)	(x)
85     #define __ctxd(x)	(x)
86     #define __pgprot(x)	(x)
87     #define __iopgprot(x)	(x)
88     
89     #endif /* (STRICT_MM_TYPECHECKS) */
90     
91     #define TASK_UNMAPPED_BASE	((current->thread.flags & SPARC_FLAG_32BIT) ? \
92     				 (0x0000000070000000UL) : (PAGE_OFFSET))
93     
94     #endif /* !(__ASSEMBLY__) */
95     
96     /* to align the pointer to the (next) page boundary */
97     #define PAGE_ALIGN(addr)	(((addr)+PAGE_SIZE-1)&PAGE_MASK)
98     
99     #ifndef __ASSEMBLY__
100     /* Do prdele, look what happens to be in %g4... */
101     register unsigned long PAGE_OFFSET asm("g4");
102     #else
103     #define PAGE_OFFSET		0xFFFFF80000000000
104     #endif
105     
106     #define __pa(x)			((unsigned long)(x) - PAGE_OFFSET)
107     #define __va(x)			((void *)((unsigned long) (x) + PAGE_OFFSET))
108     #define virt_to_page(kaddr)	(mem_map + ((__pa(kaddr)-phys_base) >> PAGE_SHIFT))
109     #define VALID_PAGE(page)	((page - mem_map) < max_mapnr)
110     
111     #define virt_to_phys __pa
112     #define phys_to_virt __va
113     
114     #ifndef __ASSEMBLY__
115     
116     /* The following structure is used to hold the physical
117      * memory configuration of the machine.  This is filled in
118      * probe_memory() and is later used by mem_init() to set up
119      * mem_map[].  We statically allocate SPARC_PHYS_BANKS of
120      * these structs, this is arbitrary.  The entry after the
121      * last valid one has num_bytes==0.
122      */
123     
124     struct sparc_phys_banks {
125     	unsigned long base_addr;
126     	unsigned long num_bytes;
127     };
128     
129     #define SPARC_PHYS_BANKS 32
130     
131     extern struct sparc_phys_banks sp_banks[SPARC_PHYS_BANKS];
132     
133     /* Pure 2^n version of get_order */
134     extern __inline__ int get_order(unsigned long size)
135     {
136     	int order;
137     
138     	size = (size-1) >> (PAGE_SHIFT-1);
139     	order = -1;
140     	do {
141     		size >>= 1;
142     		order++;
143     	} while (size);
144     	return order;
145     }
146     
147     #endif /* !(__ASSEMBLY__) */
148     
149     #endif /* !(__KERNEL__) */
150     
151     #endif /* !(_SPARC64_PAGE_H) */
152