LCOV - code coverage report
Current view: top level - arch/x86/include/asm - fixmap.h (source / functions) Hit Total Coverage
Test: combined.info Lines: 2 2 100.0 %
Date: 2022-03-28 16:04:14 Functions: 0 0 -
Branches: 0 0 -

           Branch data     Line data    Source code
       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                 :            : /*
      18                 :            :  * Exposed to assembly code for setting up initial page tables. Cannot be
      19                 :            :  * calculated in assembly code (fixmap entries are an enum), but is sanity
      20                 :            :  * checked in the actual fixmap C code to make sure that the fixmap is
      21                 :            :  * covered fully.
      22                 :            :  */
      23                 :            : #define FIXMAP_PMD_NUM  2
      24                 :            : /* fixmap starts downwards from the 507th entry in level2_fixmap_pgt */
      25                 :            : #define FIXMAP_PMD_TOP  507
      26                 :            : 
      27                 :            : #ifndef __ASSEMBLY__
      28                 :            : #include <linux/kernel.h>
      29                 :            : #include <asm/acpi.h>
      30                 :            : #include <asm/apicdef.h>
      31                 :            : #include <asm/page.h>
      32                 :            : #ifdef CONFIG_X86_32
      33                 :            : #include <linux/threads.h>
      34                 :            : #include <asm/kmap_types.h>
      35                 :            : #else
      36                 :            : #include <uapi/asm/vsyscall.h>
      37                 :            : #endif
      38                 :            : 
      39                 :            : /*
      40                 :            :  * We can't declare FIXADDR_TOP as variable for x86_64 because vsyscall
      41                 :            :  * uses fixmaps that relies on FIXADDR_TOP for proper address calculation.
      42                 :            :  * Because of this, FIXADDR_TOP x86 integration was left as later work.
      43                 :            :  */
      44                 :            : #ifdef CONFIG_X86_32
      45                 :            : /*
      46                 :            :  * Leave one empty page between vmalloc'ed areas and
      47                 :            :  * the start of the fixmap.
      48                 :            :  */
      49                 :            : extern unsigned long __FIXADDR_TOP;
      50                 :            : #define FIXADDR_TOP     ((unsigned long)__FIXADDR_TOP)
      51                 :            : #else
      52                 :            : #define FIXADDR_TOP     (round_up(VSYSCALL_ADDR + PAGE_SIZE, 1<<PMD_SHIFT) - \
      53                 :            :                          PAGE_SIZE)
      54                 :            : #endif
      55                 :            : 
      56                 :            : /*
      57                 :            :  * Here we define all the compile-time 'special' virtual
      58                 :            :  * addresses. The point is to have a constant address at
      59                 :            :  * compile time, but to set the physical address only
      60                 :            :  * in the boot process.
      61                 :            :  * for x86_32: We allocate these special addresses
      62                 :            :  * from the end of virtual memory (0xfffff000) backwards.
      63                 :            :  * Also this lets us do fail-safe vmalloc(), we
      64                 :            :  * can guarantee that these special addresses and
      65                 :            :  * vmalloc()-ed addresses never overlap.
      66                 :            :  *
      67                 :            :  * These 'compile-time allocated' memory buffers are
      68                 :            :  * fixed-size 4k pages (or larger if used with an increment
      69                 :            :  * higher than 1). Use set_fixmap(idx,phys) to associate
      70                 :            :  * physical memory with fixmap indices.
      71                 :            :  *
      72                 :            :  * TLB entries of such buffers will not be flushed across
      73                 :            :  * task switches.
      74                 :            :  */
      75                 :            : enum fixed_addresses {
      76                 :            : #ifdef CONFIG_X86_32
      77                 :            :         FIX_HOLE,
      78                 :            : #else
      79                 :            : #ifdef CONFIG_X86_VSYSCALL_EMULATION
      80                 :            :         VSYSCALL_PAGE = (FIXADDR_TOP - VSYSCALL_ADDR) >> PAGE_SHIFT,
      81                 :            : #endif
      82                 :            : #endif
      83                 :            :         FIX_DBGP_BASE,
      84                 :            :         FIX_EARLYCON_MEM_BASE,
      85                 :            : #ifdef CONFIG_PROVIDE_OHCI1394_DMA_INIT
      86                 :            :         FIX_OHCI1394_BASE,
      87                 :            : #endif
      88                 :            : #ifdef CONFIG_X86_LOCAL_APIC
      89                 :            :         FIX_APIC_BASE,  /* local (CPU) APIC) -- required for SMP or not */
      90                 :            : #endif
      91                 :            : #ifdef CONFIG_X86_IO_APIC
      92                 :            :         FIX_IO_APIC_BASE_0,
      93                 :            :         FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS - 1,
      94                 :            : #endif
      95                 :            : #ifdef CONFIG_X86_32
      96                 :            :         FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */
      97                 :            :         FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1,
      98                 :            : #ifdef CONFIG_PCI_MMCONFIG
      99                 :            :         FIX_PCIE_MCFG,
     100                 :            : #endif
     101                 :            : #endif
     102                 :            : #ifdef CONFIG_PARAVIRT
     103                 :            :         FIX_PARAVIRT_BOOTMAP,
     104                 :            : #endif
     105                 :            : #ifdef  CONFIG_X86_INTEL_MID
     106                 :            :         FIX_LNW_VRTC,
     107                 :            : #endif
     108                 :            : 
     109                 :            : #ifdef CONFIG_ACPI_APEI_GHES
     110                 :            :         /* Used for GHES mapping from assorted contexts */
     111                 :            :         FIX_APEI_GHES_IRQ,
     112                 :            :         FIX_APEI_GHES_NMI,
     113                 :            : #endif
     114                 :            : 
     115                 :            :         __end_of_permanent_fixed_addresses,
     116                 :            : 
     117                 :            :         /*
     118                 :            :          * 512 temporary boot-time mappings, used by early_ioremap(),
     119                 :            :          * before ioremap() is functional.
     120                 :            :          *
     121                 :            :          * If necessary we round it up to the next 512 pages boundary so
     122                 :            :          * that we can have a single pmd entry and a single pte table:
     123                 :            :          */
     124                 :            : #define NR_FIX_BTMAPS           64
     125                 :            : #define FIX_BTMAPS_SLOTS        8
     126                 :            : #define TOTAL_FIX_BTMAPS        (NR_FIX_BTMAPS * FIX_BTMAPS_SLOTS)
     127                 :            :         FIX_BTMAP_END =
     128                 :            :          (__end_of_permanent_fixed_addresses ^
     129                 :            :           (__end_of_permanent_fixed_addresses + TOTAL_FIX_BTMAPS - 1)) &
     130                 :            :          -PTRS_PER_PTE
     131                 :            :          ? __end_of_permanent_fixed_addresses + TOTAL_FIX_BTMAPS -
     132                 :            :            (__end_of_permanent_fixed_addresses & (TOTAL_FIX_BTMAPS - 1))
     133                 :            :          : __end_of_permanent_fixed_addresses,
     134                 :            :         FIX_BTMAP_BEGIN = FIX_BTMAP_END + TOTAL_FIX_BTMAPS - 1,
     135                 :            : #ifdef CONFIG_X86_32
     136                 :            :         FIX_WP_TEST,
     137                 :            : #endif
     138                 :            : #ifdef CONFIG_INTEL_TXT
     139                 :            :         FIX_TBOOT_BASE,
     140                 :            : #endif
     141                 :            :         __end_of_fixed_addresses
     142                 :            : };
     143                 :            : 
     144                 :            : 
     145                 :            : extern void reserve_top_address(unsigned long reserve);
     146                 :            : 
     147                 :            : #define FIXADDR_SIZE            (__end_of_permanent_fixed_addresses << PAGE_SHIFT)
     148                 :            : #define FIXADDR_START           (FIXADDR_TOP - FIXADDR_SIZE)
     149                 :            : #define FIXADDR_TOT_SIZE        (__end_of_fixed_addresses << PAGE_SHIFT)
     150                 :            : #define FIXADDR_TOT_START       (FIXADDR_TOP - FIXADDR_TOT_SIZE)
     151                 :            : 
     152                 :            : extern int fixmaps_set;
     153                 :            : 
     154                 :            : extern pte_t *kmap_pte;
     155                 :            : #define kmap_prot PAGE_KERNEL
     156                 :            : extern pte_t *pkmap_page_table;
     157                 :            : 
     158                 :            : void __native_set_fixmap(enum fixed_addresses idx, pte_t pte);
     159                 :            : void native_set_fixmap(unsigned /* enum fixed_addresses */ idx,
     160                 :            :                        phys_addr_t phys, pgprot_t flags);
     161                 :            : 
     162                 :            : #ifndef CONFIG_PARAVIRT_XXL
     163                 :         39 : static inline void __set_fixmap(enum fixed_addresses idx,
     164                 :            :                                 phys_addr_t phys, pgprot_t flags)
     165                 :            : {
     166                 :         39 :         native_set_fixmap(idx, phys, flags);
     167                 :            : }
     168                 :            : #endif
     169                 :            : 
     170                 :            : /*
     171                 :            :  * FIXMAP_PAGE_NOCACHE is used for MMIO. Memory encryption is not
     172                 :            :  * supported for MMIO addresses, so make sure that the memory encryption
     173                 :            :  * mask is not part of the page attributes.
     174                 :            :  */
     175                 :            : #define FIXMAP_PAGE_NOCACHE PAGE_KERNEL_IO_NOCACHE
     176                 :            : 
     177                 :            : /*
     178                 :            :  * Early memremap routines used for in-place encryption. The mappings created
     179                 :            :  * by these routines are intended to be used as temporary mappings.
     180                 :            :  */
     181                 :            : void __init *early_memremap_encrypted(resource_size_t phys_addr,
     182                 :            :                                       unsigned long size);
     183                 :            : void __init *early_memremap_encrypted_wp(resource_size_t phys_addr,
     184                 :            :                                          unsigned long size);
     185                 :            : void __init *early_memremap_decrypted(resource_size_t phys_addr,
     186                 :            :                                       unsigned long size);
     187                 :            : void __init *early_memremap_decrypted_wp(resource_size_t phys_addr,
     188                 :            :                                          unsigned long size);
     189                 :            : 
     190                 :            : #include <asm-generic/fixmap.h>
     191                 :            : 
     192                 :            : #define __late_set_fixmap(idx, phys, flags) __set_fixmap(idx, phys, flags)
     193                 :            : #define __late_clear_fixmap(idx) __set_fixmap(idx, 0, __pgprot(0))
     194                 :            : 
     195                 :            : void __early_set_fixmap(enum fixed_addresses idx,
     196                 :            :                         phys_addr_t phys, pgprot_t flags);
     197                 :            : 
     198                 :            : #endif /* !__ASSEMBLY__ */
     199                 :            : #endif /* _ASM_X86_FIXMAP_H */

Generated by: LCOV version 1.14