Move must_use_aliases_{source,target} functions to qemu-kvm-<arch> and
introduce qemu-kvm-arch.h header files, making it possible to inline
functions that a noops on a given architecture.
This removes a lot of ugly #ifdef TARGET_I386 from qemu-kvm.c
Signed-off-by: Jes Sorensen <jes@sgi.com>
---
qemu-kvm-x86.c | 25 +++++++++++++++++++-
qemu-kvm.c | 53 +++++++-------------------------------------
qemu-kvm.h | 13 ++++++++++
target-i386/qemu-kvm-arch.h | 17 ++++++++++++++
target-ia64/qemu-kvm-arch.h | 14 +++++++++++
target-ppc/qemu-kvm-arch.h | 14 +++++++++++
6 files changed, 91 insertions(+), 45 deletions(-)
===================================================================
@@ -28,6 +28,8 @@
static int lm_capable_kernel;
+static int destroy_region_works = 0;
+
int kvm_qemu_create_memory_alias(uint64_t phys_start,
uint64_t len,
uint64_t target_phys)
@@ -57,7 +59,10 @@
for (i = 0; i < kvm_msr_list->nmsrs; ++i)
if (kvm_msr_list->indices[i] == MSR_STAR)
kvm_has_msr_star = 1;
- return 0;
+
+ destroy_region_works = kvm_destroy_memory_region_works(kvm_context);
+
+ return 0;
}
static void set_msr_entry(struct kvm_msr_entry *entry, uint32_t index,
@@ -856,3 +861,21 @@
struct ioperm_data *data = _data;
ioperm(data->start_port, data->num, data->turn_on);
}
+
+int kvm_arch_must_use_aliases_source(target_phys_addr_t addr)
+{
+ if (destroy_region_works)
+ return false;
+ if (addr == 0xa0000 || addr == 0xa8000)
+ return true;
+ return false;
+}
+
+int kvm_arch_must_use_aliases_target(target_phys_addr_t addr)
+{
+ if (destroy_region_works)
+ return false;
+ if (addr >= 0xe0000000 && addr < 0x100000000ull)
+ return true;
+ return false;
+}
===================================================================
@@ -767,10 +767,6 @@
return 0;
}
-#ifdef TARGET_I386
-static int destroy_region_works = 0;
-#endif
-
int kvm_qemu_create_context(void)
{
int r;
@@ -795,9 +791,6 @@
return -1;
}
}
-#ifdef TARGET_I386
- destroy_region_works = kvm_destroy_memory_region_works(kvm_context);
-#endif
if (kvm_irqchip && kvm_has_gsi_routing(kvm_context)) {
kvm_clear_gsi_routes(kvm_context);
@@ -829,24 +822,6 @@
}
#ifdef TARGET_I386
-static int must_use_aliases_source(target_phys_addr_t addr)
-{
- if (destroy_region_works)
- return false;
- if (addr == 0xa0000 || addr == 0xa8000)
- return true;
- return false;
-}
-
-static int must_use_aliases_target(target_phys_addr_t addr)
-{
- if (destroy_region_works)
- return false;
- if (addr >= 0xe0000000 && addr < 0x100000000ull)
- return true;
- return false;
-}
-
static struct mapping {
target_phys_addr_t phys;
ram_addr_t ram;
@@ -905,14 +880,13 @@
area_flags = phys_offset & ~TARGET_PAGE_MASK;
if (area_flags != IO_MEM_RAM) {
-#ifdef TARGET_I386
- if (must_use_aliases_source(start_addr)) {
+ if (kvm_arch_must_use_aliases_source(start_addr)) {
kvm_destroy_memory_alias(kvm_context, start_addr);
return;
}
- if (must_use_aliases_target(start_addr))
+ if (kvm_arch_must_use_aliases_target(start_addr))
return;
-#endif
+
while (size > 0) {
p = find_mapping(start_addr);
if (p) {
@@ -936,8 +910,7 @@
if (area_flags >= TLB_MMIO)
return;
-#ifdef TARGET_I386
- if (must_use_aliases_source(start_addr)) {
+ if (kvm_arch_must_use_aliases_source(start_addr)) {
p = find_ram_mapping(phys_offset);
if (p) {
kvm_create_memory_alias(kvm_context, start_addr, size,
@@ -945,7 +918,6 @@
}
return;
}
-#endif
r = kvm_register_phys_mem(kvm_context, start_addr,
qemu_get_ram_ptr(phys_offset),
@@ -1256,10 +1228,9 @@
if (log)
kvm_dirty_pages_log_enable_slot(kvm_context, start, size);
else {
-#ifdef TARGET_I386
- if (must_use_aliases_target(start))
+ if (kvm_arch_must_use_aliases_target(start))
return;
-#endif
+
kvm_dirty_pages_log_disable_slot(kvm_context, start, size);
}
}
@@ -1375,10 +1346,8 @@
#ifndef TARGET_IA64
void *buf;
-#ifdef TARGET_I386
- if (must_use_aliases_source(start_addr))
+ if (kvm_arch_must_use_aliases_source(start_addr))
return;
-#endif
buf = qemu_malloc((end_addr - start_addr) / 8 + 2);
kvm_get_dirty_pages_range(kvm_context, start_addr, end_addr - start_addr,
@@ -1389,10 +1358,8 @@
int kvm_log_start(target_phys_addr_t phys_addr, target_phys_addr_t len)
{
-#ifdef TARGET_I386
- if (must_use_aliases_source(phys_addr))
+ if (kvm_arch_must_use_aliases_source(phys_addr))
return 0;
-#endif
#ifndef TARGET_IA64
kvm_qemu_log_memory(phys_addr, len, 1);
@@ -1402,10 +1369,8 @@
int kvm_log_stop(target_phys_addr_t phys_addr, target_phys_addr_t len)
{
-#ifdef TARGET_I386
- if (must_use_aliases_source(phys_addr))
+ if (kvm_arch_must_use_aliases_source(phys_addr))
return 0;
-#endif
#ifndef TARGET_IA64
kvm_qemu_log_memory(phys_addr, len, 0);
===================================================================
@@ -9,6 +9,7 @@
#define THE_ORIGINAL_AND_TRUE_QEMU_KVM_H
#include "cpu.h"
+#include "qemu-kvm-arch.h"
#include <signal.h>
@@ -233,4 +234,16 @@
}
}
+#ifdef KVM_ARCH_NO_ADDR_ALIASING
+static inline int kvm_arch_must_use_aliases_source(target_phys_addr_t addr)
+{
+ return 0;
+}
+
+static inline int kvm_arch_must_use_aliases_target(target_phys_addr_t addr)
+{
+ return 0;
+}
+#endif
+
#endif
===================================================================
@@ -0,0 +1,17 @@
+/*
+ * qemu/kvm x86 integration
+ *
+ * Copyright (C) 2006-2008 Qumranet Technologies
+ * Copyright (C) 2009 Silicon Graphics Inc.
+ *
+ * Licensed under the terms of the GNU GPL version 2 or higher.
+ */
+#ifndef QEMU_KVM_ARCH_H
+#define QEMU_KVM_ARCH_H
+
+#include "cpu-all.h"
+
+extern int kvm_arch_must_use_aliases_source(target_phys_addr_t addr);
+extern int kvm_arch_must_use_aliases_target(target_phys_addr_t addr);
+
+#endif
===================================================================
@@ -0,0 +1,14 @@
+/*
+ * qemu/kvm ia64 integration
+ *
+ * Copyright (C) 2006-2008 Qumranet Technologies
+ * Copyright (C) 2009 SGI
+ *
+ * Licensed under the terms of the GNU GPL version 2 or higher.
+ */
+#ifndef QEMU_KVM_ARCH_H
+#define QEMU_KVM_ARCH_H
+
+#define KVM_ARCH_NO_ADDR_ALIASING 1
+
+#endif
===================================================================
@@ -0,0 +1,14 @@
+/*
+ * qemu/kvm PPC integration
+ *
+ * Copyright (C) 2006-2008 Qumranet Technologies
+ * Copyright (C) 2009 SGI
+ *
+ * Licensed under the terms of the GNU GPL version 2 or higher.
+ */
+#ifndef QEMU_KVM_ARCH_H
+#define QEMU_KVM_ARCH_H
+
+#define KVM_ARCH_NO_ADDR_ALIASING 1
+
+#endif