| #ifdef HAVE_STRUCT_KVM_REGS |
| static void |
| arch_print_kvm_regs(struct tcb *const tcp, |
| const kernel_ulong_t addr, |
| const struct kvm_regs *const regs) |
| { |
| PRINT_FIELD_X("{", *regs, rax); |
| if (abbrev(tcp)) |
| tprints(", ..."); |
| else { |
| PRINT_FIELD_X(", ", *regs, rbx); |
| PRINT_FIELD_X(", ", *regs, rcx); |
| PRINT_FIELD_X(", ", *regs, rdx); |
| PRINT_FIELD_X(", ", *regs, rsi); |
| PRINT_FIELD_X(", ", *regs, rdi); |
| } |
| PRINT_FIELD_X(", ", *regs, rsp); |
| PRINT_FIELD_X(", ", *regs, rbp); |
| if (abbrev(tcp)) |
| tprints(", ..."); |
| else { |
| PRINT_FIELD_X(", ", *regs, r8); |
| PRINT_FIELD_X(", ", *regs, r9); |
| PRINT_FIELD_X(", ", *regs, r10); |
| PRINT_FIELD_X(", ", *regs, r11); |
| PRINT_FIELD_X(", ", *regs, r12); |
| PRINT_FIELD_X(", ", *regs, r13); |
| PRINT_FIELD_X(", ", *regs, r14); |
| PRINT_FIELD_X(", ", *regs, r15); |
| } |
| PRINT_FIELD_X(", ", *regs, rip); |
| |
| /* TODO: we can decode this more */ |
| PRINT_FIELD_X(", ", *regs, rflags); |
| |
| tprints("}"); |
| } |
| #endif /* HAVE_STRUCT_KVM_REGS */ |
| |
| #ifdef HAVE_STRUCT_KVM_SREGS |
| static void |
| kvm_ioctl_decode_regs_segment(const char *prefix, |
| const struct kvm_segment *const segment) |
| { |
| tprints(prefix); |
| PRINT_FIELD_X("={", *segment, base); |
| PRINT_FIELD_U(", ", *segment, limit); |
| PRINT_FIELD_U(", ", *segment, selector); |
| PRINT_FIELD_U(", ", *segment, type); |
| PRINT_FIELD_U(", ", *segment, present); |
| PRINT_FIELD_U(", ", *segment, dpl); |
| PRINT_FIELD_U(", ", *segment, db); |
| PRINT_FIELD_U(", ", *segment, s); |
| PRINT_FIELD_U(", ", *segment, l); |
| PRINT_FIELD_U(", ", *segment, g); |
| PRINT_FIELD_U(", ", *segment, avl); |
| tprints("}"); |
| } |
| |
| static void |
| kvm_ioctl_decode_regs_dtable(const char *prefix, |
| const struct kvm_dtable *const dtable) |
| { |
| tprints(prefix); |
| PRINT_FIELD_X("={", *dtable, base); |
| PRINT_FIELD_U(", ", *dtable, limit); |
| tprints("}"); |
| } |
| |
| # define PRINT_FIELD_KVM_SREGS_STRUCT(prefix_, where_, type_, field_) \ |
| kvm_ioctl_decode_regs_ ## type_(prefix_ #field_, &(where_)->field_) |
| |
| static void |
| arch_print_kvm_sregs(struct tcb *const tcp, |
| const kernel_ulong_t addr, |
| const struct kvm_sregs *const sregs) |
| { |
| PRINT_FIELD_KVM_SREGS_STRUCT("{", sregs, segment, cs); |
| if (abbrev(tcp)) { |
| tprints(", ...}"); |
| return; |
| } |
| |
| PRINT_FIELD_KVM_SREGS_STRUCT(", ", sregs, segment, ds); |
| PRINT_FIELD_KVM_SREGS_STRUCT(", ", sregs, segment, es); |
| PRINT_FIELD_KVM_SREGS_STRUCT(", ", sregs, segment, fs); |
| PRINT_FIELD_KVM_SREGS_STRUCT(", ", sregs, segment, gs); |
| PRINT_FIELD_KVM_SREGS_STRUCT(", ", sregs, segment, ss); |
| PRINT_FIELD_KVM_SREGS_STRUCT(", ", sregs, segment, tr); |
| PRINT_FIELD_KVM_SREGS_STRUCT(", ", sregs, segment, ldt); |
| PRINT_FIELD_KVM_SREGS_STRUCT(", ", sregs, dtable, gdt); |
| PRINT_FIELD_KVM_SREGS_STRUCT(", ", sregs, dtable, idt); |
| PRINT_FIELD_U(", ", *sregs, cr0); |
| PRINT_FIELD_U(", ", *sregs, cr2); |
| PRINT_FIELD_U(", ", *sregs, cr3); |
| PRINT_FIELD_U(", ", *sregs, cr4); |
| PRINT_FIELD_U(", ", *sregs, cr8); |
| PRINT_FIELD_U(", ", *sregs, efer); |
| PRINT_FIELD_X(", ", *sregs, apic_base); |
| tprints(", interrupt_bitmap=["); |
| |
| unsigned int i; |
| for (i = 0; i < ARRAY_SIZE(sregs->interrupt_bitmap); i++) { |
| if (i != 0) |
| tprints(", "); |
| tprintf("%#" PRI__x64, sregs->interrupt_bitmap[i]); |
| } |
| tprints("]}"); |
| } |
| #endif /* HAVE_STRUCT_KVM_SREGS */ |