#include #include #include #include #include #include #include void print_regs(const struct kvm_regs *regs) { printf("rax: %llu\n", regs->rax); printf("rbx: %llu\n", regs->rbx); printf("rcx: %llu\n", regs->rcx); printf("rdx: %llu\n", regs->rdx); printf("rdi: %llu\n", regs->rdi); printf("rsi: %llu\n", regs->rsi); printf("rsp: %llu\n", regs->rsp); printf("rbp: %llu\n", regs->rbp); printf("r8: %llu\n", regs->r8); printf("r9: %llu\n", regs->r9); printf("r10: %llu\n", regs->r10); printf("r11: %llu\n", regs->r11); printf("r12: %llu\n", regs->r12); printf("r13: %llu\n", regs->r13); printf("r14: %llu\n", regs->r14); printf("r15: %llu\n", regs->r15); printf("rip: %llu\n", regs->rip); printf("rflags: %llu\n", regs->rflags); printf("\n"); } void print_device_attr(const struct kvm_device_attr *dev_attr) { printf("flags: %u\n", dev_attr->flags); printf("group: %u\n", dev_attr->group); printf("attr: %llu\n", dev_attr->attr); printf("addr: %llu\n", dev_attr->addr); printf("\n"); } int main(void) { int fd = open("/dev/kvm", O_RDWR); if (fd < 0) { perror("/dev/kvm"); return -1; } int ret = ioctl(fd, KVM_GET_API_VERSION, 0); if (ret < 0) { perror("KVM_GET_API_VERSION"); return -1; } printf("api version: %d\n\n", ret); int vmfd = ioctl(fd, KVM_CREATE_VM, 0); if (vmfd < 0) { perror("KVM_CREATE_VM"); return -1; } printf("created vm\n\n"); int vcpufd = ioctl(vmfd, KVM_CREATE_VCPU, 0); if (vcpufd < 0) { perror("KVM_CREATE_VCPU"); return -1; } printf("created vcpu\n\n"); struct kvm_regs regs; if (ioctl(vcpufd, KVM_GET_REGS, ®s) < 0) { perror("KVM_GET_REGS"); return -1; } print_regs(®s); struct kvm_create_device dev = {0}; dev.type = KVM_DEV_TYPE_VFIO; if (ioctl(vmfd, KVM_CREATE_DEVICE, &dev) < 0) { perror("KVM_CREATE_DEVICE"); return -1; } printf("created device\n\n"); struct kvm_device_attr dev_attr = {0}; dev_attr.group = KVM_DEV_VFIO_GROUP; dev_attr.attr = KVM_DEV_VFIO_GROUP_ADD; if (ioctl(dev.fd, KVM_HAS_DEVICE_ATTR, &dev_attr) < 0) { perror("KVM_HAS_DEVICE_ATTR"); return -1; } printf("checked device attr\n\n"); return 0; }