1*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_STRUCT_KVM_REGS
2*cf84ac9aSAndroid Build Coastguard Worker static void
arch_print_kvm_regs(struct tcb * const tcp,const kernel_ulong_t addr,const struct kvm_regs * const regs)3*cf84ac9aSAndroid Build Coastguard Worker arch_print_kvm_regs(struct tcb *const tcp,
4*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
5*cf84ac9aSAndroid Build Coastguard Worker const struct kvm_regs *const regs)
6*cf84ac9aSAndroid Build Coastguard Worker {
7*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X("{", *regs, rax);
8*cf84ac9aSAndroid Build Coastguard Worker if (abbrev(tcp))
9*cf84ac9aSAndroid Build Coastguard Worker tprints(", ...");
10*cf84ac9aSAndroid Build Coastguard Worker else {
11*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", *regs, rbx);
12*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", *regs, rcx);
13*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", *regs, rdx);
14*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", *regs, rsi);
15*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", *regs, rdi);
16*cf84ac9aSAndroid Build Coastguard Worker }
17*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", *regs, rsp);
18*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", *regs, rbp);
19*cf84ac9aSAndroid Build Coastguard Worker if (abbrev(tcp))
20*cf84ac9aSAndroid Build Coastguard Worker tprints(", ...");
21*cf84ac9aSAndroid Build Coastguard Worker else {
22*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", *regs, r8);
23*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", *regs, r9);
24*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", *regs, r10);
25*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", *regs, r11);
26*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", *regs, r12);
27*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", *regs, r13);
28*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", *regs, r14);
29*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", *regs, r15);
30*cf84ac9aSAndroid Build Coastguard Worker }
31*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", *regs, rip);
32*cf84ac9aSAndroid Build Coastguard Worker
33*cf84ac9aSAndroid Build Coastguard Worker /* TODO: we can decode this more */
34*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", *regs, rflags);
35*cf84ac9aSAndroid Build Coastguard Worker
36*cf84ac9aSAndroid Build Coastguard Worker tprints("}");
37*cf84ac9aSAndroid Build Coastguard Worker }
38*cf84ac9aSAndroid Build Coastguard Worker #endif /* HAVE_STRUCT_KVM_REGS */
39*cf84ac9aSAndroid Build Coastguard Worker
40*cf84ac9aSAndroid Build Coastguard Worker #ifdef HAVE_STRUCT_KVM_SREGS
41*cf84ac9aSAndroid Build Coastguard Worker static void
kvm_ioctl_decode_regs_segment(const char * prefix,const struct kvm_segment * const segment)42*cf84ac9aSAndroid Build Coastguard Worker kvm_ioctl_decode_regs_segment(const char *prefix,
43*cf84ac9aSAndroid Build Coastguard Worker const struct kvm_segment *const segment)
44*cf84ac9aSAndroid Build Coastguard Worker {
45*cf84ac9aSAndroid Build Coastguard Worker tprints(prefix);
46*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X("={", *segment, base);
47*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", *segment, limit);
48*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", *segment, selector);
49*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", *segment, type);
50*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", *segment, present);
51*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", *segment, dpl);
52*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", *segment, db);
53*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", *segment, s);
54*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", *segment, l);
55*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", *segment, g);
56*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", *segment, avl);
57*cf84ac9aSAndroid Build Coastguard Worker tprints("}");
58*cf84ac9aSAndroid Build Coastguard Worker }
59*cf84ac9aSAndroid Build Coastguard Worker
60*cf84ac9aSAndroid Build Coastguard Worker static void
kvm_ioctl_decode_regs_dtable(const char * prefix,const struct kvm_dtable * const dtable)61*cf84ac9aSAndroid Build Coastguard Worker kvm_ioctl_decode_regs_dtable(const char *prefix,
62*cf84ac9aSAndroid Build Coastguard Worker const struct kvm_dtable *const dtable)
63*cf84ac9aSAndroid Build Coastguard Worker {
64*cf84ac9aSAndroid Build Coastguard Worker tprints(prefix);
65*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X("={", *dtable, base);
66*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", *dtable, limit);
67*cf84ac9aSAndroid Build Coastguard Worker tprints("}");
68*cf84ac9aSAndroid Build Coastguard Worker }
69*cf84ac9aSAndroid Build Coastguard Worker
70*cf84ac9aSAndroid Build Coastguard Worker # define PRINT_FIELD_KVM_SREGS_STRUCT(prefix_, where_, type_, field_) \
71*cf84ac9aSAndroid Build Coastguard Worker kvm_ioctl_decode_regs_ ## type_(prefix_ #field_, &(where_)->field_)
72*cf84ac9aSAndroid Build Coastguard Worker
73*cf84ac9aSAndroid Build Coastguard Worker static void
arch_print_kvm_sregs(struct tcb * const tcp,const kernel_ulong_t addr,const struct kvm_sregs * const sregs)74*cf84ac9aSAndroid Build Coastguard Worker arch_print_kvm_sregs(struct tcb *const tcp,
75*cf84ac9aSAndroid Build Coastguard Worker const kernel_ulong_t addr,
76*cf84ac9aSAndroid Build Coastguard Worker const struct kvm_sregs *const sregs)
77*cf84ac9aSAndroid Build Coastguard Worker {
78*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_KVM_SREGS_STRUCT("{", sregs, segment, cs);
79*cf84ac9aSAndroid Build Coastguard Worker if (abbrev(tcp)) {
80*cf84ac9aSAndroid Build Coastguard Worker tprints(", ...}");
81*cf84ac9aSAndroid Build Coastguard Worker return;
82*cf84ac9aSAndroid Build Coastguard Worker }
83*cf84ac9aSAndroid Build Coastguard Worker
84*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_KVM_SREGS_STRUCT(", ", sregs, segment, ds);
85*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_KVM_SREGS_STRUCT(", ", sregs, segment, es);
86*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_KVM_SREGS_STRUCT(", ", sregs, segment, fs);
87*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_KVM_SREGS_STRUCT(", ", sregs, segment, gs);
88*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_KVM_SREGS_STRUCT(", ", sregs, segment, ss);
89*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_KVM_SREGS_STRUCT(", ", sregs, segment, tr);
90*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_KVM_SREGS_STRUCT(", ", sregs, segment, ldt);
91*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_KVM_SREGS_STRUCT(", ", sregs, dtable, gdt);
92*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_KVM_SREGS_STRUCT(", ", sregs, dtable, idt);
93*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", *sregs, cr0);
94*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", *sregs, cr2);
95*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", *sregs, cr3);
96*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", *sregs, cr4);
97*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", *sregs, cr8);
98*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", *sregs, efer);
99*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", *sregs, apic_base);
100*cf84ac9aSAndroid Build Coastguard Worker tprints(", interrupt_bitmap=[");
101*cf84ac9aSAndroid Build Coastguard Worker
102*cf84ac9aSAndroid Build Coastguard Worker unsigned int i;
103*cf84ac9aSAndroid Build Coastguard Worker for (i = 0; i < ARRAY_SIZE(sregs->interrupt_bitmap); i++) {
104*cf84ac9aSAndroid Build Coastguard Worker if (i != 0)
105*cf84ac9aSAndroid Build Coastguard Worker tprints(", ");
106*cf84ac9aSAndroid Build Coastguard Worker tprintf("%#" PRI__x64, sregs->interrupt_bitmap[i]);
107*cf84ac9aSAndroid Build Coastguard Worker }
108*cf84ac9aSAndroid Build Coastguard Worker tprints("]}");
109*cf84ac9aSAndroid Build Coastguard Worker }
110*cf84ac9aSAndroid Build Coastguard Worker #endif /* HAVE_STRUCT_KVM_SREGS */
111