1#ifndef _ALPHA_PAGE_H
2#define _ALPHA_PAGE_H
3
4#include <asm/pal.h>
5
6/* PAGE_SHIFT determines the page size */
7#define PAGE_SHIFT	13
8#define PAGE_SIZE	(1UL << PAGE_SHIFT)
9#define PAGE_MASK	(~(PAGE_SIZE-1))
10
11#ifdef __KERNEL__
12
13#ifndef __ASSEMBLY__
14
15#define STRICT_MM_TYPECHECKS
16
17extern void clear_page(void *page);
18#define clear_user_page(page, vaddr)	clear_page(page)
19
20extern void copy_page(void * _to, void * _from);
21#define copy_user_page(to, from, vaddr)	copy_page(to, from)
22
23#ifdef STRICT_MM_TYPECHECKS
24/*
25 * These are used to make use of C type-checking..
26 */
27typedef struct { unsigned long pte; } pte_t;
28typedef struct { unsigned long pmd; } pmd_t;
29typedef struct { unsigned long pgd; } pgd_t;
30typedef struct { unsigned long pgprot; } pgprot_t;
31
32#define pte_val(x)	((x).pte)
33#define pmd_val(x)	((x).pmd)
34#define pgd_val(x)	((x).pgd)
35#define pgprot_val(x)	((x).pgprot)
36
37#define __pte(x)	((pte_t) { (x) } )
38#define __pmd(x)	((pmd_t) { (x) } )
39#define __pgd(x)	((pgd_t) { (x) } )
40#define __pgprot(x)	((pgprot_t) { (x) } )
41
42#else
43/*
44 * .. while these make it easier on the compiler
45 */
46typedef unsigned long pte_t;
47typedef unsigned long pmd_t;
48typedef unsigned long pgd_t;
49typedef unsigned long pgprot_t;
50
51#define pte_val(x)	(x)
52#define pmd_val(x)	(x)
53#define pgd_val(x)	(x)
54#define pgprot_val(x)	(x)
55
56#define __pte(x)	(x)
57#define __pgd(x)	(x)
58#define __pgprot(x)	(x)
59
60#endif /* STRICT_MM_TYPECHECKS */
61
62#define BUG()									\
63do {										\
64	printk("kernel BUG at %s:%d!\n", __FILE__, __LINE__);			\
65	__asm__ __volatile__("call_pal %0  # bugchk" : : "i" (PAL_bugchk));	\
66} while (0)
67#define PAGE_BUG(page)	BUG()
68
69/* Pure 2^n version of get_order */
70extern __inline__ int get_order(unsigned long size)
71{
72	int order;
73
74	size = (size-1) >> (PAGE_SHIFT-1);
75	order = -1;
76	do {
77		size >>= 1;
78		order++;
79	} while (size);
80	return order;
81}
82
83#endif /* !__ASSEMBLY__ */
84
85/* to align the pointer to the (next) page boundary */
86#define PAGE_ALIGN(addr)	(((addr)+PAGE_SIZE-1)&PAGE_MASK)
87
88#ifdef USE_48_BIT_KSEG
89#define PAGE_OFFSET		0xffff800000000000
90#else
91#define PAGE_OFFSET		0xfffffc0000000000
92#endif
93
94#define __pa(x)			((unsigned long) (x) - PAGE_OFFSET)
95#define __va(x)			((void *)((unsigned long) (x) + PAGE_OFFSET))
96#ifndef CONFIG_DISCONTIGMEM
97#define virt_to_page(kaddr)	(mem_map + (__pa(kaddr) >> PAGE_SHIFT))
98#define VALID_PAGE(page)	(((page) - mem_map) < max_mapnr)
99#endif /* CONFIG_DISCONTIGMEM */
100
101#define VM_DATA_DEFAULT_FLAGS		(VM_READ | VM_WRITE | VM_EXEC | \
102					 VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
103
104#endif /* __KERNEL__ */
105
106#endif /* _ALPHA_PAGE_H */
107