1#[derive(Debug, PartialEq, Clone, Eq, Display)]
2pub enum Error {
3 #[display(fmt = "asm error: {}", "_0")]
4 Asm(u8),
5 #[display(fmt = "cycles error: max cycles exceeded")]
6 CyclesExceeded,
7 #[display(fmt = "cycles error: overflow")]
8 CyclesOverflow,
9 #[display(fmt = "elf error: bits")]
10 ElfBits,
11 #[display(fmt = "elf error: {}", "_0")]
12 ElfParseError(String),
13 #[display(fmt = "elf error: segment is unreadable")]
14 ElfSegmentUnreadable,
15 #[display(fmt = "elf error: segment is writable and executable")]
16 ElfSegmentWritableAndExecutable,
17 #[display(fmt = "elf error: segment addr or size is wrong")]
18 ElfSegmentAddrOrSizeError,
19 #[display(fmt = "external error: {}", "_0")]
22 External(String),
23 #[display(fmt = "invalid syscall {}", "_0")]
24 InvalidEcall(u64),
25 #[display(
26 fmt = "invalid instruction pc=0x{:x} instruction=0x{:x}",
27 "pc",
28 "instruction"
29 )]
30 InvalidInstruction { pc: u64, instruction: u32 },
31 #[display(fmt = "invalid operand {}", "_0")]
32 InvalidOp(u16),
33 #[display(fmt = "invalid version")]
34 InvalidVersion,
35 #[display(fmt = "I/O error: {:?} {}", "kind", "data")]
36 IO {
37 kind: std::io::ErrorKind,
38 data: String,
39 },
40 #[display(fmt = "memory error: out of bound")]
41 MemOutOfBound,
42 #[display(fmt = "memory error: out of stack")]
43 MemOutOfStack,
44 #[display(fmt = "memory error: unaligned page access")]
45 MemPageUnalignedAccess,
46 #[display(fmt = "memory error: write on executable page")]
47 MemWriteOnExecutablePage,
48 #[display(fmt = "memory error: write on freezed page")]
49 MemWriteOnFreezedPage,
50 #[display(fmt = "pause")]
51 Pause,
52 #[display(fmt = "snapshot data load error")]
53 SnapshotDataLoadError,
54 #[display(fmt = "unexpected error")]
55 Unexpected(String),
56 #[display(fmt = "unimplemented")]
57 Unimplemented,
58 #[display(fmt = "yield")]
59 Yield,
60}
61
62impl std::error::Error for Error {}
63
64impl From<std::io::Error> for Error {
65 fn from(error: std::io::Error) -> Self {
66 Error::IO {
67 kind: error.kind(),
68 data: error.to_string(),
69 }
70 }
71}
72
73impl From<goblin_v023::error::Error> for Error {
74 fn from(error: goblin_v023::error::Error) -> Self {
75 Error::ElfParseError(error.to_string())
76 }
77}
78
79impl From<goblin_v040::error::Error> for Error {
80 fn from(error: goblin_v040::error::Error) -> Self {
81 Error::ElfParseError(error.to_string())
82 }
83}