#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 */