Guest User

Untitled

a guest
Jul 22nd, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.17 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/ioctl.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #include <fcntl.h>
  7. #include <linux/kvm.h>
  8. #include <errno.h>
  9. #include <string.h>
  10.  
  11. int main(int argc, char* argv[])
  12. {
  13. int kvm = open("/dev/kvm", O_RDWR);
  14. int vm = ioctl(kvm, KVM_CREATE_VM, 0);
  15. perror("CREATE_VM");
  16.  
  17. ioctl(vm, KVM_SET_TSS_ADDR, 0xfffbd000);
  18. perror("KVM_SET_TSS_ADDR");
  19.  
  20. int vcpu = ioctl(vm, KVM_CREATE_VCPU, 0);
  21. perror("CREATE_VCPU");
  22.  
  23. void* ram_start;
  24. unsigned long ram_size = 1024L * 1024 * 16;
  25. posix_memalign(&ram_start, 65536, ram_size);
  26.  
  27. struct kvm_userspace_memory_region mem;
  28. mem.slot = 0;
  29. mem.guest_phys_addr = 0x0UL;
  30. mem.memory_size = ram_size;
  31. mem.userspace_addr = (unsigned long) ram_start;
  32.  
  33. ioctl(vm, KVM_SET_USER_MEMORY_REGION, &mem);
  34. perror("SET_USER_MEMORY_REGION");
  35.  
  36. struct kvm_sregs sregs;
  37. ioctl(vcpu, KVM_GET_SREGS, &sregs);
  38.  
  39. sregs.cs.selector = 0;
  40. sregs.ss.selector = 0;
  41. sregs.ds.selector = 0;
  42. sregs.es.selector = 0;
  43. sregs.gs.selector = 0;
  44. sregs.cs.base = 0;
  45. sregs.ss.base = 0;
  46. sregs.ds.base = 0;
  47. sregs.es.base = 0;
  48. sregs.fs.base = 0;
  49. sregs.gs.base = 0;
  50. sregs.cr0 |= 0x1;
  51.  
  52. #define GDTLOC (0xF00Baa)
  53.  
  54. *(unsigned long*) (ram_start+GDTLOC) = 0x00000000000000000;
  55. *(unsigned long*) (ram_start+GDTLOC+8) = 0x00cf9a000000ffff;
  56. *(unsigned long*) (ram_start+GDTLOC+16) = 0x00cf92000000ffff;
  57.  
  58. sregs.gdt.base = GDTLOC;
  59. sregs.gdt.limit = 32;
  60. sregs.idt.base = 0;
  61. sregs.idt.limit = 0;
  62.  
  63. sregs.cs.selector = 8;
  64. sregs.ss.selector = 16;
  65. sregs.ds.selector = 16;
  66. sregs.es.selector = 16;
  67.  
  68. sregs.cs.g = 1;
  69. sregs.ss.g = 1;
  70. sregs.ds.g = 1;
  71. sregs.es.g = 1;
  72.  
  73. sregs.cs.db = 1;
  74. sregs.ss.db = 1;
  75. sregs.ds.db = 1;
  76. sregs.es.db = 1;
  77.  
  78. sregs.cs.limit =0xffffffff;
  79. sregs.ss.limit =0xffffffff;
  80. sregs.ds.limit =0xffffffff;
  81. sregs.es.limit =0xffffffff;
  82.  
  83. ioctl(vcpu, KVM_SET_SREGS, &sregs);
  84. perror("KVM_SER_SREGS");
  85.  
  86. struct kvm_regs regs;
  87. regs = (struct kvm_regs) {
  88. .rflags = 0x0000000000000002ULL,
  89. .rip = 0x0000,
  90. .rsp = ram_size,
  91. .rbp = ram_size - 0x500, //0x8000,
  92. };
  93.  
  94. ioctl(vcpu, KVM_SET_REGS, &regs);
  95. perror("KVM_SET_REGS");
  96.  
  97. ioctl(vcpu, KVM_RUN, 0);
  98. perror("KVM_RUN");
  99. }
Add Comment
Please, Sign In to add comment