Subversion Repositories Kolibri OS

Rev

Rev 6934 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
6588 serge 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 
19
#include 
20
#include 
21
#include 
22
#ifdef CONFIG_X86_32
23
#include 
24
#include 
25
#else
26
#include 
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
#else
43
#define FIXADDR_TOP	(round_up(VSYSCALL_ADDR + PAGE_SIZE, 1<
44
			 PAGE_SIZE)
45
#endif
46
 
47
 
48
/*
49
 * Here we define all the compile-time 'special' virtual
50
 * addresses. The point is to have a constant address at
51
 * compile time, but to set the physical address only
52
 * in the boot process.
53
 * for x86_32: We allocate these special addresses
54
 * from the end of virtual memory (0xfffff000) backwards.
55
 * Also this lets us do fail-safe vmalloc(), we
56
 * can guarantee that these special addresses and
57
 * vmalloc()-ed addresses never overlap.
58
 *
59
 * These 'compile-time allocated' memory buffers are
60
 * fixed-size 4k pages (or larger if used with an increment
61
 * higher than 1). Use set_fixmap(idx,phys) to associate
62
 * physical memory with fixmap indices.
63
 *
64
 * TLB entries of such buffers will not be flushed across
65
 * task switches.
66
 */
67
enum fixed_addresses {
68
#ifdef CONFIG_X86_32
69
	FIX_HOLE,
70
#else
71
#ifdef CONFIG_X86_VSYSCALL_EMULATION
72
	VSYSCALL_PAGE = (FIXADDR_TOP - VSYSCALL_ADDR) >> PAGE_SHIFT,
73
#endif
74
#endif
75
	FIX_DBGP_BASE,
76
	FIX_EARLYCON_MEM_BASE,
77
#ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT
78
	FIX_OHCI1394_BASE,
79
#endif
80
#ifdef CONFIG_X86_LOCAL_APIC
81
	FIX_APIC_BASE,	/* local (CPU) APIC) -- required for SMP or not */
82
#endif
83
#ifdef CONFIG_X86_IO_APIC
84
	FIX_IO_APIC_BASE_0,
85
	FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS - 1,
86
#endif
87
	FIX_RO_IDT,	/* Virtual mapping for read-only IDT */
88
#ifdef CONFIG_X86_32
89
	FIX_KMAP_BEGIN,	/* reserved pte's for temporary kernel mappings */
90
	FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1,
91
#ifdef CONFIG_PCI_MMCONFIG
92
	FIX_PCIE_MCFG,
93
#endif
94
#endif
95
#ifdef CONFIG_PARAVIRT
96
	FIX_PARAVIRT_BOOTMAP,
97
#endif
98
	FIX_TEXT_POKE1,	/* reserve 2 pages for text_poke() */
99
	FIX_TEXT_POKE0, /* first page is last, because allocation is backward */
100
#ifdef	CONFIG_X86_INTEL_MID
101
	FIX_LNW_VRTC,
102
#endif
103
	__end_of_permanent_fixed_addresses,
104
 
105
	/*
106
	 * 512 temporary boot-time mappings, used by early_ioremap(),
107
	 * before ioremap() is functional.
108
	 *
109
	 * If necessary we round it up to the next 512 pages boundary so
110
	 * that we can have a single pgd entry and a single pte table:
111
	 */
112
#define NR_FIX_BTMAPS		64
113
#define FIX_BTMAPS_SLOTS	8
114
#define TOTAL_FIX_BTMAPS	(NR_FIX_BTMAPS * FIX_BTMAPS_SLOTS)
115
	FIX_BTMAP_END =
116
	 (__end_of_permanent_fixed_addresses ^
117
	  (__end_of_permanent_fixed_addresses + TOTAL_FIX_BTMAPS - 1)) &
118
	 -PTRS_PER_PTE
119
	 ? __end_of_permanent_fixed_addresses + TOTAL_FIX_BTMAPS -
120
	   (__end_of_permanent_fixed_addresses & (TOTAL_FIX_BTMAPS - 1))
121
	 : __end_of_permanent_fixed_addresses,
122
	FIX_BTMAP_BEGIN = FIX_BTMAP_END + TOTAL_FIX_BTMAPS - 1,
123
#ifdef CONFIG_X86_32
124
	FIX_WP_TEST,
125
#endif
126
#ifdef CONFIG_INTEL_TXT
127
	FIX_TBOOT_BASE,
128
#endif
129
	__end_of_fixed_addresses
130
};
131
 
132
 
133
extern void reserve_top_address(unsigned long reserve);
134
 
135
#define FIXADDR_SIZE	(__end_of_permanent_fixed_addresses << PAGE_SHIFT)
136
#define FIXADDR_START		(FIXADDR_TOP - FIXADDR_SIZE)
137
 
138
extern int fixmaps_set;
139
 
140
extern pte_t *kmap_pte;
141
extern pgprot_t kmap_prot;
142
extern pte_t *pkmap_page_table;
143
 
144
void __native_set_fixmap(enum fixed_addresses idx, pte_t pte);
145
void native_set_fixmap(enum fixed_addresses idx,
146
		       phys_addr_t phys, pgprot_t flags);
147
 
148
#ifndef CONFIG_PARAVIRT
149
static inline void __set_fixmap(enum fixed_addresses idx,
150
				phys_addr_t phys, pgprot_t flags)
151
{
152
	native_set_fixmap(idx, phys, flags);
153
}
154
#endif
155
 
156
#include 
157
 
158
#define __late_set_fixmap(idx, phys, flags) __set_fixmap(idx, phys, flags)
159
#define __late_clear_fixmap(idx) __set_fixmap(idx, 0, __pgprot(0))
160
 
161
void __early_set_fixmap(enum fixed_addresses idx,
162
			phys_addr_t phys, pgprot_t flags);
163
 
164
#endif /* !__ASSEMBLY__ */
165
#endif /* _ASM_X86_FIXMAP_H */