1 /*
2 * Copyright (c) 2017-2021 The strace developers.
3 * All rights reserved.
4 *
5 * SPDX-License-Identifier: LGPL-2.1-or-later
6 */
7
8 #ifdef HAVE_STRUCT_KVM_REGS
9 static void
10 arch_print_kvm_regs(struct tcb *const tcp,
11 const kernel_ulong_t addr,
12 const struct kvm_regs *const regs)
13 {
14 tprint_struct_begin();
15 PRINT_FIELD_X(*regs, rax);
16 tprint_struct_next();
17 if (abbrev(tcp)) {
18 tprint_more_data_follows();
19 } else {
20 PRINT_FIELD_X(*regs, rbx);
21 tprint_struct_next();
22 PRINT_FIELD_X(*regs, rcx);
23 tprint_struct_next();
24 PRINT_FIELD_X(*regs, rdx);
25 tprint_struct_next();
26 PRINT_FIELD_X(*regs, rsi);
27 tprint_struct_next();
28 PRINT_FIELD_X(*regs, rdi);
29 }
30 tprint_struct_next();
31 PRINT_FIELD_X(*regs, rsp);
32 tprint_struct_next();
33 PRINT_FIELD_X(*regs, rbp);
34 tprint_struct_next();
35 if (abbrev(tcp)) {
36 tprint_more_data_follows();
37 } else {
38 PRINT_FIELD_X(*regs, r8);
39 tprint_struct_next();
40 PRINT_FIELD_X(*regs, r9);
41 tprint_struct_next();
42 PRINT_FIELD_X(*regs, r10);
43 tprint_struct_next();
44 PRINT_FIELD_X(*regs, r11);
45 tprint_struct_next();
46 PRINT_FIELD_X(*regs, r12);
47 tprint_struct_next();
48 PRINT_FIELD_X(*regs, r13);
49 tprint_struct_next();
50 PRINT_FIELD_X(*regs, r14);
51 tprint_struct_next();
52 PRINT_FIELD_X(*regs, r15);
53 }
54 tprint_struct_next();
55 PRINT_FIELD_X(*regs, rip);
56
57 /* TODO: we can decode this more */
58 tprint_struct_next();
59 PRINT_FIELD_X(*regs, rflags);
60
61 tprint_struct_end();
62 }
63 #endif /* HAVE_STRUCT_KVM_REGS */
64
65 #ifdef HAVE_STRUCT_KVM_SREGS
66 static void
67 kvm_ioctl_decode_regs_segment(const struct kvm_segment *const segment)
68 {
69 tprint_struct_begin();
70 PRINT_FIELD_X(*segment, base);
71 tprint_struct_next();
72 PRINT_FIELD_U(*segment, limit);
73 tprint_struct_next();
74 PRINT_FIELD_U(*segment, selector);
75 tprint_struct_next();
76 PRINT_FIELD_U(*segment, type);
77 tprint_struct_next();
78 PRINT_FIELD_U(*segment, present);
79 tprint_struct_next();
80 PRINT_FIELD_U(*segment, dpl);
81 tprint_struct_next();
82 PRINT_FIELD_U(*segment, db);
83 tprint_struct_next();
84 PRINT_FIELD_U(*segment, s);
85 tprint_struct_next();
86 PRINT_FIELD_U(*segment, l);
87 tprint_struct_next();
88 PRINT_FIELD_U(*segment, g);
89 tprint_struct_next();
90 PRINT_FIELD_U(*segment, avl);
91 tprint_struct_end();
92 }
93
94 static void
95 kvm_ioctl_decode_regs_dtable(const struct kvm_dtable *const dtable)
96 {
97 tprint_struct_begin();
98 PRINT_FIELD_X(*dtable, base);
99 tprint_struct_next();
100 PRINT_FIELD_U(*dtable, limit);
101 tprint_struct_end();
102 }
103
104 # define PRINT_FIELD_KVM_SREGS_STRUCT(where_, field_, type_) \
105 PRINT_FIELD_OBJ_PTR(where_, field_, \
106 kvm_ioctl_decode_regs_ ## type_)
107
108 static void
109 arch_print_kvm_sregs(struct tcb *const tcp,
110 const kernel_ulong_t addr,
111 const struct kvm_sregs *const sregs)
112 {
113 tprint_struct_begin();
114 PRINT_FIELD_KVM_SREGS_STRUCT(*sregs, cs, segment);
115 if (abbrev(tcp)) {
116 tprint_struct_next();
117 tprint_more_data_follows();
118 tprint_struct_end();
119 return;
120 }
121
122 tprint_struct_next();
123 PRINT_FIELD_KVM_SREGS_STRUCT(*sregs, ds, segment);
124 tprint_struct_next();
125 PRINT_FIELD_KVM_SREGS_STRUCT(*sregs, es, segment);
126 tprint_struct_next();
127 PRINT_FIELD_KVM_SREGS_STRUCT(*sregs, fs, segment);
128 tprint_struct_next();
129 PRINT_FIELD_KVM_SREGS_STRUCT(*sregs, gs, segment);
130 tprint_struct_next();
131 PRINT_FIELD_KVM_SREGS_STRUCT(*sregs, ss, segment);
132 tprint_struct_next();
133 PRINT_FIELD_KVM_SREGS_STRUCT(*sregs, tr, segment);
134 tprint_struct_next();
135 PRINT_FIELD_KVM_SREGS_STRUCT(*sregs, ldt, segment);
136 tprint_struct_next();
137 PRINT_FIELD_KVM_SREGS_STRUCT(*sregs, gdt, dtable);
138 tprint_struct_next();
139 PRINT_FIELD_KVM_SREGS_STRUCT(*sregs, idt, dtable);
140 tprint_struct_next();
141 PRINT_FIELD_U(*sregs, cr0);
142 tprint_struct_next();
143 PRINT_FIELD_U(*sregs, cr2);
144 tprint_struct_next();
145 PRINT_FIELD_U(*sregs, cr3);
146 tprint_struct_next();
147 PRINT_FIELD_U(*sregs, cr4);
148 tprint_struct_next();
149 PRINT_FIELD_U(*sregs, cr8);
150 tprint_struct_next();
151 PRINT_FIELD_U(*sregs, efer);
152 tprint_struct_next();
153 PRINT_FIELD_X(*sregs, apic_base);
154 tprint_struct_next();
155 PRINT_FIELD_X_ARRAY(*sregs, interrupt_bitmap);
156 tprint_struct_end();
157 }
158 #endif /* HAVE_STRUCT_KVM_SREGS */