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