ckb_vm/
error.rs

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    // When users need to implement traits defined in CKB-VM, they can use
20    // this error type to wrap their own errors.
21    #[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}