Listing 3. Our First Virtual Machine Launcher (launcher.c) #include #include #include #include #include #include #include /* callback definitions as shown in Listing 2 go here */ void load_file(void *mem, const char *filename) { int fd; int nr; fd = open(filename, O_RDONLY); if (fd == -1) { fprintf(stderr, "Cannot open %s", filename); perror("open"); exit(1); } while ((nr = read(fd, mem, 4096)) != -1 && nr != 0) mem += nr; if (nr == -1) { perror("read"); exit(1); } close(fd); } #define MEMORY_SIZE (0x1000000) /* 16 Mb */ #define FIRST_VCPU (0) int main(int argc, char *argv[]) { kvm_context_t kvm; void *memory_area; /* Second argument is an opaque, we don't use it yet */ kvm = kvm_init(&my_callbacks, NULL); if (!kvm) { fprintf(stderr, "KVM init failed"); exit(1); } if (kvm_create(kvm, MEMORY_SIZE, &memory_area) != 0) { fprintf(stderr, "VM creation failed"); exit(1); } #ifndef KVM_VERSION_LESS_THAN_65 if (kvm_create_vcpu(kvm, FIRST_VCPU)) { fprintf(stderr, "VCPU creation failed"); exit(1); } #endif memory_area = kvm_create_phys_mem(kvm, 0, MEMORY_SIZE, 0, 1); load_file(memory_area + 0xf0000, argv[1]); kvm_run(kvm, FIRST_VCPU); return 0; }