mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
40 lines
1.1 KiB
40 lines
1.1 KiB
// SPDX-License-Identifier: GPL-2.0-only |
|
/* |
|
* Based on arch/arm/mm/mmap.c |
|
* |
|
* Copyright (C) 2012 ARM Ltd. |
|
*/ |
|
|
|
#include <linux/io.h> |
|
#include <linux/memblock.h> |
|
#include <linux/types.h> |
|
|
|
#include <asm/page.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); |
|
}
|
|
|