Skip to content

Instantly share code, notes, and snippets.

@corruptmem
Created February 8, 2011 23:11
Show Gist options
  • Save corruptmem/817503 to your computer and use it in GitHub Desktop.
Save corruptmem/817503 to your computer and use it in GitHub Desktop.
#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, &regs);
perror("KVM_SET_REGS");
ioctl(vcpu, KVM_RUN, 0);
perror("KVM_RUN");
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment