hyperlight_common/
outb.rs1use core::convert::TryFrom;
18
19use anyhow::{Error, anyhow};
20
21#[repr(u8)]
25#[derive(Debug, Clone, Copy)]
26pub enum Exception {
27 DivideByZero = 0,
28 Debug = 1,
29 NonMaskableInterrupt = 2,
30 Breakpoint = 3,
31 Overflow = 4,
32 BoundRangeExceeded = 5,
33 InvalidOpcode = 6,
34 DeviceNotAvailable = 7,
35 DoubleFault = 8,
36 CoprocessorSegmentOverrun = 9,
37 InvalidTSS = 10,
38 SegmentNotPresent = 11,
39 StackSegmentFault = 12,
40 GeneralProtectionFault = 13,
41 PageFault = 14,
42 Reserved = 15,
43 X87FloatingPointException = 16,
44 AlignmentCheck = 17,
45 MachineCheck = 18,
46 SIMDFloatingPointException = 19,
47 VirtualizationException = 20,
48 SecurityException = 30,
49 NoException = 0xFF,
50}
51
52impl TryFrom<u8> for Exception {
53 type Error = Error;
54
55 fn try_from(value: u8) -> Result<Self, Self::Error> {
56 use Exception::*;
57 let exception = match value {
58 0 => DivideByZero,
59 1 => Debug,
60 2 => NonMaskableInterrupt,
61 3 => Breakpoint,
62 4 => Overflow,
63 5 => BoundRangeExceeded,
64 6 => InvalidOpcode,
65 7 => DeviceNotAvailable,
66 8 => DoubleFault,
67 9 => CoprocessorSegmentOverrun,
68 10 => InvalidTSS,
69 11 => SegmentNotPresent,
70 12 => StackSegmentFault,
71 13 => GeneralProtectionFault,
72 14 => PageFault,
73 15 => Reserved,
74 16 => X87FloatingPointException,
75 17 => AlignmentCheck,
76 18 => MachineCheck,
77 19 => SIMDFloatingPointException,
78 20 => VirtualizationException,
79 30 => SecurityException,
80 0x7F => NoException,
81 _ => return Err(anyhow!("Unknown exception code: {:#x}", value)),
82 };
83
84 Ok(exception)
85 }
86}
87
88pub enum OutBAction {
98 Log = 99,
99 CallFunction = 101,
100 Abort = 102,
101 DebugPrint = 103,
102 #[cfg(feature = "unwind_guest")]
103 TraceRecordStack = 104,
104 #[cfg(feature = "mem_profile")]
105 TraceMemoryAlloc = 105,
106 #[cfg(feature = "mem_profile")]
107 TraceMemoryFree = 106,
108 #[cfg(feature = "trace_guest")]
109 TraceRecord = 107,
110}
111
112impl TryFrom<u16> for OutBAction {
113 type Error = anyhow::Error;
114 fn try_from(val: u16) -> anyhow::Result<Self> {
115 match val {
116 99 => Ok(OutBAction::Log),
117 101 => Ok(OutBAction::CallFunction),
118 102 => Ok(OutBAction::Abort),
119 103 => Ok(OutBAction::DebugPrint),
120 #[cfg(feature = "unwind_guest")]
121 104 => Ok(OutBAction::TraceRecordStack),
122 #[cfg(feature = "mem_profile")]
123 105 => Ok(OutBAction::TraceMemoryAlloc),
124 #[cfg(feature = "mem_profile")]
125 106 => Ok(OutBAction::TraceMemoryFree),
126 #[cfg(feature = "trace_guest")]
127 107 => Ok(OutBAction::TraceRecord),
128 _ => Err(anyhow::anyhow!("Invalid OutBAction value: {}", val)),
129 }
130 }
131}