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 <will.deacon@xxxxxxx> --- 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html