kvmtool, mips: Support more than 256 MB guest memory

Two guest memory regions need to be defined and two "mem=" parameters
need to be passed to guest kernel to support more than 256 MB.

Signed-off-by: Andreas Herrmann <andreas.herrmann@caviumnetworks.com>
Signed-off-by: Will Deacon <will.deacon@arm.com>
This commit is contained in:
Andreas Herrmann
2015-06-29 09:02:15 +01:00
committed by Will Deacon
parent e9922aaf43
commit 57896feeda
2 changed files with 40 additions and 6 deletions
+10
View File
@@ -1,10 +1,20 @@
#ifndef KVM__KVM_ARCH_H
#define KVM__KVM_ARCH_H
/*
* Guest memory map is:
* 0x00000000-0x0fffffff : System RAM
* 0x10000000-0x1fffffff : I/O (defined by KVM_MMIO_START and KVM_MMIO_SIZE)
* 0x20000000- ... : System RAM
* See also kvm__init_ram().
*/
#define KVM_MMIO_START 0x10000000
#define KVM_PCI_CFG_AREA KVM_MMIO_START
#define KVM_PCI_MMIO_AREA (KVM_MMIO_START + 0x1000000)
#define KVM_VIRTIO_MMIO_AREA (KVM_MMIO_START + 0x2000000)
#define KVM_MMIO_SIZE 0x10000000
/*
* Just for reference. This and the above corresponds to what's used
+30 -6
View File
@@ -22,11 +22,28 @@ void kvm__init_ram(struct kvm *kvm)
u64 phys_start, phys_size;
void *host_mem;
phys_start = 0;
phys_size = kvm->ram_size;
host_mem = kvm->ram_start;
if (kvm->ram_size <= KVM_MMIO_START) {
/* one region for all memory */
phys_start = 0;
phys_size = kvm->ram_size;
host_mem = kvm->ram_start;
kvm__register_mem(kvm, phys_start, phys_size, host_mem);
kvm__register_mem(kvm, phys_start, phys_size, host_mem);
} else {
/* one region for memory that fits below MMIO range */
phys_start = 0;
phys_size = KVM_MMIO_START;
host_mem = kvm->ram_start;
kvm__register_mem(kvm, phys_start, phys_size, host_mem);
/* one region for rest of memory */
phys_start = KVM_MMIO_START + KVM_MMIO_SIZE;
phys_size = kvm->ram_size - KVM_MMIO_START;
host_mem = kvm->ram_start + KVM_MMIO_START;
kvm__register_mem(kvm, phys_start, phys_size, host_mem);
}
}
void kvm__arch_delete_ram(struct kvm *kvm)
@@ -108,8 +125,15 @@ static void kvm__mips_install_cmdline(struct kvm *kvm)
u64 argv_offset = argv_start;
u64 argc = 0;
sprintf(p + cmdline_offset, "mem=0x%llx@0 ",
(unsigned long long)kvm->ram_size);
if ((u64) kvm->ram_size <= KVM_MMIO_START)
sprintf(p + cmdline_offset, "mem=0x%llx@0 ",
(unsigned long long)kvm->ram_size);
else
sprintf(p + cmdline_offset, "mem=0x%llx@0 mem=0x%llx@0x%llx ",
(unsigned long long)KVM_MMIO_START,
(unsigned long long)kvm->ram_size - KVM_MMIO_START,
(unsigned long long)(KVM_MMIO_START + KVM_MMIO_SIZE));
strcat(p + cmdline_offset, kvm->cfg.real_cmdline); /* maximum size is 2K */