Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/ioctl.h>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <linux/kvm.h>
- #include <errno.h>
- #include <string.h>
- int main(int argc, char* argv[])
- {
- int kvm = open("/dev/kvm", O_RDWR);
- int vm = ioctl(kvm, KVM_CREATE_VM, 0);
- perror("CREATE_VM");
- ioctl(vm, KVM_SET_TSS_ADDR, 0xfffbd000);
- perror("KVM_SET_TSS_ADDR");
- int vcpu = ioctl(vm, KVM_CREATE_VCPU, 0);
- perror("CREATE_VCPU");
- void* ram_start;
- unsigned long ram_size = 1024L * 1024 * 16;
- posix_memalign(&ram_start, 65536, ram_size);
- struct kvm_userspace_memory_region mem;
- mem.slot = 0;
- mem.guest_phys_addr = 0x0UL;
- mem.memory_size = ram_size;
- mem.userspace_addr = (unsigned long) ram_start;
- ioctl(vm, KVM_SET_USER_MEMORY_REGION, &mem);
- perror("SET_USER_MEMORY_REGION");
- struct kvm_sregs sregs;
- ioctl(vcpu, KVM_GET_SREGS, &sregs);
- sregs.cs.selector = 0;
- sregs.ss.selector = 0;
- sregs.ds.selector = 0;
- sregs.es.selector = 0;
- sregs.gs.selector = 0;
- sregs.cs.base = 0;
- sregs.ss.base = 0;
- sregs.ds.base = 0;
- sregs.es.base = 0;
- sregs.fs.base = 0;
- sregs.gs.base = 0;
- sregs.cr0 |= 0x1;
- #define GDTLOC (0xF00Baa)
- *(unsigned long*) (ram_start+GDTLOC) = 0x00000000000000000;
- *(unsigned long*) (ram_start+GDTLOC+8) = 0x00cf9a000000ffff;
- *(unsigned long*) (ram_start+GDTLOC+16) = 0x00cf92000000ffff;
- sregs.gdt.base = GDTLOC;
- sregs.gdt.limit = 32;
- sregs.idt.base = 0;
- sregs.idt.limit = 0;
- sregs.cs.selector = 8;
- sregs.ss.selector = 16;
- sregs.ds.selector = 16;
- sregs.es.selector = 16;
- sregs.cs.g = 1;
- sregs.ss.g = 1;
- sregs.ds.g = 1;
- sregs.es.g = 1;
- sregs.cs.db = 1;
- sregs.ss.db = 1;
- sregs.ds.db = 1;
- sregs.es.db = 1;
- sregs.cs.limit =0xffffffff;
- sregs.ss.limit =0xffffffff;
- sregs.ds.limit =0xffffffff;
- sregs.es.limit =0xffffffff;
- ioctl(vcpu, KVM_SET_SREGS, &sregs);
- perror("KVM_SER_SREGS");
- struct kvm_regs regs;
- regs = (struct kvm_regs) {
- .rflags = 0x0000000000000002ULL,
- .rip = 0x0000,
- .rsp = ram_size,
- .rbp = ram_size - 0x500, //0x8000,
- };
- ioctl(vcpu, KVM_SET_REGS, ®s);
- perror("KVM_SET_REGS");
- ioctl(vcpu, KVM_RUN, 0);
- perror("KVM_RUN");
- }
Add Comment
Please, Sign In to add comment