When registering memory banks for a guest, it is useful to keep the
range information around for translating between guest and host address
spaces.

This patch adds a list of kvm_mem_bank structures to struct kvm, which
is updated when a new bank is registered.

Signed-off-by: Will Deacon <[email protected]>
---
 tools/kvm/include/kvm/kvm.h |  8 ++++++++
 tools/kvm/kvm.c             | 23 ++++++++++++++++++++++-
 2 files changed, 30 insertions(+), 1 deletion(-)

diff --git a/tools/kvm/include/kvm/kvm.h b/tools/kvm/include/kvm/kvm.h
index cf959ea..9b4a9a4 100644
--- a/tools/kvm/include/kvm/kvm.h
+++ b/tools/kvm/include/kvm/kvm.h
@@ -35,6 +35,13 @@ struct kvm_ext {
        int code;
 };
 
+struct kvm_mem_bank {
+       struct list_head        list;
+       u64                     guest_phys_addr;
+       void                    *host_addr;
+       u64                     size;
+};
+
 struct kvm {
        struct kvm_arch         arch;
        struct kvm_config       cfg;
@@ -49,6 +56,7 @@ struct kvm {
        u64                     ram_size;
        void                    *ram_start;
        u64                     ram_pagesize;
+       struct list_head        mem_banks;
 
        bool                    nmi_disabled;
 
diff --git a/tools/kvm/kvm.c b/tools/kvm/kvm.c
index b283171..1a10ec0 100644
--- a/tools/kvm/kvm.c
+++ b/tools/kvm/kvm.c
@@ -6,7 +6,9 @@
 #include "kvm/kvm-cpu.h"
 #include "kvm/kvm-ipc.h"
 
+#include <linux/kernel.h>
 #include <linux/kvm.h>
+#include <linux/list.h>
 #include <linux/err.h>
 
 #include <sys/un.h>
@@ -133,9 +135,16 @@ struct kvm *kvm__new(void)
 
 int kvm__exit(struct kvm *kvm)
 {
+       struct kvm_mem_bank *bank, *tmp;
+
        kvm__arch_delete_ram(kvm);
-       free(kvm);
 
+       list_for_each_entry_safe(bank, tmp, &kvm->mem_banks, list) {
+               list_del(&bank->list);
+               free(bank);
+       }
+
+       free(kvm);
        return 0;
 }
 core_exit(kvm__exit);
@@ -148,8 +157,18 @@ core_exit(kvm__exit);
 int kvm__register_mem(struct kvm *kvm, u64 guest_phys, u64 size, void 
*userspace_addr)
 {
        struct kvm_userspace_memory_region mem;
+       struct kvm_mem_bank *bank;
        int ret;
 
+       bank = malloc(sizeof(*bank));
+       if (!bank)
+               return -ENOMEM;
+
+       INIT_LIST_HEAD(&bank->list);
+       bank->guest_phys_addr           = guest_phys;
+       bank->host_addr                 = userspace_addr;
+       bank->size                      = size;
+
        mem = (struct kvm_userspace_memory_region) {
                .slot                   = kvm->mem_slots++,
                .guest_phys_addr        = guest_phys,
@@ -161,6 +180,7 @@ int kvm__register_mem(struct kvm *kvm, u64 guest_phys, u64 
size, void *userspace
        if (ret < 0)
                return -errno;
 
+       list_add(&bank->list, &kvm->mem_banks);
        return 0;
 }
 
@@ -245,6 +265,7 @@ int kvm__init(struct kvm *kvm)
 
        kvm__arch_init(kvm, kvm->cfg.hugetlbfs_path, kvm->cfg.ram_size);
 
+       INIT_LIST_HEAD(&kvm->mem_banks);
        kvm__init_ram(kvm);
 
        if (!kvm->cfg.firmware_filename) {
-- 
1.8.0

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to