home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / asm-x86_64 / fixmap.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  2.8 KB  |  96 lines

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