diff options
Diffstat (limited to 'arch/x86/include/asm/fixmap.h')
-rw-r--r-- | arch/x86/include/asm/fixmap.h | 139 |
1 files changed, 137 insertions, 2 deletions
diff --git a/arch/x86/include/asm/fixmap.h b/arch/x86/include/asm/fixmap.h index 23696d44a0af..63a79c77d220 100644 --- a/arch/x86/include/asm/fixmap.h +++ b/arch/x86/include/asm/fixmap.h | |||
@@ -1,11 +1,145 @@ | |||
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 | |||
1 | #ifndef _ASM_X86_FIXMAP_H | 14 | #ifndef _ASM_X86_FIXMAP_H |
2 | #define _ASM_X86_FIXMAP_H | 15 | #define _ASM_X86_FIXMAP_H |
3 | 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 { | ||
4 | #ifdef CONFIG_X86_32 | 74 | #ifdef CONFIG_X86_32 |
5 | # include "fixmap_32.h" | 75 | FIX_HOLE, |
76 | FIX_VDSO, | ||
6 | #else | 77 | #else |
7 | # include "fixmap_64.h" | 78 | VSYSCALL_LAST_PAGE, |
79 | VSYSCALL_FIRST_PAGE = VSYSCALL_LAST_PAGE | ||
80 | + ((VSYSCALL_END-VSYSCALL_START) >> PAGE_SHIFT) - 1, | ||
81 | VSYSCALL_HPET, | ||
8 | #endif | 82 | #endif |
83 | FIX_DBGP_BASE, | ||
84 | FIX_EARLYCON_MEM_BASE, | ||
85 | #ifdef CONFIG_X86_LOCAL_APIC | ||
86 | FIX_APIC_BASE, /* local (CPU) APIC) -- required for SMP or not */ | ||
87 | #endif | ||
88 | #ifdef CONFIG_X86_IO_APIC | ||
89 | FIX_IO_APIC_BASE_0, | ||
90 | FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS - 1, | ||
91 | #endif | ||
92 | #ifdef CONFIG_X86_VISWS_APIC | ||
93 | FIX_CO_CPU, /* Cobalt timer */ | ||
94 | FIX_CO_APIC, /* Cobalt APIC Redirection Table */ | ||
95 | FIX_LI_PCIA, /* Lithium PCI Bridge A */ | ||
96 | FIX_LI_PCIB, /* Lithium PCI Bridge B */ | ||
97 | #endif | ||
98 | #ifdef CONFIG_X86_F00F_BUG | ||
99 | FIX_F00F_IDT, /* Virtual mapping for IDT */ | ||
100 | #endif | ||
101 | #ifdef CONFIG_X86_CYCLONE_TIMER | ||
102 | FIX_CYCLONE_TIMER, /*cyclone timer register*/ | ||
103 | #endif | ||
104 | #ifdef CONFIG_X86_32 | ||
105 | FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */ | ||
106 | FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1, | ||
107 | #ifdef CONFIG_PCI_MMCONFIG | ||
108 | FIX_PCIE_MCFG, | ||
109 | #endif | ||
110 | #endif | ||
111 | #ifdef CONFIG_PARAVIRT | ||
112 | FIX_PARAVIRT_BOOTMAP, | ||
113 | #endif | ||
114 | __end_of_permanent_fixed_addresses, | ||
115 | #ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT | ||
116 | FIX_OHCI1394_BASE, | ||
117 | #endif | ||
118 | /* | ||
119 | * 256 temporary boot-time mappings, used by early_ioremap(), | ||
120 | * before ioremap() is functional. | ||
121 | * | ||
122 | * We round it up to the next 256 pages boundary so that we | ||
123 | * can have a single pgd entry and a single pte table: | ||
124 | */ | ||
125 | #define NR_FIX_BTMAPS 64 | ||
126 | #define FIX_BTMAPS_SLOTS 4 | ||
127 | FIX_BTMAP_END = __end_of_permanent_fixed_addresses + 256 - | ||
128 | (__end_of_permanent_fixed_addresses & 255), | ||
129 | FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS*FIX_BTMAPS_SLOTS - 1, | ||
130 | #ifdef CONFIG_X86_32 | ||
131 | FIX_WP_TEST, | ||
132 | #endif | ||
133 | __end_of_fixed_addresses | ||
134 | }; | ||
135 | |||
136 | |||
137 | extern void reserve_top_address(unsigned long reserve); | ||
138 | |||
139 | #define FIXADDR_SIZE (__end_of_permanent_fixed_addresses << PAGE_SHIFT) | ||
140 | #define FIXADDR_BOOT_SIZE (__end_of_fixed_addresses << PAGE_SHIFT) | ||
141 | #define FIXADDR_START (FIXADDR_TOP - FIXADDR_SIZE) | ||
142 | #define FIXADDR_BOOT_START (FIXADDR_TOP - FIXADDR_BOOT_SIZE) | ||
9 | 143 | ||
10 | extern int fixmaps_set; | 144 | extern int fixmaps_set; |
11 | 145 | ||
@@ -69,4 +203,5 @@ static inline unsigned long virt_to_fix(const unsigned long vaddr) | |||
69 | BUG_ON(vaddr >= FIXADDR_TOP || vaddr < FIXADDR_START); | 203 | BUG_ON(vaddr >= FIXADDR_TOP || vaddr < FIXADDR_START); |
70 | return __virt_to_fix(vaddr); | 204 | return __virt_to_fix(vaddr); |
71 | } | 205 | } |
206 | #endif /* !__ASSEMBLY__ */ | ||
72 | #endif /* _ASM_X86_FIXMAP_H */ | 207 | #endif /* _ASM_X86_FIXMAP_H */ |