Branch data Line data Source code
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 : : /*
18 : : * Exposed to assembly code for setting up initial page tables. Cannot be
19 : : * calculated in assembly code (fixmap entries are an enum), but is sanity
20 : : * checked in the actual fixmap C code to make sure that the fixmap is
21 : : * covered fully.
22 : : */
23 : : #define FIXMAP_PMD_NUM 2
24 : : /* fixmap starts downwards from the 507th entry in level2_fixmap_pgt */
25 : : #define FIXMAP_PMD_TOP 507
26 : :
27 : : #ifndef __ASSEMBLY__
28 : : #include <linux/kernel.h>
29 : : #include <asm/acpi.h>
30 : : #include <asm/apicdef.h>
31 : : #include <asm/page.h>
32 : : #ifdef CONFIG_X86_32
33 : : #include <linux/threads.h>
34 : : #include <asm/kmap_types.h>
35 : : #else
36 : : #include <uapi/asm/vsyscall.h>
37 : : #endif
38 : :
39 : : /*
40 : : * We can't declare FIXADDR_TOP as variable for x86_64 because vsyscall
41 : : * uses fixmaps that relies on FIXADDR_TOP for proper address calculation.
42 : : * Because of this, FIXADDR_TOP x86 integration was left as later work.
43 : : */
44 : : #ifdef CONFIG_X86_32
45 : : /*
46 : : * Leave one empty page between vmalloc'ed areas and
47 : : * the start of the fixmap.
48 : : */
49 : : extern unsigned long __FIXADDR_TOP;
50 : : #define FIXADDR_TOP ((unsigned long)__FIXADDR_TOP)
51 : : #else
52 : : #define FIXADDR_TOP (round_up(VSYSCALL_ADDR + PAGE_SIZE, 1<<PMD_SHIFT) - \
53 : : PAGE_SIZE)
54 : : #endif
55 : :
56 : : /*
57 : : * Here we define all the compile-time 'special' virtual
58 : : * addresses. The point is to have a constant address at
59 : : * compile time, but to set the physical address only
60 : : * in the boot process.
61 : : * for x86_32: We allocate these special addresses
62 : : * from the end of virtual memory (0xfffff000) backwards.
63 : : * Also this lets us do fail-safe vmalloc(), we
64 : : * can guarantee that these special addresses and
65 : : * vmalloc()-ed addresses never overlap.
66 : : *
67 : : * These 'compile-time allocated' memory buffers are
68 : : * fixed-size 4k pages (or larger if used with an increment
69 : : * higher than 1). Use set_fixmap(idx,phys) to associate
70 : : * physical memory with fixmap indices.
71 : : *
72 : : * TLB entries of such buffers will not be flushed across
73 : : * task switches.
74 : : */
75 : : enum fixed_addresses {
76 : : #ifdef CONFIG_X86_32
77 : : FIX_HOLE,
78 : : #else
79 : : #ifdef CONFIG_X86_VSYSCALL_EMULATION
80 : : VSYSCALL_PAGE = (FIXADDR_TOP - VSYSCALL_ADDR) >> PAGE_SHIFT,
81 : : #endif
82 : : #endif
83 : : FIX_DBGP_BASE,
84 : : FIX_EARLYCON_MEM_BASE,
85 : : #ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT
86 : : FIX_OHCI1394_BASE,
87 : : #endif
88 : : #ifdef CONFIG_X86_LOCAL_APIC
89 : : FIX_APIC_BASE, /* local (CPU) APIC) -- required for SMP or not */
90 : : #endif
91 : : #ifdef CONFIG_X86_IO_APIC
92 : : FIX_IO_APIC_BASE_0,
93 : : FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS - 1,
94 : : #endif
95 : : #ifdef CONFIG_X86_32
96 : : FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */
97 : : FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1,
98 : : #ifdef CONFIG_PCI_MMCONFIG
99 : : FIX_PCIE_MCFG,
100 : : #endif
101 : : #endif
102 : : #ifdef CONFIG_PARAVIRT
103 : : FIX_PARAVIRT_BOOTMAP,
104 : : #endif
105 : : #ifdef CONFIG_X86_INTEL_MID
106 : : FIX_LNW_VRTC,
107 : : #endif
108 : :
109 : : #ifdef CONFIG_ACPI_APEI_GHES
110 : : /* Used for GHES mapping from assorted contexts */
111 : : FIX_APEI_GHES_IRQ,
112 : : FIX_APEI_GHES_NMI,
113 : : #endif
114 : :
115 : : __end_of_permanent_fixed_addresses,
116 : :
117 : : /*
118 : : * 512 temporary boot-time mappings, used by early_ioremap(),
119 : : * before ioremap() is functional.
120 : : *
121 : : * If necessary we round it up to the next 512 pages boundary so
122 : : * that we can have a single pmd entry and a single pte table:
123 : : */
124 : : #define NR_FIX_BTMAPS 64
125 : : #define FIX_BTMAPS_SLOTS 8
126 : : #define TOTAL_FIX_BTMAPS (NR_FIX_BTMAPS * FIX_BTMAPS_SLOTS)
127 : : FIX_BTMAP_END =
128 : : (__end_of_permanent_fixed_addresses ^
129 : : (__end_of_permanent_fixed_addresses + TOTAL_FIX_BTMAPS - 1)) &
130 : : -PTRS_PER_PTE
131 : : ? __end_of_permanent_fixed_addresses + TOTAL_FIX_BTMAPS -
132 : : (__end_of_permanent_fixed_addresses & (TOTAL_FIX_BTMAPS - 1))
133 : : : __end_of_permanent_fixed_addresses,
134 : : FIX_BTMAP_BEGIN = FIX_BTMAP_END + TOTAL_FIX_BTMAPS - 1,
135 : : #ifdef CONFIG_X86_32
136 : : FIX_WP_TEST,
137 : : #endif
138 : : #ifdef CONFIG_INTEL_TXT
139 : : FIX_TBOOT_BASE,
140 : : #endif
141 : : __end_of_fixed_addresses
142 : : };
143 : :
144 : :
145 : : extern void reserve_top_address(unsigned long reserve);
146 : :
147 : : #define FIXADDR_SIZE (__end_of_permanent_fixed_addresses << PAGE_SHIFT)
148 : : #define FIXADDR_START (FIXADDR_TOP - FIXADDR_SIZE)
149 : : #define FIXADDR_TOT_SIZE (__end_of_fixed_addresses << PAGE_SHIFT)
150 : : #define FIXADDR_TOT_START (FIXADDR_TOP - FIXADDR_TOT_SIZE)
151 : :
152 : : extern int fixmaps_set;
153 : :
154 : : extern pte_t *kmap_pte;
155 : : #define kmap_prot PAGE_KERNEL
156 : : extern pte_t *pkmap_page_table;
157 : :
158 : : void __native_set_fixmap(enum fixed_addresses idx, pte_t pte);
159 : : void native_set_fixmap(unsigned /* enum fixed_addresses */ idx,
160 : : phys_addr_t phys, pgprot_t flags);
161 : :
162 : : #ifndef CONFIG_PARAVIRT_XXL
163 : 90 : static inline void __set_fixmap(enum fixed_addresses idx,
164 : : phys_addr_t phys, pgprot_t flags)
165 : : {
166 : 90 : native_set_fixmap(idx, phys, flags);
167 : : }
168 : : #endif
169 : :
170 : : /*
171 : : * FIXMAP_PAGE_NOCACHE is used for MMIO. Memory encryption is not
172 : : * supported for MMIO addresses, so make sure that the memory encryption
173 : : * mask is not part of the page attributes.
174 : : */
175 : : #define FIXMAP_PAGE_NOCACHE PAGE_KERNEL_IO_NOCACHE
176 : :
177 : : /*
178 : : * Early memremap routines used for in-place encryption. The mappings created
179 : : * by these routines are intended to be used as temporary mappings.
180 : : */
181 : : void __init *early_memremap_encrypted(resource_size_t phys_addr,
182 : : unsigned long size);
183 : : void __init *early_memremap_encrypted_wp(resource_size_t phys_addr,
184 : : unsigned long size);
185 : : void __init *early_memremap_decrypted(resource_size_t phys_addr,
186 : : unsigned long size);
187 : : void __init *early_memremap_decrypted_wp(resource_size_t phys_addr,
188 : : unsigned long size);
189 : :
190 : : #include <asm-generic/fixmap.h>
191 : :
192 : : #define __late_set_fixmap(idx, phys, flags) __set_fixmap(idx, phys, flags)
193 : : #define __late_clear_fixmap(idx) __set_fixmap(idx, 0, __pgprot(0))
194 : :
195 : : void __early_set_fixmap(enum fixed_addresses idx,
196 : : phys_addr_t phys, pgprot_t flags);
197 : :
198 : : #endif /* !__ASSEMBLY__ */
199 : : #endif /* _ASM_X86_FIXMAP_H */
|