blob: 3b2d2af951c31058f87365378976c0560e42db63 [file] [log] [blame]
H. Peter Anvin1965aae2008-10-22 22:26:29 -07001#ifndef _ASM_X86_PAGE_H
2#define _ASM_X86_PAGE_H
Jeremy Fitzhardinge83a51012008-01-30 13:32:41 +01003
Jeremy Fitzhardinge11b7c7d2008-01-30 13:32:44 +01004#ifdef __KERNEL__
5
Jeremy Fitzhardinge51c78eb2009-02-08 22:52:14 -08006#include <asm/page_types.h>
Jeremy Fitzhardinge83a51012008-01-30 13:32:41 +01007
8#ifdef CONFIG_X86_64
Jeremy Fitzhardinge11b7c7d2008-01-30 13:32:44 +01009#include <asm/page_64.h>
10#else
11#include <asm/page_32.h>
Jeremy Fitzhardinge83a51012008-01-30 13:32:41 +010012#endif /* CONFIG_X86_64 */
13
Jeremy Fitzhardinge345b9042008-01-30 13:32:42 +010014#ifndef __ASSEMBLY__
Thomas Gleixner5f5192b2008-01-30 13:34:06 +010015
Jeremy Fitzhardinge345b9042008-01-30 13:32:42 +010016struct page;
17
Chuck Leverf2f7abc2008-03-04 14:55:45 -080018static inline void clear_user_page(void *page, unsigned long vaddr,
Jeremy Fitzhardinge51c78eb2009-02-08 22:52:14 -080019 struct page *pg)
Jeremy Fitzhardinge345b9042008-01-30 13:32:42 +010020{
21 clear_page(page);
22}
23
Chuck Leverf2f7abc2008-03-04 14:55:45 -080024static inline void copy_user_page(void *to, void *from, unsigned long vaddr,
Jeremy Fitzhardinge51c78eb2009-02-08 22:52:14 -080025 struct page *topage)
Jeremy Fitzhardinge345b9042008-01-30 13:32:42 +010026{
27 copy_page(to, from);
28}
29
30#define __alloc_zeroed_user_highpage(movableflags, vma, vaddr) \
31 alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO | movableflags, vma, vaddr)
32#define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
33
Ingo Molnar38f0f122008-01-30 13:32:43 +010034static inline pgd_t native_make_pgd(pgdval_t val)
35{
36 return (pgd_t) { val };
37}
38
39static inline pgdval_t native_pgd_val(pgd_t pgd)
40{
41 return pgd.pgd;
42}
43
Jeremy Fitzhardinge18a7a1992009-02-05 11:31:16 -080044static inline pgdval_t pgd_flags(pgd_t pgd)
45{
46 return native_pgd_val(pgd) & PTE_FLAGS_MASK;
47}
48
Ingo Molnar38f0f122008-01-30 13:32:43 +010049#if PAGETABLE_LEVELS >= 3
50#if PAGETABLE_LEVELS == 4
Ingo Molnar38f0f122008-01-30 13:32:43 +010051static inline pud_t native_make_pud(pmdval_t val)
52{
53 return (pud_t) { val };
54}
55
56static inline pudval_t native_pud_val(pud_t pud)
57{
58 return pud.pud;
59}
60#else /* PAGETABLE_LEVELS == 3 */
61#include <asm-generic/pgtable-nopud.h>
Jeremy Fitzhardinge2f98b2f2008-01-30 13:33:14 +010062
63static inline pudval_t native_pud_val(pud_t pud)
64{
65 return native_pgd_val(pud.pgd);
66}
Ingo Molnar38f0f122008-01-30 13:32:43 +010067#endif /* PAGETABLE_LEVELS == 4 */
68
Jeremy Fitzhardinge18a7a1992009-02-05 11:31:16 -080069static inline pudval_t pud_flags(pud_t pud)
70{
71 return native_pud_val(pud) & PTE_FLAGS_MASK;
72}
73
Ingo Molnar38f0f122008-01-30 13:32:43 +010074static inline pmd_t native_make_pmd(pmdval_t val)
75{
76 return (pmd_t) { val };
77}
78
79static inline pmdval_t native_pmd_val(pmd_t pmd)
80{
81 return pmd.pmd;
82}
Jeremy Fitzhardinge18a7a1992009-02-05 11:31:16 -080083
Ingo Molnar38f0f122008-01-30 13:32:43 +010084#else /* PAGETABLE_LEVELS == 2 */
85#include <asm-generic/pgtable-nopmd.h>
Jeremy Fitzhardinge2f98b2f2008-01-30 13:33:14 +010086
87static inline pmdval_t native_pmd_val(pmd_t pmd)
88{
89 return native_pgd_val(pmd.pud.pgd);
90}
Ingo Molnar38f0f122008-01-30 13:32:43 +010091#endif /* PAGETABLE_LEVELS >= 3 */
92
Ingo Molnarc47c1b12009-02-09 11:57:45 +010093static inline pmdval_t pmd_flags(pmd_t pmd)
94{
95 return native_pmd_val(pmd) & PTE_FLAGS_MASK;
96}
97
Jeremy Fitzhardingec8e53932008-01-30 13:32:57 +010098static inline pte_t native_make_pte(pteval_t val)
99{
100 return (pte_t) { .pte = val };
101}
102
103static inline pteval_t native_pte_val(pte_t pte)
104{
105 return pte.pte;
106}
107
Jeremy Fitzhardingeab897d22009-01-22 14:24:16 -0800108static inline pteval_t pte_flags(pte_t pte)
Rusty Russellc2e32772008-07-22 15:40:46 +1000109{
Jeremy Fitzhardinge77be1fa2008-07-21 22:59:56 -0700110 return native_pte_val(pte) & PTE_FLAGS_MASK;
Rusty Russellc2e32772008-07-22 15:40:46 +1000111}
112
Ingo Molnar38f0f122008-01-30 13:32:43 +0100113#define pgprot_val(x) ((x).pgprot)
114#define __pgprot(x) ((pgprot_t) { (x) } )
115
116#ifdef CONFIG_PARAVIRT
117#include <asm/paravirt.h>
118#else /* !CONFIG_PARAVIRT */
119
120#define pgd_val(x) native_pgd_val(x)
121#define __pgd(x) native_make_pgd(x)
122
123#ifndef __PAGETABLE_PUD_FOLDED
124#define pud_val(x) native_pud_val(x)
125#define __pud(x) native_make_pud(x)
126#endif
127
128#ifndef __PAGETABLE_PMD_FOLDED
129#define pmd_val(x) native_pmd_val(x)
130#define __pmd(x) native_make_pmd(x)
131#endif
132
133#define pte_val(x) native_pte_val(x)
134#define __pte(x) native_make_pte(x)
135
136#endif /* CONFIG_PARAVIRT */
137
Jeremy Fitzhardinge98fd5ae2008-01-30 13:32:43 +0100138#define __pa(x) __phys_addr((unsigned long)(x))
Vegard Nossumaf5c2bd2008-10-03 17:54:25 +0200139#define __pa_nodebug(x) __phys_addr_nodebug((unsigned long)(x))
Jeremy Fitzhardinge98fd5ae2008-01-30 13:32:43 +0100140/* __pa_symbol should be used for C visible symbols.
141 This seems to be the official gcc blessed way to do such arithmetic. */
142#define __pa_symbol(x) __pa(__phys_reloc_hide((unsigned long)(x)))
143
144#define __va(x) ((void *)((unsigned long)(x)+PAGE_OFFSET))
145
146#define __boot_va(x) __va(x)
147#define __boot_pa(x) __pa(x)
148
Vegard Nossumaf5c2bd2008-10-03 17:54:25 +0200149/*
150 * virt_to_page(kaddr) returns a valid pointer if and only if
151 * virt_addr_valid(kaddr) returns true.
152 */
Jeremy Fitzhardinge98fd5ae2008-01-30 13:32:43 +0100153#define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
154#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT)
Vegard Nossumaf5c2bd2008-10-03 17:54:25 +0200155extern bool __virt_addr_valid(unsigned long kaddr);
156#define virt_addr_valid(kaddr) __virt_addr_valid((unsigned long) (kaddr))
Jeremy Fitzhardinge98fd5ae2008-01-30 13:32:43 +0100157
Jeremy Fitzhardinge345b9042008-01-30 13:32:42 +0100158#endif /* __ASSEMBLY__ */
159
Jeremy Fitzhardingee62f4472008-01-30 13:32:44 +0100160#include <asm-generic/memory_model.h>
161#include <asm-generic/page.h>
162
163#define __HAVE_ARCH_GATE_AREA 1
Jeremy Fitzhardinge345b9042008-01-30 13:32:42 +0100164
Jeremy Fitzhardinge11b7c7d2008-01-30 13:32:44 +0100165#endif /* __KERNEL__ */
H. Peter Anvin1965aae2008-10-22 22:26:29 -0700166#endif /* _ASM_X86_PAGE_H */