svn commit: r294754 - in head/sys/arm: arm include
Andrew Turner
andrew at FreeBSD.org
Mon Jan 25 23:04:42 UTC 2016
Author: andrew
Date: Mon Jan 25 23:04:40 2016
New Revision: 294754
URL: https://svnweb.freebsd.org/changeset/base/294754
Log:
Allow us to be told about memory past the first 4GB point, but ignore it.
This allows, for example, UEFI pass a memory map with some ram in this
region, but for us to ignore it. This is the case when running under the
qemu virt machine type.
Sponsored by: ABT Systems Ltd
Modified:
head/sys/arm/arm/physmem.c
head/sys/arm/include/ofw_machdep.h
head/sys/arm/include/physmem.h
Modified: head/sys/arm/arm/physmem.c
==============================================================================
--- head/sys/arm/arm/physmem.c Mon Jan 25 22:58:06 2016 (r294753)
+++ head/sys/arm/arm/physmem.c Mon Jan 25 23:04:40 2016 (r294754)
@@ -49,6 +49,8 @@ __FBSDID("$FreeBSD$");
#define MAX_HWCNT 10
#define MAX_EXCNT 10
+#define MAX_PHYS_ADDR 0xFFFFFFFFull
+
struct region {
vm_paddr_t addr;
vm_size_t size;
@@ -273,14 +275,25 @@ insert_region(struct region *regions, si
* Add a hardware memory region.
*/
void
-arm_physmem_hardware_region(vm_paddr_t pa, vm_size_t sz)
+arm_physmem_hardware_region(uint64_t pa, uint64_t sz)
{
vm_offset_t adj;
/*
* Filter out the page at PA 0x00000000. The VM can't handle it, as
* pmap_extract() == 0 means failure.
- *
+ */
+ if (pa == 0) {
+ if (sz <= PAGE_SIZE)
+ return;
+ pa = PAGE_SIZE;
+ sz -= PAGE_SIZE;
+ } else if (pa > MAX_PHYS_ADDR) {
+ /* This range is past usable memory, ignore it */
+ return;
+ }
+
+ /*
* Also filter out the page at the end of the physical address space --
* if addr is non-zero and addr+size is zero we wrapped to the next byte
* beyond what vm_paddr_t can express. That leads to a NULL pointer
@@ -291,12 +304,8 @@ arm_physmem_hardware_region(vm_paddr_t p
* pointer deref in _vm_map_lock_read(). Better to give up a megabyte
* than leave some folks with an unusable system while we investigate.
*/
- if (pa == 0) {
- if (sz <= PAGE_SIZE)
- return;
- pa = PAGE_SIZE;
- sz -= PAGE_SIZE;
- } else if (pa + sz == 0) {
+ if ((pa + sz) > (MAX_PHYS_ADDR - 1024 * 1024)) {
+ sz = MAX_PHYS_ADDR - pa + 1;
if (sz <= 1024 * 1024)
return;
sz -= 1024 * 1024;
Modified: head/sys/arm/include/ofw_machdep.h
==============================================================================
--- head/sys/arm/include/ofw_machdep.h Mon Jan 25 22:58:06 2016 (r294753)
+++ head/sys/arm/include/ofw_machdep.h Mon Jan 25 23:04:40 2016 (r294754)
@@ -40,8 +40,8 @@
typedef uint32_t cell_t;
struct mem_region {
- vm_offset_t mr_start;
- vm_size_t mr_size;
+ uint64_t mr_start;
+ uint64_t mr_size;
};
#endif /* _MACHINE_OFW_MACHDEP_H_ */
Modified: head/sys/arm/include/physmem.h
==============================================================================
--- head/sys/arm/include/physmem.h Mon Jan 25 22:58:06 2016 (r294753)
+++ head/sys/arm/include/physmem.h Mon Jan 25 23:04:40 2016 (r294754)
@@ -52,7 +52,7 @@ extern vm_paddr_t arm_physmem_kernaddr;
#define EXFLAG_NODUMP 0x01
#define EXFLAG_NOALLOC 0x02
-void arm_physmem_hardware_region(vm_paddr_t pa, vm_size_t sz);
+void arm_physmem_hardware_region(uint64_t pa, uint64_t sz);
void arm_physmem_exclude_region(vm_paddr_t pa, vm_size_t sz, uint32_t flags);
void arm_physmem_init_kernel_globals(void);
void arm_physmem_print_tables(void);
More information about the svn-src-head
mailing list