die_perror("KVM_RUN ioctl");
}
+static void kvm__show_registers(struct kvm *self)
+{
+ unsigned long rax, rbx, rcx;
+ unsigned long rdx, rsi, rdi;
+ unsigned long rbp, r8, r9;
+ unsigned long r10, r11, r12;
+ unsigned long r13, r14, r15;
+ unsigned long rip, rsp;
+ struct kvm_regs regs;
+
+ if (ioctl(self->vcpu_fd, KVM_GET_REGS, ®s) < 0)
+ die("KVM_GET_REGS failed");
+
+ rip = regs.rip; rsp = regs.rsp;
+ rax = regs.rax; rbx = regs.rbx; rcx = regs.rcx;
+ rdx = regs.rdx; rsi = regs.rsi; rdi = regs.rdi;
+ rbp = regs.rbp; r8 = regs.r8; r9 = regs.r9;
+ r10 = regs.r10; r11 = regs.r11; r12 = regs.r12;
+ r13 = regs.r13; r14 = regs.r14; r15 = regs.r15;
+
+ printf("Registers:\n");
+ printf(" rip: %016lx rsp: %016lx\n", rip, rsp);
+ printf(" rax: %016lx ebx: %016lx ecx: %016lx\n", rax, rbx, rcx);
+ printf(" rdx: %016lx rsi: %016lx rdi: %016lx\n", rdx, rsi, rdi);
+ printf(" rbp: %016lx r8: %016lx r9: %016lx\n", rbp, r8, r9);
+ printf(" r10: %016lx r11: %016lx r12: %016lx\n", r10, r11, r12);
+ printf(" r13: %016lx r14: %016lx r15: %016lx\n", r13, r14, r15);
+}
+
static inline void *guest_addr_to_host(struct kvm *self, unsigned long offset)
{
return self->ram_start + offset;
fprintf(stderr, "KVM exit reason: %" PRIu32 " (\"%s\")\n",
kvm->kvm_run->exit_reason, exit_reasons[kvm->kvm_run->exit_reason]);
+ kvm__show_registers(kvm);
+
return 0;
}