xref: /aosp_15_r20/external/strace/linux/x86_64/arch_kvm.c (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
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