kvm_rs/
fmt.rs

1// SPDX-License-Identifier: MIT
2//
3// Copyright (c) 2021, Johannes Stoelp <dev@memzero.de>
4
5use 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}