2019-06-03 07:44:50 +02:00
// SPDX-License-Identifier: GPL-2.0-only
2012-03-05 11:49:27 +00:00
/*
* Based on arch / arm / mm / mmap . c
*
* Copyright ( C ) 2012 ARM Ltd .
*/
# include <linux/elf.h>
# include <linux/fs.h>
2017-05-19 16:42:00 +01:00
# include <linux/memblock.h>
2012-03-05 11:49:27 +00:00
# include <linux/mm.h>
# include <linux/mman.h>
# include <linux/export.h>
# include <linux/shm.h>
2017-02-08 18:51:30 +01:00
# include <linux/sched/signal.h>
2017-02-08 18:51:31 +01:00
# include <linux/sched/mm.h>
2012-03-05 11:49:27 +00:00
# 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 .
*/
2014-10-02 15:56:59 +01:00
int valid_phys_addr_range ( phys_addr_t addr , size_t size )
2012-03-05 11:49:27 +00:00
{
2017-05-19 16:42:00 +01:00
/*
* 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 ) ;
2012-03-05 11:49:27 +00:00
}
/*
* 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