cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

physaddr.c (1438B)


      1// SPDX-License-Identifier: GPL-2.0
      2#include <linux/bug.h>
      3#include <linux/export.h>
      4#include <linux/types.h>
      5#include <linux/mmdebug.h>
      6#include <linux/mm.h>
      7
      8#include <asm/sections.h>
      9#include <asm/io.h>
     10#include <asm/page.h>
     11#include <asm/dma.h>
     12
     13static inline bool __debug_virt_addr_valid(unsigned long x)
     14{
     15	/* high_memory does not get immediately defined, and there
     16	 * are early callers of __pa() against PAGE_OFFSET
     17	 */
     18	if (!high_memory && x >= PAGE_OFFSET)
     19		return true;
     20
     21	if (high_memory && x >= PAGE_OFFSET && x < (unsigned long)high_memory)
     22		return true;
     23
     24	/*
     25	 * MAX_DMA_ADDRESS is a virtual address that may not correspond to an
     26	 * actual physical address. Enough code relies on
     27	 * virt_to_phys(MAX_DMA_ADDRESS) that we just need to work around it
     28	 * and always return true.
     29	 */
     30	if (x == MAX_DMA_ADDRESS)
     31		return true;
     32
     33	return false;
     34}
     35
     36phys_addr_t __virt_to_phys(volatile const void *x)
     37{
     38	WARN(!__debug_virt_addr_valid((unsigned long)x),
     39	     "virt_to_phys used for non-linear address: %pK (%pS)\n",
     40	     x, x);
     41
     42	return __virt_to_phys_nodebug(x);
     43}
     44EXPORT_SYMBOL(__virt_to_phys);
     45
     46phys_addr_t __phys_addr_symbol(unsigned long x)
     47{
     48	/* This is bounds checking against the kernel image only.
     49	 * __pa_symbol should only be used on kernel symbol addresses.
     50	 */
     51	VIRTUAL_BUG_ON(x < (unsigned long)_text ||
     52		       x > (unsigned long)_end);
     53
     54	return __pa_symbol_nodebug(x);
     55}
     56EXPORT_SYMBOL(__phys_addr_symbol);