1b8f6afcdSPekka Enberg #include "kvm/cpu.h" 2b8f6afcdSPekka Enberg 36c7d8514SPekka Enberg #include <linux/kvm.h> 4*2da26a59SPekka Enberg #include <stdbool.h> 5b8f6afcdSPekka Enberg #include <stdlib.h> 6b8f6afcdSPekka Enberg #include <fcntl.h> 7b8f6afcdSPekka Enberg 89b1fb1c3SPekka Enberg struct kvm { 99b1fb1c3SPekka Enberg int fd; /* /dev/kvm */ 109b1fb1c3SPekka Enberg int vmfd; 119b1fb1c3SPekka Enberg }; 129b1fb1c3SPekka Enberg 13*2da26a59SPekka Enberg static inline bool kvm__supports_extension(struct kvm *self, unsigned int extension) 14*2da26a59SPekka Enberg { 15*2da26a59SPekka Enberg int ret; 16*2da26a59SPekka Enberg 17*2da26a59SPekka Enberg ret = ioctl(self->fd, KVM_CHECK_EXTENSION, extension); 18*2da26a59SPekka Enberg if (ret < 0) 19*2da26a59SPekka Enberg return false; 20*2da26a59SPekka Enberg 21*2da26a59SPekka Enberg return ret; 22*2da26a59SPekka Enberg } 23*2da26a59SPekka Enberg 24b8f6afcdSPekka Enberg static void die(const char *s) 25b8f6afcdSPekka Enberg { 26b8f6afcdSPekka Enberg perror(s); 27b8f6afcdSPekka Enberg exit(1); 28b8f6afcdSPekka Enberg } 29b8f6afcdSPekka Enberg 30b8f6afcdSPekka Enberg static void cpu__reset(struct cpu *self) 31b8f6afcdSPekka Enberg { 32b8f6afcdSPekka Enberg self->regs.eip = 0x000fff0UL; 33b8f6afcdSPekka Enberg self->regs.eflags = 0x0000002UL; 34b8f6afcdSPekka Enberg } 35b8f6afcdSPekka Enberg 36b8f6afcdSPekka Enberg static struct cpu *cpu__new(void) 37b8f6afcdSPekka Enberg { 38b8f6afcdSPekka Enberg return calloc(1, sizeof(struct cpu)); 39b8f6afcdSPekka Enberg } 40b8f6afcdSPekka Enberg 41b8f6afcdSPekka Enberg int main(int argc, char *argv[]) 42b8f6afcdSPekka Enberg { 43b8f6afcdSPekka Enberg struct cpu *cpu; 449b1fb1c3SPekka Enberg struct kvm kvm; 4528fa19c0SPekka Enberg int ret; 46b8f6afcdSPekka Enberg 479b1fb1c3SPekka Enberg kvm.fd = open("/dev/kvm", O_RDWR); 489b1fb1c3SPekka Enberg if (kvm.fd < 0) 49b8f6afcdSPekka Enberg die("open"); 50b8f6afcdSPekka Enberg 519b1fb1c3SPekka Enberg ret = ioctl(kvm.fd, KVM_GET_API_VERSION, 0); 526c7d8514SPekka Enberg if (ret != KVM_API_VERSION) 536c7d8514SPekka Enberg die("ioctl"); 546c7d8514SPekka Enberg 559b1fb1c3SPekka Enberg kvm.vmfd = ioctl(kvm.fd, KVM_CREATE_VM, 0); 569b1fb1c3SPekka Enberg if (kvm.vmfd < 0) 5728fa19c0SPekka Enberg die("open"); 5828fa19c0SPekka Enberg 59*2da26a59SPekka Enberg if (!kvm__supports_extension(&kvm, KVM_CAP_USER_MEMORY)) 60*2da26a59SPekka Enberg die("KVM_CAP_USER_MEMORY"); 61*2da26a59SPekka Enberg 62b8f6afcdSPekka Enberg cpu = cpu__new(); 63b8f6afcdSPekka Enberg 64b8f6afcdSPekka Enberg cpu__reset(cpu); 65b8f6afcdSPekka Enberg 66b8f6afcdSPekka Enberg return 0; 67b8f6afcdSPekka Enberg } 68