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