@@ -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;
@@ -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) {
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@arm.com> --- tools/kvm/include/kvm/kvm.h | 8 ++++++++ tools/kvm/kvm.c | 23 ++++++++++++++++++++++- 2 files changed, 30 insertions(+), 1 deletion(-)