xref: /kvmtool/arm/kvm.c (revision 7c0e8b0c5560ce2f500fa4d7ba7865e7360e7991)
1*7c0e8b0cSWill Deacon #include "kvm/kvm.h"
2*7c0e8b0cSWill Deacon #include "kvm/term.h"
3*7c0e8b0cSWill Deacon #include "kvm/util.h"
4*7c0e8b0cSWill Deacon #include "kvm/virtio-console.h"
5*7c0e8b0cSWill Deacon 
6*7c0e8b0cSWill Deacon #include "arm-common/gic.h"
7*7c0e8b0cSWill Deacon 
8*7c0e8b0cSWill Deacon #include <linux/kernel.h>
9*7c0e8b0cSWill Deacon #include <linux/kvm.h>
10*7c0e8b0cSWill Deacon 
11*7c0e8b0cSWill Deacon struct kvm_ext kvm_req_ext[] = {
12*7c0e8b0cSWill Deacon 	{ DEFINE_KVM_EXT(KVM_CAP_IRQCHIP) },
13*7c0e8b0cSWill Deacon 	{ DEFINE_KVM_EXT(KVM_CAP_ONE_REG) },
14*7c0e8b0cSWill Deacon 	{ 0, 0 },
15*7c0e8b0cSWill Deacon };
16*7c0e8b0cSWill Deacon 
17*7c0e8b0cSWill Deacon bool kvm__arch_cpu_supports_vm(void)
18*7c0e8b0cSWill Deacon {
19*7c0e8b0cSWill Deacon 	/* The KVM capability check is enough. */
20*7c0e8b0cSWill Deacon 	return true;
21*7c0e8b0cSWill Deacon }
22*7c0e8b0cSWill Deacon 
23*7c0e8b0cSWill Deacon void kvm__init_ram(struct kvm *kvm)
24*7c0e8b0cSWill Deacon {
25*7c0e8b0cSWill Deacon 	int err;
26*7c0e8b0cSWill Deacon 	u64 phys_start, phys_size;
27*7c0e8b0cSWill Deacon 	void *host_mem;
28*7c0e8b0cSWill Deacon 
29*7c0e8b0cSWill Deacon 	phys_start	= ARM_MEMORY_AREA;
30*7c0e8b0cSWill Deacon 	phys_size	= kvm->ram_size;
31*7c0e8b0cSWill Deacon 	host_mem	= kvm->ram_start;
32*7c0e8b0cSWill Deacon 
33*7c0e8b0cSWill Deacon 	err = kvm__register_mem(kvm, phys_start, phys_size, host_mem);
34*7c0e8b0cSWill Deacon 	if (err)
35*7c0e8b0cSWill Deacon 		die("Failed to register %lld bytes of memory at physical "
36*7c0e8b0cSWill Deacon 		    "address 0x%llx [err %d]", phys_size, phys_start, err);
37*7c0e8b0cSWill Deacon 
38*7c0e8b0cSWill Deacon 	kvm->arch.memory_guest_start = phys_start;
39*7c0e8b0cSWill Deacon }
40*7c0e8b0cSWill Deacon 
41*7c0e8b0cSWill Deacon void kvm__arch_delete_ram(struct kvm *kvm)
42*7c0e8b0cSWill Deacon {
43*7c0e8b0cSWill Deacon 	munmap(kvm->ram_start, kvm->ram_size);
44*7c0e8b0cSWill Deacon }
45*7c0e8b0cSWill Deacon 
46*7c0e8b0cSWill Deacon void kvm__arch_periodic_poll(struct kvm *kvm)
47*7c0e8b0cSWill Deacon {
48*7c0e8b0cSWill Deacon 	if (term_readable(0))
49*7c0e8b0cSWill Deacon 		virtio_console__inject_interrupt(kvm);
50*7c0e8b0cSWill Deacon }
51*7c0e8b0cSWill Deacon 
52*7c0e8b0cSWill Deacon void kvm__arch_set_cmdline(char *cmdline, bool video)
53*7c0e8b0cSWill Deacon {
54*7c0e8b0cSWill Deacon }
55*7c0e8b0cSWill Deacon 
56*7c0e8b0cSWill Deacon void kvm__arch_init(struct kvm *kvm, const char *hugetlbfs_path, u64 ram_size)
57*7c0e8b0cSWill Deacon {
58*7c0e8b0cSWill Deacon 	/* Allocate guest memory. */
59*7c0e8b0cSWill Deacon 	kvm->ram_size = min(ram_size, (u64)ARM_MAX_MEMORY);
60*7c0e8b0cSWill Deacon 	kvm->ram_start = mmap_anon_or_hugetlbfs(kvm, hugetlbfs_path, kvm->ram_size);
61*7c0e8b0cSWill Deacon 	if (kvm->ram_start == MAP_FAILED)
62*7c0e8b0cSWill Deacon 		die("Failed to map %lld bytes for guest memory (%d)",
63*7c0e8b0cSWill Deacon 		    kvm->ram_size, errno);
64*7c0e8b0cSWill Deacon 	madvise(kvm->ram_start, kvm->ram_size, MADV_MERGEABLE);
65*7c0e8b0cSWill Deacon 
66*7c0e8b0cSWill Deacon 	/* Initialise the virtual GIC. */
67*7c0e8b0cSWill Deacon 	if (gic__init_irqchip(kvm))
68*7c0e8b0cSWill Deacon 		die("Failed to initialise virtual GIC");
69*7c0e8b0cSWill Deacon }
70