linux/arch/x86/include/asm/fixmap.h
<<
>>
Prefs
   1#ifndef _ASM_X86_FIXMAP_H
   2#define _ASM_X86_FIXMAP_H
   3
   4#ifdef CONFIG_X86_32
   5# include "fixmap_32.h"
   6#else
   7# include "fixmap_64.h"
   8#endif
   9
  10extern int fixmaps_set;
  11
  12extern pte_t *kmap_pte;
  13extern pgprot_t kmap_prot;
  14extern pte_t *pkmap_page_table;
  15
  16void __native_set_fixmap(enum fixed_addresses idx, pte_t pte);
  17void native_set_fixmap(enum fixed_addresses idx,
  18                       unsigned long phys, pgprot_t flags);
  19
  20#ifndef CONFIG_PARAVIRT
  21static inline void __set_fixmap(enum fixed_addresses idx,
  22                                unsigned long phys, pgprot_t flags)
  23{
  24        native_set_fixmap(idx, phys, flags);
  25}
  26#endif
  27
  28#define set_fixmap(idx, phys)                           \
  29        __set_fixmap(idx, phys, PAGE_KERNEL)
  30
  31/*
  32 * Some hardware wants to get fixmapped without caching.
  33 */
  34#define set_fixmap_nocache(idx, phys)                   \
  35        __set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE)
  36
  37#define clear_fixmap(idx)                       \
  38        __set_fixmap(idx, 0, __pgprot(0))
  39
  40#define __fix_to_virt(x)        (FIXADDR_TOP - ((x) << PAGE_SHIFT))
  41#define __virt_to_fix(x)        ((FIXADDR_TOP - ((x)&PAGE_MASK)) >> PAGE_SHIFT)
  42
  43extern void __this_fixmap_does_not_exist(void);
  44
  45/*
  46 * 'index to address' translation. If anyone tries to use the idx
  47 * directly without translation, we catch the bug with a NULL-deference
  48 * kernel oops. Illegal ranges of incoming indices are caught too.
  49 */
  50static __always_inline unsigned long fix_to_virt(const unsigned int idx)
  51{
  52        /*
  53         * this branch gets completely eliminated after inlining,
  54         * except when someone tries to use fixaddr indices in an
  55         * illegal way. (such as mixing up address types or using
  56         * out-of-range indices).
  57         *
  58         * If it doesn't get removed, the linker will complain
  59         * loudly with a reasonably clear error message..
  60         */
  61        if (idx >= __end_of_fixed_addresses)
  62                __this_fixmap_does_not_exist();
  63
  64        return __fix_to_virt(idx);
  65}
  66
  67static inline unsigned long virt_to_fix(const unsigned long vaddr)
  68{
  69        BUG_ON(vaddr >= FIXADDR_TOP || vaddr < FIXADDR_START);
  70        return __virt_to_fix(vaddr);
  71}
  72#endif /* _ASM_X86_FIXMAP_H */
  73
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.