LCOV - code coverage report
Current view: top level - arch/x86/mm - ioremap.c (source / functions) Hit Total Coverage
Test: landlock.info Lines: 90 211 42.7 %
Date: 2021-04-22 12:43:58 Functions: 10 25 40.0 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0-only
       2             : /*
       3             :  * Re-map IO memory to kernel address space so that we can access it.
       4             :  * This is needed for high PCI addresses that aren't mapped in the
       5             :  * 640k-1MB IO memory area on PC's
       6             :  *
       7             :  * (C) Copyright 1995 1996 Linus Torvalds
       8             :  */
       9             : 
      10             : #include <linux/memblock.h>
      11             : #include <linux/init.h>
      12             : #include <linux/io.h>
      13             : #include <linux/ioport.h>
      14             : #include <linux/slab.h>
      15             : #include <linux/vmalloc.h>
      16             : #include <linux/mmiotrace.h>
      17             : #include <linux/mem_encrypt.h>
      18             : #include <linux/efi.h>
      19             : #include <linux/pgtable.h>
      20             : 
      21             : #include <asm/set_memory.h>
      22             : #include <asm/e820/api.h>
      23             : #include <asm/efi.h>
      24             : #include <asm/fixmap.h>
      25             : #include <asm/tlbflush.h>
      26             : #include <asm/pgalloc.h>
      27             : #include <asm/memtype.h>
      28             : #include <asm/setup.h>
      29             : 
      30             : #include "physaddr.h"
      31             : 
      32             : /*
      33             :  * Descriptor controlling ioremap() behavior.
      34             :  */
      35             : struct ioremap_desc {
      36             :         unsigned int flags;
      37             : };
      38             : 
      39             : /*
      40             :  * Fix up the linear direct mapping of the kernel to avoid cache attribute
      41             :  * conflicts.
      42             :  */
      43           0 : int ioremap_change_attr(unsigned long vaddr, unsigned long size,
      44             :                         enum page_cache_mode pcm)
      45             : {
      46           0 :         unsigned long nrpages = size >> PAGE_SHIFT;
      47           0 :         int err;
      48             : 
      49           0 :         switch (pcm) {
      50           0 :         case _PAGE_CACHE_MODE_UC:
      51             :         default:
      52           0 :                 err = _set_memory_uc(vaddr, nrpages);
      53           0 :                 break;
      54           0 :         case _PAGE_CACHE_MODE_WC:
      55           0 :                 err = _set_memory_wc(vaddr, nrpages);
      56           0 :                 break;
      57           0 :         case _PAGE_CACHE_MODE_WT:
      58           0 :                 err = _set_memory_wt(vaddr, nrpages);
      59           0 :                 break;
      60           0 :         case _PAGE_CACHE_MODE_WB:
      61           0 :                 err = _set_memory_wb(vaddr, nrpages);
      62           0 :                 break;
      63             :         }
      64             : 
      65           0 :         return err;
      66             : }
      67             : 
      68             : /* Does the range (or a subset of) contain normal RAM? */
      69           0 : static unsigned int __ioremap_check_ram(struct resource *res)
      70             : {
      71           0 :         unsigned long start_pfn, stop_pfn;
      72           0 :         unsigned long i;
      73             : 
      74           0 :         if ((res->flags & IORESOURCE_SYSTEM_RAM) != IORESOURCE_SYSTEM_RAM)
      75             :                 return 0;
      76             : 
      77           0 :         start_pfn = (res->start + PAGE_SIZE - 1) >> PAGE_SHIFT;
      78           0 :         stop_pfn = (res->end + 1) >> PAGE_SHIFT;
      79           0 :         if (stop_pfn > start_pfn) {
      80           0 :                 for (i = 0; i < (stop_pfn - start_pfn); ++i)
      81           0 :                         if (pfn_valid(start_pfn + i) &&
      82           0 :                             !PageReserved(pfn_to_page(start_pfn + i)))
      83             :                                 return IORES_MAP_SYSTEM_RAM;
      84             :         }
      85             : 
      86             :         return 0;
      87             : }
      88             : 
      89             : /*
      90             :  * In a SEV guest, NONE and RESERVED should not be mapped encrypted because
      91             :  * there the whole memory is already encrypted.
      92             :  */
      93             : static unsigned int __ioremap_check_encrypted(struct resource *res)
      94             : {
      95             :         if (!sev_active())
      96             :                 return 0;
      97             : 
      98             :         switch (res->desc) {
      99             :         case IORES_DESC_NONE:
     100             :         case IORES_DESC_RESERVED:
     101             :                 break;
     102             :         default:
     103             :                 return IORES_MAP_ENCRYPTED;
     104             :         }
     105             : 
     106             :         return 0;
     107             : }
     108             : 
     109             : /*
     110             :  * The EFI runtime services data area is not covered by walk_mem_res(), but must
     111             :  * be mapped encrypted when SEV is active.
     112             :  */
     113           2 : static void __ioremap_check_other(resource_size_t addr, struct ioremap_desc *desc)
     114             : {
     115           2 :         if (!sev_active())
     116           2 :                 return;
     117             : 
     118             :         if (!IS_ENABLED(CONFIG_EFI))
     119             :                 return;
     120             : 
     121             :         if (efi_mem_type(addr) == EFI_RUNTIME_SERVICES_DATA)
     122             :                 desc->flags |= IORES_MAP_ENCRYPTED;
     123             : }
     124             : 
     125           0 : static int __ioremap_collect_map_flags(struct resource *res, void *arg)
     126             : {
     127           0 :         struct ioremap_desc *desc = arg;
     128             : 
     129           0 :         if (!(desc->flags & IORES_MAP_SYSTEM_RAM))
     130           0 :                 desc->flags |= __ioremap_check_ram(res);
     131             : 
     132           0 :         if (!(desc->flags & IORES_MAP_ENCRYPTED))
     133           0 :                 desc->flags |= __ioremap_check_encrypted(res);
     134             : 
     135           0 :         return ((desc->flags & (IORES_MAP_SYSTEM_RAM | IORES_MAP_ENCRYPTED)) ==
     136             :                                (IORES_MAP_SYSTEM_RAM | IORES_MAP_ENCRYPTED));
     137             : }
     138             : 
     139             : /*
     140             :  * To avoid multiple resource walks, this function walks resources marked as
     141             :  * IORESOURCE_MEM and IORESOURCE_BUSY and looking for system RAM and/or a
     142             :  * resource described not as IORES_DESC_NONE (e.g. IORES_DESC_ACPI_TABLES).
     143             :  *
     144             :  * After that, deal with misc other ranges in __ioremap_check_other() which do
     145             :  * not fall into the above category.
     146             :  */
     147           2 : static void __ioremap_check_mem(resource_size_t addr, unsigned long size,
     148             :                                 struct ioremap_desc *desc)
     149             : {
     150           2 :         u64 start, end;
     151             : 
     152           2 :         start = (u64)addr;
     153           2 :         end = start + size - 1;
     154           2 :         memset(desc, 0, sizeof(struct ioremap_desc));
     155             : 
     156           2 :         walk_mem_res(start, end, desc, __ioremap_collect_map_flags);
     157             : 
     158           2 :         __ioremap_check_other(addr, desc);
     159           2 : }
     160             : 
     161             : /*
     162             :  * Remap an arbitrary physical address space into the kernel virtual
     163             :  * address space. It transparently creates kernel huge I/O mapping when
     164             :  * the physical address is aligned by a huge page size (1GB or 2MB) and
     165             :  * the requested size is at least the huge page size.
     166             :  *
     167             :  * NOTE: MTRRs can override PAT memory types with a 4KB granularity.
     168             :  * Therefore, the mapping code falls back to use a smaller page toward 4KB
     169             :  * when a mapping range is covered by non-WB type of MTRRs.
     170             :  *
     171             :  * NOTE! We need to allow non-page-aligned mappings too: we will obviously
     172             :  * have to convert them into an offset in a page-aligned mapping, but the
     173             :  * caller shouldn't need to know that small detail.
     174             :  */
     175             : static void __iomem *
     176           2 : __ioremap_caller(resource_size_t phys_addr, unsigned long size,
     177             :                  enum page_cache_mode pcm, void *caller, bool encrypted)
     178             : {
     179           2 :         unsigned long offset, vaddr;
     180           2 :         resource_size_t last_addr;
     181           2 :         const resource_size_t unaligned_phys_addr = phys_addr;
     182           2 :         const unsigned long unaligned_size = size;
     183           2 :         struct ioremap_desc io_desc;
     184           2 :         struct vm_struct *area;
     185           2 :         enum page_cache_mode new_pcm;
     186           2 :         pgprot_t prot;
     187           2 :         int retval;
     188           2 :         void __iomem *ret_addr;
     189             : 
     190             :         /* Don't allow wraparound or zero size */
     191           2 :         last_addr = phys_addr + size - 1;
     192           2 :         if (!size || last_addr < phys_addr)
     193             :                 return NULL;
     194             : 
     195           2 :         if (!phys_addr_valid(phys_addr)) {
     196           0 :                 printk(KERN_WARNING "ioremap: invalid physical address %llx\n",
     197             :                        (unsigned long long)phys_addr);
     198           0 :                 WARN_ON_ONCE(1);
     199           0 :                 return NULL;
     200             :         }
     201             : 
     202           2 :         __ioremap_check_mem(phys_addr, size, &io_desc);
     203             : 
     204             :         /*
     205             :          * Don't allow anybody to remap normal RAM that we're using..
     206             :          */
     207           2 :         if (io_desc.flags & IORES_MAP_SYSTEM_RAM) {
     208           0 :                 WARN_ONCE(1, "ioremap on RAM at %pa - %pa\n",
     209             :                           &phys_addr, &last_addr);
     210           0 :                 return NULL;
     211             :         }
     212             : 
     213             :         /*
     214             :          * Mappings have to be page-aligned
     215             :          */
     216           2 :         offset = phys_addr & ~PAGE_MASK;
     217           2 :         phys_addr &= PHYSICAL_PAGE_MASK;
     218           2 :         size = PAGE_ALIGN(last_addr+1) - phys_addr;
     219             : 
     220           2 :         retval = memtype_reserve(phys_addr, (u64)phys_addr + size,
     221             :                                                 pcm, &new_pcm);
     222           2 :         if (retval) {
     223           0 :                 printk(KERN_ERR "ioremap memtype_reserve failed %d\n", retval);
     224           0 :                 return NULL;
     225             :         }
     226             : 
     227           2 :         if (pcm != new_pcm) {
     228           0 :                 if (!is_new_memtype_allowed(phys_addr, size, pcm, new_pcm)) {
     229           0 :                         printk(KERN_ERR
     230             :                 "ioremap error for 0x%llx-0x%llx, requested 0x%x, got 0x%x\n",
     231             :                                 (unsigned long long)phys_addr,
     232             :                                 (unsigned long long)(phys_addr + size),
     233             :                                 pcm, new_pcm);
     234           0 :                         goto err_free_memtype;
     235             :                 }
     236           0 :                 pcm = new_pcm;
     237             :         }
     238             : 
     239             :         /*
     240             :          * If the page being mapped is in memory and SEV is active then
     241             :          * make sure the memory encryption attribute is enabled in the
     242             :          * resulting mapping.
     243             :          */
     244           2 :         prot = PAGE_KERNEL_IO;
     245           2 :         if ((io_desc.flags & IORES_MAP_ENCRYPTED) || encrypted)
     246             :                 prot = pgprot_encrypted(prot);
     247             : 
     248           2 :         switch (pcm) {
     249           0 :         case _PAGE_CACHE_MODE_UC:
     250             :         default:
     251           0 :                 prot = __pgprot(pgprot_val(prot) |
     252             :                                 cachemode2protval(_PAGE_CACHE_MODE_UC));
     253           0 :                 break;
     254           2 :         case _PAGE_CACHE_MODE_UC_MINUS:
     255           2 :                 prot = __pgprot(pgprot_val(prot) |
     256             :                                 cachemode2protval(_PAGE_CACHE_MODE_UC_MINUS));
     257           2 :                 break;
     258           0 :         case _PAGE_CACHE_MODE_WC:
     259           0 :                 prot = __pgprot(pgprot_val(prot) |
     260             :                                 cachemode2protval(_PAGE_CACHE_MODE_WC));
     261           0 :                 break;
     262           0 :         case _PAGE_CACHE_MODE_WT:
     263           0 :                 prot = __pgprot(pgprot_val(prot) |
     264             :                                 cachemode2protval(_PAGE_CACHE_MODE_WT));
     265           0 :                 break;
     266             :         case _PAGE_CACHE_MODE_WB:
     267             :                 break;
     268             :         }
     269             : 
     270             :         /*
     271             :          * Ok, go for it..
     272             :          */
     273           2 :         area = get_vm_area_caller(size, VM_IOREMAP, caller);
     274           2 :         if (!area)
     275           0 :                 goto err_free_memtype;
     276           2 :         area->phys_addr = phys_addr;
     277           2 :         vaddr = (unsigned long) area->addr;
     278             : 
     279           2 :         if (memtype_kernel_map_sync(phys_addr, size, pcm))
     280           0 :                 goto err_free_area;
     281             : 
     282           2 :         if (ioremap_page_range(vaddr, vaddr + size, phys_addr, prot))
     283           0 :                 goto err_free_area;
     284             : 
     285           2 :         ret_addr = (void __iomem *) (vaddr + offset);
     286           2 :         mmiotrace_ioremap(unaligned_phys_addr, unaligned_size, ret_addr);
     287             : 
     288             :         /*
     289             :          * Check if the request spans more than any BAR in the iomem resource
     290             :          * tree.
     291             :          */
     292           2 :         if (iomem_map_sanity_check(unaligned_phys_addr, unaligned_size))
     293           0 :                 pr_warn("caller %pS mapping multiple BARs\n", caller);
     294             : 
     295             :         return ret_addr;
     296           0 : err_free_area:
     297           0 :         free_vm_area(area);
     298           0 : err_free_memtype:
     299           0 :         memtype_free(phys_addr, phys_addr + size);
     300           0 :         return NULL;
     301             : }
     302             : 
     303             : /**
     304             :  * ioremap     -   map bus memory into CPU space
     305             :  * @phys_addr:    bus address of the memory
     306             :  * @size:      size of the resource to map
     307             :  *
     308             :  * ioremap performs a platform specific sequence of operations to
     309             :  * make bus memory CPU accessible via the readb/readw/readl/writeb/
     310             :  * writew/writel functions and the other mmio helpers. The returned
     311             :  * address is not guaranteed to be usable directly as a virtual
     312             :  * address.
     313             :  *
     314             :  * This version of ioremap ensures that the memory is marked uncachable
     315             :  * on the CPU as well as honouring existing caching rules from things like
     316             :  * the PCI bus. Note that there are other caches and buffers on many
     317             :  * busses. In particular driver authors should read up on PCI writes
     318             :  *
     319             :  * It's useful if some control registers are in such an area and
     320             :  * write combining or read caching is not desirable:
     321             :  *
     322             :  * Must be freed with iounmap.
     323             :  */
     324           2 : void __iomem *ioremap(resource_size_t phys_addr, unsigned long size)
     325             : {
     326             :         /*
     327             :          * Ideally, this should be:
     328             :          *      pat_enabled() ? _PAGE_CACHE_MODE_UC : _PAGE_CACHE_MODE_UC_MINUS;
     329             :          *
     330             :          * Till we fix all X drivers to use ioremap_wc(), we will use
     331             :          * UC MINUS. Drivers that are certain they need or can already
     332             :          * be converted over to strong UC can use ioremap_uc().
     333             :          */
     334           2 :         enum page_cache_mode pcm = _PAGE_CACHE_MODE_UC_MINUS;
     335             : 
     336           2 :         return __ioremap_caller(phys_addr, size, pcm,
     337             :                                 __builtin_return_address(0), false);
     338             : }
     339             : EXPORT_SYMBOL(ioremap);
     340             : 
     341             : /**
     342             :  * ioremap_uc     -   map bus memory into CPU space as strongly uncachable
     343             :  * @phys_addr:    bus address of the memory
     344             :  * @size:      size of the resource to map
     345             :  *
     346             :  * ioremap_uc performs a platform specific sequence of operations to
     347             :  * make bus memory CPU accessible via the readb/readw/readl/writeb/
     348             :  * writew/writel functions and the other mmio helpers. The returned
     349             :  * address is not guaranteed to be usable directly as a virtual
     350             :  * address.
     351             :  *
     352             :  * This version of ioremap ensures that the memory is marked with a strong
     353             :  * preference as completely uncachable on the CPU when possible. For non-PAT
     354             :  * systems this ends up setting page-attribute flags PCD=1, PWT=1. For PAT
     355             :  * systems this will set the PAT entry for the pages as strong UC.  This call
     356             :  * will honor existing caching rules from things like the PCI bus. Note that
     357             :  * there are other caches and buffers on many busses. In particular driver
     358             :  * authors should read up on PCI writes.
     359             :  *
     360             :  * It's useful if some control registers are in such an area and
     361             :  * write combining or read caching is not desirable:
     362             :  *
     363             :  * Must be freed with iounmap.
     364             :  */
     365           0 : void __iomem *ioremap_uc(resource_size_t phys_addr, unsigned long size)
     366             : {
     367           0 :         enum page_cache_mode pcm = _PAGE_CACHE_MODE_UC;
     368             : 
     369           0 :         return __ioremap_caller(phys_addr, size, pcm,
     370             :                                 __builtin_return_address(0), false);
     371             : }
     372             : EXPORT_SYMBOL_GPL(ioremap_uc);
     373             : 
     374             : /**
     375             :  * ioremap_wc   -       map memory into CPU space write combined
     376             :  * @phys_addr:  bus address of the memory
     377             :  * @size:       size of the resource to map
     378             :  *
     379             :  * This version of ioremap ensures that the memory is marked write combining.
     380             :  * Write combining allows faster writes to some hardware devices.
     381             :  *
     382             :  * Must be freed with iounmap.
     383             :  */
     384           0 : void __iomem *ioremap_wc(resource_size_t phys_addr, unsigned long size)
     385             : {
     386           0 :         return __ioremap_caller(phys_addr, size, _PAGE_CACHE_MODE_WC,
     387             :                                         __builtin_return_address(0), false);
     388             : }
     389             : EXPORT_SYMBOL(ioremap_wc);
     390             : 
     391             : /**
     392             :  * ioremap_wt   -       map memory into CPU space write through
     393             :  * @phys_addr:  bus address of the memory
     394             :  * @size:       size of the resource to map
     395             :  *
     396             :  * This version of ioremap ensures that the memory is marked write through.
     397             :  * Write through stores data into memory while keeping the cache up-to-date.
     398             :  *
     399             :  * Must be freed with iounmap.
     400             :  */
     401           0 : void __iomem *ioremap_wt(resource_size_t phys_addr, unsigned long size)
     402             : {
     403           0 :         return __ioremap_caller(phys_addr, size, _PAGE_CACHE_MODE_WT,
     404             :                                         __builtin_return_address(0), false);
     405             : }
     406             : EXPORT_SYMBOL(ioremap_wt);
     407             : 
     408           0 : void __iomem *ioremap_encrypted(resource_size_t phys_addr, unsigned long size)
     409             : {
     410           0 :         return __ioremap_caller(phys_addr, size, _PAGE_CACHE_MODE_WB,
     411             :                                 __builtin_return_address(0), true);
     412             : }
     413             : EXPORT_SYMBOL(ioremap_encrypted);
     414             : 
     415           0 : void __iomem *ioremap_cache(resource_size_t phys_addr, unsigned long size)
     416             : {
     417           0 :         return __ioremap_caller(phys_addr, size, _PAGE_CACHE_MODE_WB,
     418             :                                 __builtin_return_address(0), false);
     419             : }
     420             : EXPORT_SYMBOL(ioremap_cache);
     421             : 
     422           0 : void __iomem *ioremap_prot(resource_size_t phys_addr, unsigned long size,
     423             :                                 unsigned long prot_val)
     424             : {
     425           0 :         return __ioremap_caller(phys_addr, size,
     426           0 :                                 pgprot2cachemode(__pgprot(prot_val)),
     427             :                                 __builtin_return_address(0), false);
     428             : }
     429             : EXPORT_SYMBOL(ioremap_prot);
     430             : 
     431             : /**
     432             :  * iounmap - Free a IO remapping
     433             :  * @addr: virtual address from ioremap_*
     434             :  *
     435             :  * Caller must ensure there is only one unmapping for the same pointer.
     436             :  */
     437           0 : void iounmap(volatile void __iomem *addr)
     438             : {
     439           0 :         struct vm_struct *p, *o;
     440             : 
     441           0 :         if ((void __force *)addr <= high_memory)
     442             :                 return;
     443             : 
     444             :         /*
     445             :          * The PCI/ISA range special-casing was removed from __ioremap()
     446             :          * so this check, in theory, can be removed. However, there are
     447             :          * cases where iounmap() is called for addresses not obtained via
     448             :          * ioremap() (vga16fb for example). Add a warning so that these
     449             :          * cases can be caught and fixed.
     450             :          */
     451           0 :         if ((void __force *)addr >= phys_to_virt(ISA_START_ADDRESS) &&
     452           0 :             (void __force *)addr < phys_to_virt(ISA_END_ADDRESS)) {
     453           0 :                 WARN(1, "iounmap() called for ISA range not obtained using ioremap()\n");
     454           0 :                 return;
     455             :         }
     456             : 
     457           0 :         mmiotrace_iounmap(addr);
     458             : 
     459           0 :         addr = (volatile void __iomem *)
     460           0 :                 (PAGE_MASK & (unsigned long __force)addr);
     461             : 
     462             :         /* Use the vm area unlocked, assuming the caller
     463             :            ensures there isn't another iounmap for the same address
     464             :            in parallel. Reuse of the virtual address is prevented by
     465             :            leaving it in the global lists until we're done with it.
     466             :            cpa takes care of the direct mappings. */
     467           0 :         p = find_vm_area((void __force *)addr);
     468             : 
     469           0 :         if (!p) {
     470           0 :                 printk(KERN_ERR "iounmap: bad address %p\n", addr);
     471           0 :                 dump_stack();
     472           0 :                 return;
     473             :         }
     474             : 
     475           0 :         memtype_free(p->phys_addr, p->phys_addr + get_vm_area_size(p));
     476             : 
     477             :         /* Finally remove it */
     478           0 :         o = remove_vm_area((void __force *)addr);
     479           0 :         BUG_ON(p != o || o == NULL);
     480           0 :         kfree(p);
     481             : }
     482             : EXPORT_SYMBOL(iounmap);
     483             : 
     484           1 : int __init arch_ioremap_p4d_supported(void)
     485             : {
     486           1 :         return 0;
     487             : }
     488             : 
     489           1 : int __init arch_ioremap_pud_supported(void)
     490             : {
     491             : #ifdef CONFIG_X86_64
     492           1 :         return boot_cpu_has(X86_FEATURE_GBPAGES);
     493             : #else
     494             :         return 0;
     495             : #endif
     496             : }
     497             : 
     498           1 : int __init arch_ioremap_pmd_supported(void)
     499             : {
     500           1 :         return boot_cpu_has(X86_FEATURE_PSE);
     501             : }
     502             : 
     503             : /*
     504             :  * Convert a physical pointer to a virtual kernel pointer for /dev/mem
     505             :  * access
     506             :  */
     507           0 : void *xlate_dev_mem_ptr(phys_addr_t phys)
     508             : {
     509           0 :         unsigned long start  = phys &  PAGE_MASK;
     510           0 :         unsigned long offset = phys & ~PAGE_MASK;
     511           0 :         void *vaddr;
     512             : 
     513             :         /* memremap() maps if RAM, otherwise falls back to ioremap() */
     514           0 :         vaddr = memremap(start, PAGE_SIZE, MEMREMAP_WB);
     515             : 
     516             :         /* Only add the offset on success and return NULL if memremap() failed */
     517           0 :         if (vaddr)
     518           0 :                 vaddr += offset;
     519             : 
     520           0 :         return vaddr;
     521             : }
     522             : 
     523           0 : void unxlate_dev_mem_ptr(phys_addr_t phys, void *addr)
     524             : {
     525           0 :         memunmap((void *)((unsigned long)addr & PAGE_MASK));
     526           0 : }
     527             : 
     528             : /*
     529             :  * Examine the physical address to determine if it is an area of memory
     530             :  * that should be mapped decrypted.  If the memory is not part of the
     531             :  * kernel usable area it was accessed and created decrypted, so these
     532             :  * areas should be mapped decrypted. And since the encryption key can
     533             :  * change across reboots, persistent memory should also be mapped
     534             :  * decrypted.
     535             :  *
     536             :  * If SEV is active, that implies that BIOS/UEFI also ran encrypted so
     537             :  * only persistent memory should be mapped decrypted.
     538             :  */
     539             : static bool memremap_should_map_decrypted(resource_size_t phys_addr,
     540             :                                           unsigned long size)
     541             : {
     542             :         int is_pmem;
     543             : 
     544             :         /*
     545             :          * Check if the address is part of a persistent memory region.
     546             :          * This check covers areas added by E820, EFI and ACPI.
     547             :          */
     548             :         is_pmem = region_intersects(phys_addr, size, IORESOURCE_MEM,
     549             :                                     IORES_DESC_PERSISTENT_MEMORY);
     550             :         if (is_pmem != REGION_DISJOINT)
     551             :                 return true;
     552             : 
     553             :         /*
     554             :          * Check if the non-volatile attribute is set for an EFI
     555             :          * reserved area.
     556             :          */
     557             :         if (efi_enabled(EFI_BOOT)) {
     558             :                 switch (efi_mem_type(phys_addr)) {
     559             :                 case EFI_RESERVED_TYPE:
     560             :                         if (efi_mem_attributes(phys_addr) & EFI_MEMORY_NV)
     561             :                                 return true;
     562             :                         break;
     563             :                 default:
     564             :                         break;
     565             :                 }
     566             :         }
     567             : 
     568             :         /* Check if the address is outside kernel usable area */
     569             :         switch (e820__get_entry_type(phys_addr, phys_addr + size - 1)) {
     570             :         case E820_TYPE_RESERVED:
     571             :         case E820_TYPE_ACPI:
     572             :         case E820_TYPE_NVS:
     573             :         case E820_TYPE_UNUSABLE:
     574             :                 /* For SEV, these areas are encrypted */
     575             :                 if (sev_active())
     576             :                         break;
     577             :                 fallthrough;
     578             : 
     579             :         case E820_TYPE_PRAM:
     580             :                 return true;
     581             :         default:
     582             :                 break;
     583             :         }
     584             : 
     585             :         return false;
     586             : }
     587             : 
     588             : /*
     589             :  * Examine the physical address to determine if it is EFI data. Check
     590             :  * it against the boot params structure and EFI tables and memory types.
     591             :  */
     592             : static bool memremap_is_efi_data(resource_size_t phys_addr,
     593             :                                  unsigned long size)
     594             : {
     595             :         u64 paddr;
     596             : 
     597             :         /* Check if the address is part of EFI boot/runtime data */
     598             :         if (!efi_enabled(EFI_BOOT))
     599             :                 return false;
     600             : 
     601             :         paddr = boot_params.efi_info.efi_memmap_hi;
     602             :         paddr <<= 32;
     603             :         paddr |= boot_params.efi_info.efi_memmap;
     604             :         if (phys_addr == paddr)
     605             :                 return true;
     606             : 
     607             :         paddr = boot_params.efi_info.efi_systab_hi;
     608             :         paddr <<= 32;
     609             :         paddr |= boot_params.efi_info.efi_systab;
     610             :         if (phys_addr == paddr)
     611             :                 return true;
     612             : 
     613             :         if (efi_is_table_address(phys_addr))
     614             :                 return true;
     615             : 
     616             :         switch (efi_mem_type(phys_addr)) {
     617             :         case EFI_BOOT_SERVICES_DATA:
     618             :         case EFI_RUNTIME_SERVICES_DATA:
     619             :                 return true;
     620             :         default:
     621             :                 break;
     622             :         }
     623             : 
     624             :         return false;
     625             : }
     626             : 
     627             : /*
     628             :  * Examine the physical address to determine if it is boot data by checking
     629             :  * it against the boot params setup_data chain.
     630             :  */
     631             : static bool memremap_is_setup_data(resource_size_t phys_addr,
     632             :                                    unsigned long size)
     633             : {
     634             :         struct setup_data *data;
     635             :         u64 paddr, paddr_next;
     636             : 
     637             :         paddr = boot_params.hdr.setup_data;
     638             :         while (paddr) {
     639             :                 unsigned int len;
     640             : 
     641             :                 if (phys_addr == paddr)
     642             :                         return true;
     643             : 
     644             :                 data = memremap(paddr, sizeof(*data),
     645             :                                 MEMREMAP_WB | MEMREMAP_DEC);
     646             : 
     647             :                 paddr_next = data->next;
     648             :                 len = data->len;
     649             : 
     650             :                 if ((phys_addr > paddr) && (phys_addr < (paddr + len))) {
     651             :                         memunmap(data);
     652             :                         return true;
     653             :                 }
     654             : 
     655             :                 if (data->type == SETUP_INDIRECT &&
     656             :                     ((struct setup_indirect *)data->data)->type != SETUP_INDIRECT) {
     657             :                         paddr = ((struct setup_indirect *)data->data)->addr;
     658             :                         len = ((struct setup_indirect *)data->data)->len;
     659             :                 }
     660             : 
     661             :                 memunmap(data);
     662             : 
     663             :                 if ((phys_addr > paddr) && (phys_addr < (paddr + len)))
     664             :                         return true;
     665             : 
     666             :                 paddr = paddr_next;
     667             :         }
     668             : 
     669             :         return false;
     670             : }
     671             : 
     672             : /*
     673             :  * Examine the physical address to determine if it is boot data by checking
     674             :  * it against the boot params setup_data chain (early boot version).
     675             :  */
     676             : static bool __init early_memremap_is_setup_data(resource_size_t phys_addr,
     677             :                                                 unsigned long size)
     678             : {
     679             :         struct setup_data *data;
     680             :         u64 paddr, paddr_next;
     681             : 
     682             :         paddr = boot_params.hdr.setup_data;
     683             :         while (paddr) {
     684             :                 unsigned int len;
     685             : 
     686             :                 if (phys_addr == paddr)
     687             :                         return true;
     688             : 
     689             :                 data = early_memremap_decrypted(paddr, sizeof(*data));
     690             : 
     691             :                 paddr_next = data->next;
     692             :                 len = data->len;
     693             : 
     694             :                 early_memunmap(data, sizeof(*data));
     695             : 
     696             :                 if ((phys_addr > paddr) && (phys_addr < (paddr + len)))
     697             :                         return true;
     698             : 
     699             :                 paddr = paddr_next;
     700             :         }
     701             : 
     702             :         return false;
     703             : }
     704             : 
     705             : /*
     706             :  * Architecture function to determine if RAM remap is allowed. By default, a
     707             :  * RAM remap will map the data as encrypted. Determine if a RAM remap should
     708             :  * not be done so that the data will be mapped decrypted.
     709             :  */
     710           0 : bool arch_memremap_can_ram_remap(resource_size_t phys_addr, unsigned long size,
     711             :                                  unsigned long flags)
     712             : {
     713           0 :         if (!mem_encrypt_active())
     714           0 :                 return true;
     715             : 
     716             :         if (flags & MEMREMAP_ENC)
     717             :                 return true;
     718             : 
     719             :         if (flags & MEMREMAP_DEC)
     720             :                 return false;
     721             : 
     722             :         if (sme_active()) {
     723             :                 if (memremap_is_setup_data(phys_addr, size) ||
     724             :                     memremap_is_efi_data(phys_addr, size))
     725             :                         return false;
     726             :         }
     727             : 
     728             :         return !memremap_should_map_decrypted(phys_addr, size);
     729             : }
     730             : 
     731             : /*
     732             :  * Architecture override of __weak function to adjust the protection attributes
     733             :  * used when remapping memory. By default, early_memremap() will map the data
     734             :  * as encrypted. Determine if an encrypted mapping should not be done and set
     735             :  * the appropriate protection attributes.
     736             :  */
     737          69 : pgprot_t __init early_memremap_pgprot_adjust(resource_size_t phys_addr,
     738             :                                              unsigned long size,
     739             :                                              pgprot_t prot)
     740             : {
     741          69 :         bool encrypted_prot;
     742             : 
     743          69 :         if (!mem_encrypt_active())
     744          69 :                 return prot;
     745             : 
     746             :         encrypted_prot = true;
     747             : 
     748             :         if (sme_active()) {
     749             :                 if (early_memremap_is_setup_data(phys_addr, size) ||
     750             :                     memremap_is_efi_data(phys_addr, size))
     751             :                         encrypted_prot = false;
     752             :         }
     753             : 
     754             :         if (encrypted_prot && memremap_should_map_decrypted(phys_addr, size))
     755             :                 encrypted_prot = false;
     756             : 
     757             :         return encrypted_prot ? pgprot_encrypted(prot)
     758             :                               : pgprot_decrypted(prot);
     759             : }
     760             : 
     761           0 : bool phys_mem_access_encrypted(unsigned long phys_addr, unsigned long size)
     762             : {
     763           0 :         return arch_memremap_can_ram_remap(phys_addr, size, 0);
     764             : }
     765             : 
     766             : #ifdef CONFIG_AMD_MEM_ENCRYPT
     767             : /* Remap memory with encryption */
     768             : void __init *early_memremap_encrypted(resource_size_t phys_addr,
     769             :                                       unsigned long size)
     770             : {
     771             :         return early_memremap_prot(phys_addr, size, __PAGE_KERNEL_ENC);
     772             : }
     773             : 
     774             : /*
     775             :  * Remap memory with encryption and write-protected - cannot be called
     776             :  * before pat_init() is called
     777             :  */
     778             : void __init *early_memremap_encrypted_wp(resource_size_t phys_addr,
     779             :                                          unsigned long size)
     780             : {
     781             :         if (!x86_has_pat_wp())
     782             :                 return NULL;
     783             :         return early_memremap_prot(phys_addr, size, __PAGE_KERNEL_ENC_WP);
     784             : }
     785             : 
     786             : /* Remap memory without encryption */
     787             : void __init *early_memremap_decrypted(resource_size_t phys_addr,
     788             :                                       unsigned long size)
     789             : {
     790             :         return early_memremap_prot(phys_addr, size, __PAGE_KERNEL_NOENC);
     791             : }
     792             : 
     793             : /*
     794             :  * Remap memory without encryption and write-protected - cannot be called
     795             :  * before pat_init() is called
     796             :  */
     797             : void __init *early_memremap_decrypted_wp(resource_size_t phys_addr,
     798             :                                          unsigned long size)
     799             : {
     800             :         if (!x86_has_pat_wp())
     801             :                 return NULL;
     802             :         return early_memremap_prot(phys_addr, size, __PAGE_KERNEL_NOENC_WP);
     803             : }
     804             : #endif  /* CONFIG_AMD_MEM_ENCRYPT */
     805             : 
     806             : static pte_t bm_pte[PAGE_SIZE/sizeof(pte_t)] __page_aligned_bss;
     807             : 
     808           2 : static inline pmd_t * __init early_ioremap_pmd(unsigned long addr)
     809             : {
     810             :         /* Don't assume we're using swapper_pg_dir at this point */
     811           2 :         pgd_t *base = __va(read_cr3_pa());
     812           2 :         pgd_t *pgd = &base[pgd_index(addr)];
     813           2 :         p4d_t *p4d = p4d_offset(pgd, addr);
     814           2 :         pud_t *pud = pud_offset(p4d, addr);
     815           2 :         pmd_t *pmd = pmd_offset(pud, addr);
     816             : 
     817           2 :         return pmd;
     818             : }
     819             : 
     820         142 : static inline pte_t * __init early_ioremap_pte(unsigned long addr)
     821             : {
     822         142 :         return &bm_pte[pte_index(addr)];
     823             : }
     824             : 
     825           0 : bool __init is_early_ioremap_ptep(pte_t *ptep)
     826             : {
     827           0 :         return ptep >= &bm_pte[0] && ptep < &bm_pte[PAGE_SIZE/sizeof(pte_t)];
     828             : }
     829             : 
     830           1 : void __init early_ioremap_init(void)
     831             : {
     832           1 :         pmd_t *pmd;
     833             : 
     834             : #ifdef CONFIG_X86_64
     835           1 :         BUILD_BUG_ON((fix_to_virt(0) + PAGE_SIZE) & ((1 << PMD_SHIFT) - 1));
     836             : #else
     837             :         WARN_ON((fix_to_virt(0) + PAGE_SIZE) & ((1 << PMD_SHIFT) - 1));
     838             : #endif
     839             : 
     840           1 :         early_ioremap_setup();
     841             : 
     842           1 :         pmd = early_ioremap_pmd(fix_to_virt(FIX_BTMAP_BEGIN));
     843           1 :         memset(bm_pte, 0, sizeof(bm_pte));
     844           1 :         pmd_populate_kernel(&init_mm, pmd, bm_pte);
     845             : 
     846             :         /*
     847             :          * The boot-ioremap range spans multiple pmds, for which
     848             :          * we are not prepared:
     849             :          */
     850             : #define __FIXADDR_TOP (-PAGE_SIZE)
     851           1 :         BUILD_BUG_ON((__fix_to_virt(FIX_BTMAP_BEGIN) >> PMD_SHIFT)
     852             :                      != (__fix_to_virt(FIX_BTMAP_END) >> PMD_SHIFT));
     853             : #undef __FIXADDR_TOP
     854           1 :         if (pmd != early_ioremap_pmd(fix_to_virt(FIX_BTMAP_END))) {
     855           0 :                 WARN_ON(1);
     856           0 :                 printk(KERN_WARNING "pmd %p != %p\n",
     857             :                        pmd, early_ioremap_pmd(fix_to_virt(FIX_BTMAP_END)));
     858           0 :                 printk(KERN_WARNING "fix_to_virt(FIX_BTMAP_BEGIN): %08lx\n",
     859             :                         fix_to_virt(FIX_BTMAP_BEGIN));
     860           0 :                 printk(KERN_WARNING "fix_to_virt(FIX_BTMAP_END):   %08lx\n",
     861             :                         fix_to_virt(FIX_BTMAP_END));
     862             : 
     863           0 :                 printk(KERN_WARNING "FIX_BTMAP_END:       %d\n", FIX_BTMAP_END);
     864           0 :                 printk(KERN_WARNING "FIX_BTMAP_BEGIN:     %d\n",
     865             :                        FIX_BTMAP_BEGIN);
     866             :         }
     867           1 : }
     868             : 
     869         142 : void __init __early_set_fixmap(enum fixed_addresses idx,
     870             :                                phys_addr_t phys, pgprot_t flags)
     871             : {
     872         142 :         unsigned long addr = __fix_to_virt(idx);
     873         142 :         pte_t *pte;
     874             : 
     875         142 :         if (idx >= __end_of_fixed_addresses) {
     876           0 :                 BUG();
     877             :                 return;
     878             :         }
     879         142 :         pte = early_ioremap_pte(addr);
     880             : 
     881             :         /* Sanitize 'prot' against any unsupported bits: */
     882         142 :         pgprot_val(flags) &= __supported_pte_mask;
     883             : 
     884         142 :         if (pgprot_val(flags))
     885          71 :                 set_pte(pte, pfn_pte(phys >> PAGE_SHIFT, flags));
     886             :         else
     887          71 :                 pte_clear(&init_mm, addr, pte);
     888         142 :         flush_tlb_one_kernel(addr);
     889             : }

Generated by: LCOV version 1.14