linux/arch/x86/include/asm/fixmap.h
<<
>>
Prefs
   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 <linux/kernel.h>
  19#include <asm/acpi.h>
  20#include <asm/apicdef.h>
  21#include <asm/page.h>
  22#ifdef CONFIG_X86_32
  23#include <linux/threads.h>
  24#include <asm/kmap_types.h>
  25#else
  26#include <uapi/asm/vsyscall.h>
  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 */
  40extern 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<<PMD_SHIFT) - \
  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 */
  67enum 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
 133extern 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
 138extern int fixmaps_set;
 139
 140extern pte_t *kmap_pte;
 141#define kmap_prot PAGE_KERNEL
 142extern pte_t *pkmap_page_table;
 143
 144void __native_set_fixmap(enum fixed_addresses idx, pte_t pte);
 145void native_set_fixmap(enum fixed_addresses idx,
 146                       phys_addr_t phys, pgprot_t flags);
 147
 148#ifndef CONFIG_PARAVIRT
 149static 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 <asm-generic/fixmap.h>
 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
 161void __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 */
 166