diff --git a/kvm.c b/kvm.c index e670799..62f8d04 100644 --- a/kvm.c +++ b/kvm.c @@ -141,6 +141,35 @@ static void kvm__run(struct kvm *self) 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; @@ -235,5 +264,7 @@ int main(int argc, char *argv[]) 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; }