1b8f6afcdSPekka Enberg #include "kvm/cpu.h" 2b8f6afcdSPekka Enberg 36c7d8514SPekka Enberg #include <linux/kvm.h> 4b8f6afcdSPekka Enberg #include <stdlib.h> 5b8f6afcdSPekka Enberg #include <fcntl.h> 6b8f6afcdSPekka Enberg 7*9b1fb1c3SPekka Enberg struct kvm { 8*9b1fb1c3SPekka Enberg int fd; /* /dev/kvm */ 9*9b1fb1c3SPekka Enberg int vmfd; 10*9b1fb1c3SPekka Enberg }; 11*9b1fb1c3SPekka Enberg 12b8f6afcdSPekka Enberg static void die(const char *s) 13b8f6afcdSPekka Enberg { 14b8f6afcdSPekka Enberg perror(s); 15b8f6afcdSPekka Enberg exit(1); 16b8f6afcdSPekka Enberg } 17b8f6afcdSPekka Enberg 18b8f6afcdSPekka Enberg static void cpu__reset(struct cpu *self) 19b8f6afcdSPekka Enberg { 20b8f6afcdSPekka Enberg self->regs.eip = 0x000fff0UL; 21b8f6afcdSPekka Enberg self->regs.eflags = 0x0000002UL; 22b8f6afcdSPekka Enberg } 23b8f6afcdSPekka Enberg 24b8f6afcdSPekka Enberg static struct cpu *cpu__new(void) 25b8f6afcdSPekka Enberg { 26b8f6afcdSPekka Enberg return calloc(1, sizeof(struct cpu)); 27b8f6afcdSPekka Enberg } 28b8f6afcdSPekka Enberg 29b8f6afcdSPekka Enberg int main(int argc, char *argv[]) 30b8f6afcdSPekka Enberg { 31b8f6afcdSPekka Enberg struct cpu *cpu; 32*9b1fb1c3SPekka Enberg struct kvm kvm; 3328fa19c0SPekka Enberg int ret; 34b8f6afcdSPekka Enberg 35*9b1fb1c3SPekka Enberg kvm.fd = open("/dev/kvm", O_RDWR); 36*9b1fb1c3SPekka Enberg if (kvm.fd < 0) 37b8f6afcdSPekka Enberg die("open"); 38b8f6afcdSPekka Enberg 39*9b1fb1c3SPekka Enberg ret = ioctl(kvm.fd, KVM_GET_API_VERSION, 0); 406c7d8514SPekka Enberg if (ret != KVM_API_VERSION) 416c7d8514SPekka Enberg die("ioctl"); 426c7d8514SPekka Enberg 43*9b1fb1c3SPekka Enberg kvm.vmfd = ioctl(kvm.fd, KVM_CREATE_VM, 0); 44*9b1fb1c3SPekka Enberg if (kvm.vmfd < 0) 4528fa19c0SPekka Enberg die("open"); 4628fa19c0SPekka Enberg 47b8f6afcdSPekka Enberg cpu = cpu__new(); 48b8f6afcdSPekka Enberg 49b8f6afcdSPekka Enberg cpu__reset(cpu); 50b8f6afcdSPekka Enberg 51b8f6afcdSPekka Enberg return 0; 52b8f6afcdSPekka Enberg } 53