Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
x86
include
asm
fixmap.h
Go to the documentation of this file.
1
/*
2
* fixmap.h: compile-time virtual memory allocation
3
*
4
* This file is subject to the terms and conditions of the GNU General Public
5
* License. See the file "COPYING" in the main directory of this archive
6
* for more details.
7
*
8
* Copyright (C) 1998 Ingo Molnar
9
*
10
* Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
11
* x86_32 and x86_64 integration by Gustavo F. Padovan, February 2009
12
*/
13
14
#ifndef _ASM_X86_FIXMAP_H
15
#define _ASM_X86_FIXMAP_H
16
17
#ifndef __ASSEMBLY__
18
#include <linux/kernel.h>
19
#include <asm/acpi.h>
20
#include <
asm/apicdef.h
>
21
#include <asm/page.h>
22
#ifdef CONFIG_X86_32
23
#include <
linux/threads.h
>
24
#include <asm/kmap_types.h>
25
#else
26
#include <
asm/vsyscall.h
>
27
#endif
28
29
/*
30
* We can't declare FIXADDR_TOP as variable for x86_64 because vsyscall
31
* uses fixmaps that relies on FIXADDR_TOP for proper address calculation.
32
* Because of this, FIXADDR_TOP x86 integration was left as later work.
33
*/
34
#ifdef CONFIG_X86_32
35
/* used by vmalloc.c, vsyscall.lds.S.
36
*
37
* Leave one empty page between vmalloc'ed areas and
38
* the start of the fixmap.
39
*/
40
extern
unsigned
long
__FIXADDR_TOP
;
41
#define FIXADDR_TOP ((unsigned long)__FIXADDR_TOP)
42
43
#define FIXADDR_USER_START __fix_to_virt(FIX_VDSO)
44
#define FIXADDR_USER_END __fix_to_virt(FIX_VDSO - 1)
45
#else
46
#define FIXADDR_TOP (VSYSCALL_END-PAGE_SIZE)
47
48
/* Only covers 32bit vsyscalls currently. Need another set for 64bit. */
49
#define FIXADDR_USER_START ((unsigned long)VSYSCALL32_VSYSCALL)
50
#define FIXADDR_USER_END (FIXADDR_USER_START + PAGE_SIZE)
51
#endif
52
53
54
/*
55
* Here we define all the compile-time 'special' virtual
56
* addresses. The point is to have a constant address at
57
* compile time, but to set the physical address only
58
* in the boot process.
59
* for x86_32: We allocate these special addresses
60
* from the end of virtual memory (0xfffff000) backwards.
61
* Also this lets us do fail-safe vmalloc(), we
62
* can guarantee that these special addresses and
63
* vmalloc()-ed addresses never overlap.
64
*
65
* These 'compile-time allocated' memory buffers are
66
* fixed-size 4k pages (or larger if used with an increment
67
* higher than 1). Use set_fixmap(idx,phys) to associate
68
* physical memory with fixmap indices.
69
*
70
* TLB entries of such buffers will not be flushed across
71
* task switches.
72
*/
73
enum
fixed_addresses
{
74
#ifdef CONFIG_X86_32
75
FIX_HOLE
,
76
FIX_VDSO,
77
#else
78
VSYSCALL_LAST_PAGE
,
79
VSYSCALL_FIRST_PAGE
=
VSYSCALL_LAST_PAGE
80
+ ((
VSYSCALL_END
-
VSYSCALL_START
) >>
PAGE_SHIFT
) - 1,
81
VVAR_PAGE
,
82
VSYSCALL_HPET
,
83
#endif
84
FIX_DBGP_BASE
,
85
FIX_EARLYCON_MEM_BASE
,
86
#ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT
87
FIX_OHCI1394_BASE,
88
#endif
89
#ifdef CONFIG_X86_LOCAL_APIC
90
FIX_APIC_BASE,
/* local (CPU) APIC) -- required for SMP or not */
91
#endif
92
#ifdef CONFIG_X86_IO_APIC
93
FIX_IO_APIC_BASE_0,
94
FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 +
MAX_IO_APICS
- 1,
95
#endif
96
#ifdef CONFIG_X86_VISWS_APIC
97
FIX_CO_CPU,
/* Cobalt timer */
98
FIX_CO_APIC,
/* Cobalt APIC Redirection Table */
99
FIX_LI_PCIA,
/* Lithium PCI Bridge A */
100
FIX_LI_PCIB,
/* Lithium PCI Bridge B */
101
#endif
102
#ifdef CONFIG_X86_F00F_BUG
103
FIX_F00F_IDT,
/* Virtual mapping for IDT */
104
#endif
105
#ifdef CONFIG_X86_CYCLONE_TIMER
106
FIX_CYCLONE_TIMER,
/*cyclone timer register*/
107
#endif
108
#ifdef CONFIG_X86_32
109
FIX_KMAP_BEGIN
,
/* reserved pte's for temporary kernel mappings */
110
FIX_KMAP_END
=
FIX_KMAP_BEGIN
+(
KM_TYPE_NR
*
NR_CPUS
)-1,
111
#ifdef CONFIG_PCI_MMCONFIG
112
FIX_PCIE_MCFG,
113
#
endif
114
#
endif
115
#ifdef CONFIG_PARAVIRT
116
FIX_PARAVIRT_BOOTMAP,
117
#
endif
118
FIX_TEXT_POKE1
,
/* reserve 2 pages for text_poke() */
119
FIX_TEXT_POKE0
,
/* first page is last, because allocation is backward */
120
#ifdef CONFIG_X86_INTEL_MID
121
FIX_LNW_VRTC,
122
#
endif
123
__end_of_permanent_fixed_addresses
,
124
125
/*
126
* 256 temporary boot-time mappings, used by early_ioremap(),
127
* before ioremap() is functional.
128
*
129
* If necessary we round it up to the next 256 pages boundary so
130
* that we can have a single pgd entry and a single pte table:
131
*/
132
#define
NR_FIX_BTMAPS
64
133
#define
FIX_BTMAPS_SLOTS
4
134
#define
TOTAL_FIX_BTMAPS
(
NR_FIX_BTMAPS
*
FIX_BTMAPS_SLOTS
)
135
FIX_BTMAP_END
=
136
(
__end_of_permanent_fixed_addresses
^
137
(
__end_of_permanent_fixed_addresses
+
TOTAL_FIX_BTMAPS
- 1)) &
138
-
PTRS_PER_PTE
139
?
__end_of_permanent_fixed_addresses
+
TOTAL_FIX_BTMAPS
-
140
(
__end_of_permanent_fixed_addresses
& (
TOTAL_FIX_BTMAPS
- 1))
141
:
__end_of_permanent_fixed_addresses
,
142
FIX_BTMAP_BEGIN
=
FIX_BTMAP_END
+ TOTAL_FIX_BTMAPS - 1,
143
#ifdef CONFIG_X86_32
144
FIX_WP_TEST,
145
#
endif
146
#ifdef CONFIG_INTEL_TXT
147
FIX_TBOOT_BASE,
148
#
endif
149
__end_of_fixed_addresses
150
};
151
152
153
extern
void
reserve_top_address
(
unsigned
long
reserve
);
154
155
#define FIXADDR_SIZE (__end_of_permanent_fixed_addresses << PAGE_SHIFT)
156
#define FIXADDR_BOOT_SIZE (__end_of_fixed_addresses << PAGE_SHIFT)
157
#define FIXADDR_START (FIXADDR_TOP - FIXADDR_SIZE)
158
#define FIXADDR_BOOT_START (FIXADDR_TOP - FIXADDR_BOOT_SIZE)
159
160
extern
int
fixmaps_set
;
161
162
extern
pte_t
*
kmap_pte
;
163
extern
pgprot_t
kmap_prot
;
164
extern
pte_t
*
pkmap_page_table
;
165
166
void
__native_set_fixmap
(
enum
fixed_addresses
idx
,
pte_t
pte
);
167
void
native_set_fixmap
(
enum
fixed_addresses
idx
,
168
phys_addr_t
phys
,
pgprot_t
flags
);
169
170
#ifndef CONFIG_PARAVIRT
171
static
inline
void
__set_fixmap
(
enum
fixed_addresses
idx
,
172
phys_addr_t
phys
,
pgprot_t
flags
)
173
{
174
native_set_fixmap
(idx, phys, flags);
175
}
176
#endif
177
178
#define set_fixmap(idx, phys) \
179
__set_fixmap(idx, phys, PAGE_KERNEL)
180
181
/*
182
* Some hardware wants to get fixmapped without caching.
183
*/
184
#define set_fixmap_nocache(idx, phys) \
185
__set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE)
186
187
#define clear_fixmap(idx) \
188
__set_fixmap(idx, 0, __pgprot(0))
189
190
#define __fix_to_virt(x) (FIXADDR_TOP - ((x) << PAGE_SHIFT))
191
#define __virt_to_fix(x) ((FIXADDR_TOP - ((x)&PAGE_MASK)) >> PAGE_SHIFT)
192
193
extern
void
__this_fixmap_does_not_exist
(
void
);
194
195
/*
196
* 'index to address' translation. If anyone tries to use the idx
197
* directly without translation, we catch the bug with a NULL-deference
198
* kernel oops. Illegal ranges of incoming indices are caught too.
199
*/
200
static
__always_inline
unsigned
long
fix_to_virt(
const
unsigned
int
idx
)
201
{
202
/*
203
* this branch gets completely eliminated after inlining,
204
* except when someone tries to use fixaddr indices in an
205
* illegal way. (such as mixing up address types or using
206
* out-of-range indices).
207
*
208
* If it doesn't get removed, the linker will complain
209
* loudly with a reasonably clear error message..
210
*/
211
if
(idx >=
__end_of_fixed_addresses
)
212
__this_fixmap_does_not_exist
();
213
214
return
__fix_to_virt
(idx);
215
}
216
217
static
inline
unsigned
long
virt_to_fix(
const
unsigned
long
vaddr
)
218
{
219
BUG_ON
(vaddr >=
FIXADDR_TOP
|| vaddr <
FIXADDR_START
);
220
return
__virt_to_fix
(vaddr);
221
}
222
223
/* Return an pointer with offset calculated */
224
static
__always_inline
unsigned
long
225
__set_fixmap_offset(
enum
fixed_addresses
idx,
phys_addr_t
phys
,
pgprot_t
flags
)
226
{
227
__set_fixmap
(idx, phys, flags);
228
return
fix_to_virt(idx) + (phys & (
PAGE_SIZE
- 1));
229
}
230
231
#define set_fixmap_offset(idx, phys) \
232
__set_fixmap_offset(idx, phys, PAGE_KERNEL)
233
234
#define set_fixmap_offset_nocache(idx, phys) \
235
__set_fixmap_offset(idx, phys, PAGE_KERNEL_NOCACHE)
236
237
#endif
/* !__ASSEMBLY__ */
238
#endif
/* _ASM_X86_FIXMAP_H */
Generated on Thu Jan 10 2013 12:55:06 for Linux Kernel by
1.8.2