mirror of
https://github.com/clearlinux/kvmtool.git
synced 2026-06-16 02:15:47 +00:00
43d2781c27
Currently we unconditionally create a virtual GICv2 in the guest. Add a --irqchip= parameter to let the user specify a different GIC type for the guest, when omitting this parameter it still defaults to --irqchip=gicv2. For now the only other supported type is --irqchip=gicv3 Signed-off-by: Andre Przywara <andre.przywara@arm.com> [will: use pr_err instead of fprintf] Signed-off-by: Will Deacon <will.deacon@arm.com>
88 lines
2.2 KiB
C
88 lines
2.2 KiB
C
#include "kvm/kvm.h"
|
|
#include "kvm/term.h"
|
|
#include "kvm/util.h"
|
|
#include "kvm/8250-serial.h"
|
|
#include "kvm/virtio-console.h"
|
|
|
|
#include "arm-common/gic.h"
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/kvm.h>
|
|
#include <linux/sizes.h>
|
|
|
|
struct kvm_ext kvm_req_ext[] = {
|
|
{ DEFINE_KVM_EXT(KVM_CAP_IRQCHIP) },
|
|
{ DEFINE_KVM_EXT(KVM_CAP_ONE_REG) },
|
|
{ DEFINE_KVM_EXT(KVM_CAP_ARM_PSCI) },
|
|
{ 0, 0 },
|
|
};
|
|
|
|
bool kvm__arch_cpu_supports_vm(void)
|
|
{
|
|
/* The KVM capability check is enough. */
|
|
return true;
|
|
}
|
|
|
|
void kvm__init_ram(struct kvm *kvm)
|
|
{
|
|
int err;
|
|
u64 phys_start, phys_size;
|
|
void *host_mem;
|
|
|
|
phys_start = ARM_MEMORY_AREA;
|
|
phys_size = kvm->ram_size;
|
|
host_mem = kvm->ram_start;
|
|
|
|
err = kvm__register_mem(kvm, phys_start, phys_size, host_mem);
|
|
if (err)
|
|
die("Failed to register %lld bytes of memory at physical "
|
|
"address 0x%llx [err %d]", phys_size, phys_start, err);
|
|
|
|
kvm->arch.memory_guest_start = phys_start;
|
|
}
|
|
|
|
void kvm__arch_delete_ram(struct kvm *kvm)
|
|
{
|
|
munmap(kvm->arch.ram_alloc_start, kvm->arch.ram_alloc_size);
|
|
}
|
|
|
|
void kvm__arch_read_term(struct kvm *kvm)
|
|
{
|
|
if (term_readable(0)) {
|
|
serial8250__update_consoles(kvm);
|
|
virtio_console__inject_interrupt(kvm);
|
|
}
|
|
}
|
|
|
|
void kvm__arch_set_cmdline(char *cmdline, bool video)
|
|
{
|
|
}
|
|
|
|
void kvm__arch_init(struct kvm *kvm, const char *hugetlbfs_path, u64 ram_size)
|
|
{
|
|
/*
|
|
* Allocate guest memory. We must align our buffer to 64K to
|
|
* correlate with the maximum guest page size for virtio-mmio.
|
|
* If using THP, then our minimal alignment becomes 2M.
|
|
* 2M trumps 64K, so let's go with that.
|
|
*/
|
|
kvm->ram_size = min(ram_size, (u64)ARM_MAX_MEMORY(kvm));
|
|
kvm->arch.ram_alloc_size = kvm->ram_size + SZ_2M;
|
|
kvm->arch.ram_alloc_start = mmap_anon_or_hugetlbfs(kvm, hugetlbfs_path,
|
|
kvm->arch.ram_alloc_size);
|
|
|
|
if (kvm->arch.ram_alloc_start == MAP_FAILED)
|
|
die("Failed to map %lld bytes for guest memory (%d)",
|
|
kvm->arch.ram_alloc_size, errno);
|
|
|
|
kvm->ram_start = (void *)ALIGN((unsigned long)kvm->arch.ram_alloc_start,
|
|
SZ_2M);
|
|
|
|
madvise(kvm->arch.ram_alloc_start, kvm->arch.ram_alloc_size,
|
|
MADV_MERGEABLE | MADV_HUGEPAGE);
|
|
|
|
/* Create the virtual GIC. */
|
|
if (gic__create(kvm, kvm->cfg.arch.irqchip))
|
|
die("Failed to create virtual GIC");
|
|
}
|