xref: /kvmtool/arm/kvm.c (revision 1e0c135a3b4592d73020c8e46a21d39c8a076f43)
17c0e8b0cSWill Deacon #include "kvm/kvm.h"
27c0e8b0cSWill Deacon #include "kvm/term.h"
37c0e8b0cSWill Deacon #include "kvm/util.h"
47c0e8b0cSWill Deacon #include "kvm/virtio-console.h"
57c0e8b0cSWill Deacon 
67c0e8b0cSWill Deacon #include "arm-common/gic.h"
77c0e8b0cSWill Deacon 
87c0e8b0cSWill Deacon #include <linux/kernel.h>
97c0e8b0cSWill Deacon #include <linux/kvm.h>
107c0e8b0cSWill Deacon 
117c0e8b0cSWill Deacon struct kvm_ext kvm_req_ext[] = {
127c0e8b0cSWill Deacon 	{ DEFINE_KVM_EXT(KVM_CAP_IRQCHIP) },
137c0e8b0cSWill Deacon 	{ DEFINE_KVM_EXT(KVM_CAP_ONE_REG) },
1461076240SWill Deacon 	{ DEFINE_KVM_EXT(KVM_CAP_ARM_PSCI) },
157c0e8b0cSWill Deacon 	{ 0, 0 },
167c0e8b0cSWill Deacon };
177c0e8b0cSWill Deacon 
187c0e8b0cSWill Deacon bool kvm__arch_cpu_supports_vm(void)
197c0e8b0cSWill Deacon {
207c0e8b0cSWill Deacon 	/* The KVM capability check is enough. */
217c0e8b0cSWill Deacon 	return true;
227c0e8b0cSWill Deacon }
237c0e8b0cSWill Deacon 
247c0e8b0cSWill Deacon void kvm__init_ram(struct kvm *kvm)
257c0e8b0cSWill Deacon {
267c0e8b0cSWill Deacon 	int err;
277c0e8b0cSWill Deacon 	u64 phys_start, phys_size;
287c0e8b0cSWill Deacon 	void *host_mem;
297c0e8b0cSWill Deacon 
307c0e8b0cSWill Deacon 	phys_start	= ARM_MEMORY_AREA;
317c0e8b0cSWill Deacon 	phys_size	= kvm->ram_size;
327c0e8b0cSWill Deacon 	host_mem	= kvm->ram_start;
337c0e8b0cSWill Deacon 
347c0e8b0cSWill Deacon 	err = kvm__register_mem(kvm, phys_start, phys_size, host_mem);
357c0e8b0cSWill Deacon 	if (err)
367c0e8b0cSWill Deacon 		die("Failed to register %lld bytes of memory at physical "
377c0e8b0cSWill Deacon 		    "address 0x%llx [err %d]", phys_size, phys_start, err);
387c0e8b0cSWill Deacon 
397c0e8b0cSWill Deacon 	kvm->arch.memory_guest_start = phys_start;
407c0e8b0cSWill Deacon }
417c0e8b0cSWill Deacon 
427c0e8b0cSWill Deacon void kvm__arch_delete_ram(struct kvm *kvm)
437c0e8b0cSWill Deacon {
447c0e8b0cSWill Deacon 	munmap(kvm->ram_start, kvm->ram_size);
457c0e8b0cSWill Deacon }
467c0e8b0cSWill Deacon 
477c0e8b0cSWill Deacon void kvm__arch_periodic_poll(struct kvm *kvm)
487c0e8b0cSWill Deacon {
497c0e8b0cSWill Deacon 	if (term_readable(0))
507c0e8b0cSWill Deacon 		virtio_console__inject_interrupt(kvm);
517c0e8b0cSWill Deacon }
527c0e8b0cSWill Deacon 
537c0e8b0cSWill Deacon void kvm__arch_set_cmdline(char *cmdline, bool video)
547c0e8b0cSWill Deacon {
557c0e8b0cSWill Deacon }
567c0e8b0cSWill Deacon 
577c0e8b0cSWill Deacon void kvm__arch_init(struct kvm *kvm, const char *hugetlbfs_path, u64 ram_size)
587c0e8b0cSWill Deacon {
597c0e8b0cSWill Deacon 	/* Allocate guest memory. */
60*1e0c135aSWill Deacon 	kvm->ram_size = min(ram_size, (u64)ARM_MAX_MEMORY(kvm));
617c0e8b0cSWill Deacon 	kvm->ram_start = mmap_anon_or_hugetlbfs(kvm, hugetlbfs_path, kvm->ram_size);
627c0e8b0cSWill Deacon 	if (kvm->ram_start == MAP_FAILED)
637c0e8b0cSWill Deacon 		die("Failed to map %lld bytes for guest memory (%d)",
647c0e8b0cSWill Deacon 		    kvm->ram_size, errno);
657c0e8b0cSWill Deacon 	madvise(kvm->ram_start, kvm->ram_size, MADV_MERGEABLE);
667c0e8b0cSWill Deacon 
677c0e8b0cSWill Deacon 	/* Initialise the virtual GIC. */
687c0e8b0cSWill Deacon 	if (gic__init_irqchip(kvm))
697c0e8b0cSWill Deacon 		die("Failed to initialise virtual GIC");
707c0e8b0cSWill Deacon }
71