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