[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 13/30] memory: limit sections in the radix tree to t
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH 13/30] memory: limit sections in the radix tree to the actual address space size |
Date: |
Tue, 21 May 2013 12:57:14 +0200 |
From: Avi Kivity <address@hidden>
The radix tree is statically sized to fit TARGET_PHYS_ADDR_SPACE_BITS.
If a larger memory region is registered, it will overflow.
Fix by limiting any section in the radix tree to the supported size.
This problem was not observed earlier since artificial regions (containers
and aliases) are eliminated by the memory core, leaving only device regions
which have reasonable sizes. An IOMMU however cannot be eliminated by the
memory core, and may have an artificial size.
Signed-off-by: Avi Kivity <address@hidden>
[ Fail the build if TARGET_PHYS_ADDR_SPACE_BITS is too large - Paolo ]
Signed-off-by: Paolo Bonzini <address@hidden>
---
exec.c | 13 ++++++++++++-
include/exec/memory.h | 3 +++
2 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/exec.c b/exec.c
index 380245f..8d91221 100644
--- a/exec.c
+++ b/exec.c
@@ -771,10 +771,21 @@ static void register_multipage(AddressSpaceDispatch *d,
MemoryRegionSection *sec
section_index);
}
+QEMU_BUILD_BUG_ON(TARGET_PHYS_ADDR_SPACE_BITS > MAX_PHYS_ADDR_SPACE_BITS)
+
+static MemoryRegionSection limit(MemoryRegionSection section)
+{
+ section.size = MIN(section.offset_within_address_space + section.size,
+ MAX_PHYS_ADDR + 1)
+ - section.offset_within_address_space;
+
+ return section;
+}
+
static void mem_add(MemoryListener *listener, MemoryRegionSection *section)
{
AddressSpaceDispatch *d = container_of(listener, AddressSpaceDispatch,
listener);
- MemoryRegionSection now = *section, remain = *section;
+ MemoryRegionSection now = limit(*section), remain = limit(*section);
if ((now.offset_within_address_space & ~TARGET_PAGE_MASK)
|| (now.size < TARGET_PAGE_SIZE)) {
diff --git a/include/exec/memory.h b/include/exec/memory.h
index 9fae89b..6ed593c 100644
--- a/include/exec/memory.h
+++ b/include/exec/memory.h
@@ -26,6 +26,9 @@
#include "exec/ioport.h"
#include "qemu/int128.h"
+#define MAX_PHYS_ADDR_SPACE_BITS 62
+#define MAX_PHYS_ADDR (((hwaddr)1 << MAX_PHYS_ADDR_SPACE_BITS) - 1)
+
typedef struct MemoryRegionOps MemoryRegionOps;
typedef struct MemoryRegionPortio MemoryRegionPortio;
typedef struct MemoryRegionMmio MemoryRegionMmio;
--
1.8.1.4
- Re: [Qemu-devel] [PATCH 07/30] memory: Replace open-coded memory_region_is_romd, (continued)
- [Qemu-devel] [PATCH 08/30] memory: Rename readable flag to romd_mode, Paolo Bonzini, 2013/05/21
- [Qemu-devel] [PATCH 09/30] memory: do not duplicate memory_region_destructor_none, Paolo Bonzini, 2013/05/21
- [Qemu-devel] [PATCH 10/30] memory: make memory_global_sync_dirty_bitmap take an AddressSpace, Paolo Bonzini, 2013/05/21
- [Qemu-devel] [PATCH 11/30] memory: fix address space initialization/destruction, Paolo Bonzini, 2013/05/21
- [Qemu-devel] [PATCH 12/30] s390x: reduce TARGET_PHYS_ADDR_SPACE_BITS to 62, Paolo Bonzini, 2013/05/21
- [Qemu-devel] [PATCH 13/30] memory: limit sections in the radix tree to the actual address space size,
Paolo Bonzini <=
- [Qemu-devel] [PATCH 14/30] memory: create FlatView for new address spaces, Paolo Bonzini, 2013/05/21
- [Qemu-devel] [PATCH 15/30] memory: add address_space_valid, Paolo Bonzini, 2013/05/21
- Re: [Qemu-devel] [PATCH 15/30] memory: add address_space_valid, Peter Maydell, 2013/05/23