1use std::fmt;
6
7use crate::kvm_sys::{kvm_dtable, kvm_regs, kvm_segment, kvm_sregs};
8use crate::x86_64::*;
9
10impl fmt::Display for kvm_regs {
11 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
12 write!(
13 f,
14 "rax: {:#018x} rbx: {:#018x} rcx: {:#018x} rdx: {:#018x}\n\
15 rsi: {:#018x} rdi: {:#018x}\n\
16 r8 : {:#018x} r9 : {:#018x} r10: {:#018x} r11: {:#018x}\n\
17 r12: {:#018x} r13: {:#018x} r14: {:#018x} r15: {:#018x}\n\
18 rsp: {:#018x} rbp: {:#018x}\n\
19 rip: {:#018x} rfl: {:#018x} O({}) D({}) I({}) T({}) S({}) Z({}) P({}) C({})",
20 self.rax,
21 self.rbx,
22 self.rcx,
23 self.rdx,
24 self.rsi,
25 self.rdi,
26 self.r8,
27 self.r9,
28 self.r10,
29 self.r11,
30 self.r12,
31 self.r13,
32 self.r14,
33 self.r15,
34 self.rsp,
35 self.rbp,
36 self.rip,
37 self.rflags,
38 rflags_of(self.rflags),
39 rflags_df(self.rflags),
40 rflags_if(self.rflags),
41 rflags_tf(self.rflags),
42 rflags_sf(self.rflags),
43 rflags_zf(self.rflags),
44 rflags_pf(self.rflags),
45 rflags_cf(self.rflags),
46 )
47 }
48}
49
50impl fmt::Display for kvm_segment {
51 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
52 if self.present == 0 {
53 write!(f, "{:#04x} P(0)", self.selector)
54 } else {
55 write!(
56 f,
57 "{:#06x} T({}) RPL({}) BASE({:#010x}) LIMIT({:#07x}) P(1) S({}) DPL({}) DB({}) L({}) TYPE({})",
58 self.selector,
59 if seg_selector_ti(self.selector) == 0 {
60 "GDT"
61 } else {
62 "LDT"
63 },
64 seg_selector_rpl(self.selector),
65 self.base,
66 self.limit,
67 self.s,
68 self.dpl,
69 self.db,
70 self.l,
71 match self.type_ {
72 0 => "D:R---",
73 1 => "D:R-A-",
74 2 => "D:RW--",
75 3 => "D:RWA-",
76 4 => "D:R--E",
77 5 => "D:R-AE",
78 6 => "D:RW-E",
79 7 => "D:RWAE",
80 8 => "C:X---",
81 9 => "C:X-A-",
82 10 => "C:XR--",
83 11 => "C:XRA-",
84 12 => "C:X--C",
85 13 => "C:X-AC",
86 14 => "C:XR-C",
87 15 => "C:XRAC",
88 _ => unreachable!(),
89 }
90 )
91 }
92 }
93}
94
95impl fmt::Display for kvm_dtable {
96 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
97 write!(f, "BASE({:#018x}) LIMIT({:#07x})", self.base, self.limit)
98 }
99}
100
101impl fmt::Display for kvm_sregs {
102 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
103 write!(
104 f,
105 "cs : {}\n\
106 ds : {}\n\
107 es : {}\n\
108 fs : {}\n\
109 gs : {}\n\
110 ss : {}\n\
111 tr : {}\n\
112 ldt : {}\n\
113 gdt : {}\n\
114 idt : {}\n\
115 cr0 : {:#018x} cr2: {:#018x} cr3: {:#018x} cr4: {:#018x}\n\
116 efer: {:#018x}",
117 self.cs,
118 self.ds,
119 self.es,
120 self.fs,
121 self.gs,
122 self.ss,
123 self.tr,
124 self.ldt,
125 self.gdt,
126 self.idt,
127 self.cr0,
128 self.cr2,
129 self.cr3,
130 self.cr4,
131 self.efer,
132 )
133 }
134}