Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


Merge branch 'devel'
[palacios.git] / kitten / include / arch-x86_64 / fixmap.h
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
11 #ifndef _ASM_FIXMAP_H
12 #define _ASM_FIXMAP_H
13
14 #include <lwk/kernel.h>
15 #include <arch/apicdef.h>
16 #include <arch/page.h>
17 #include <arch/vsyscall.h>
18
19 /*
20  * Here we define all the compile-time 'special' virtual
21  * addresses. The point is to have a constant address at
22  * compile time, but to set the physical address only
23  * in the boot process.
24  *
25  * These 'compile-time allocated' memory buffers are
26  * fixed-size 4k pages. (or larger if used with an increment
27  * higher than 1). Use fixmap_set(idx,phys) to associate
28  * physical memory with fixmap indices.
29  *
30  * TLB entries of such buffers will not be flushed across
31  * task switches.
32  */
33
34 enum fixed_addresses {
35         VSYSCALL_LAST_PAGE,
36         VSYSCALL_FIRST_PAGE = VSYSCALL_LAST_PAGE + ((VSYSCALL_END-VSYSCALL_START) >> PAGE_SHIFT) - 1,
37         FIX_APIC_BASE,  /* local (CPU) APIC) */
38         FIX_IO_APIC_BASE_0,
39         FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS-1,
40         __end_of_fixed_addresses
41 };
42
43 extern void __set_fixmap(enum fixed_addresses fixmap_index,
44                          unsigned long phys_addr, pgprot_t prot);
45
46 #define set_fixmap(idx, phys) \
47                 __set_fixmap(idx, phys, PAGE_KERNEL)
48 /*
49  * Some hardware wants to get fixmapped without caching.
50  */
51 #define set_fixmap_nocache(idx, phys) \
52                 __set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE)
53
54 #define FIXADDR_TOP     (VSYSCALL_END-PAGE_SIZE)
55 #define FIXADDR_SIZE    (__end_of_fixed_addresses << PAGE_SHIFT)
56 #define FIXADDR_START   (FIXADDR_TOP - FIXADDR_SIZE)
57
58 /* Only covers 32bit vsyscalls currently. Need another set for 64bit. */
59 #define FIXADDR_USER_START      ((unsigned long)VSYSCALL32_VSYSCALL)
60 #define FIXADDR_USER_END        (FIXADDR_USER_START + PAGE_SIZE)
61
62 #define __fix_to_virt(x)        (FIXADDR_TOP - ((x) << PAGE_SHIFT))
63
64 extern void __this_fixmap_does_not_exist(void);
65
66 /*
67  * 'index to address' translation. If anyone tries to use the idx
68  * directly without translation, we catch the bug with a NULL-deference
69  * kernel oops. Illegal ranges of incoming indices are caught too.
70  */
71 static __always_inline unsigned long fix_to_virt(const unsigned int idx)
72 {
73         /*
74          * this branch gets completely eliminated after inlining,
75          * except when someone tries to use fixaddr indices in an
76          * illegal way. (such as mixing up address types or using
77          * out-of-range indices).
78          *
79          * If it doesn't get removed, the linker will complain
80          * loudly with a reasonably clear error message..
81          */
82         if (idx >= __end_of_fixed_addresses)
83                 __this_fixmap_does_not_exist();
84
85         return __fix_to_virt(idx);
86 }
87
88 #endif