12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- // SPDX-License-Identifier: GPL-2.0-only
- /*
- * Based on arch/arm/mm/mmap.c
- *
- * Copyright (C) 2012 ARM Ltd.
- */
- #include <linux/elf.h>
- #include <linux/fs.h>
- #include <linux/memblock.h>
- #include <linux/mm.h>
- #include <linux/mman.h>
- #include <linux/export.h>
- #include <linux/shm.h>
- #include <linux/sched/signal.h>
- #include <linux/sched/mm.h>
- #include <linux/io.h>
- #include <linux/personality.h>
- #include <linux/random.h>
- #include <asm/cputype.h>
- /*
- * You really shouldn't be using read() or write() on /dev/mem. This might go
- * away in the future.
- */
- int valid_phys_addr_range(phys_addr_t addr, size_t size)
- {
- /*
- * Check whether addr is covered by a memory region without the
- * MEMBLOCK_NOMAP attribute, and whether that region covers the
- * entire range. In theory, this could lead to false negatives
- * if the range is covered by distinct but adjacent memory regions
- * that only differ in other attributes. However, few of such
- * attributes have been defined, and it is debatable whether it
- * follows that /dev/mem read() calls should be able traverse
- * such boundaries.
- */
- return memblock_is_region_memory(addr, size) &&
- memblock_is_map_memory(addr);
- }
- /*
- * Do not allow /dev/mem mappings beyond the supported physical range.
- */
- int valid_mmap_phys_addr_range(unsigned long pfn, size_t size)
- {
- return !(((pfn << PAGE_SHIFT) + size) & ~PHYS_MASK);
- }
- #ifdef CONFIG_STRICT_DEVMEM
- #include <linux/ioport.h>
- /*
- * devmem_is_allowed() checks to see if /dev/mem access to a certain address
- * is valid. The argument is a physical page number. We mimic x86 here by
- * disallowing access to system RAM as well as device-exclusive MMIO regions.
- * This effectively disable read()/write() on /dev/mem.
- */
- int devmem_is_allowed(unsigned long pfn)
- {
- if (iomem_is_exclusive(pfn << PAGE_SHIFT))
- return 0;
- if (!page_is_ram(pfn))
- return 1;
- return 0;
- }
- #endif
|