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
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
use crate::*;

#[derive(Debug, Eq, Ord, PartialEq, PartialOrd)]
pub enum Machine {
    // No machine
    None,
    // AT&T WE 32100
    M32,
    // SUN SPARC
    SPARC,
    // Intel 80386
    Intel386,
    // Motorola m68k family
    M68K,
    // Motorola m88k family
    M88K,
    // Intel MCU
    IntelMCU,
    // Intel 80860
    Intel80860,
    // MIPS R3000 big-endian
    MIPS,
    // IBM System/370
    S370,
    // MIPS R3000 little-endian
    MIPSRS3LE,

    // reserved 11-14

    // HPPA
    Parisc,
    // Fujitsu VPP500
    VPP500,
    // Sun's "v8plus"
    SPARC32Plus,
    // Intel 80960
    Intel80960,
    // PowerPC
    PowerPC,
    // PowerPC 64-bit
    PowerPC65,
    // IBM S390
    S390,
    // IBM SPU/SPC
    SPU,

    // reserved 24-35

    // NEC V700 series
    V800,
    // Fujitsu FR20
    FR20,
    // TRW RH-32
    RH32,
    // Motorola RCE
    RCE,
    // ARM
    Arm,
    // Digital Alpha
    FakeAlpha,
    // Hitachi SH
    EMSH,
    // SPARC v9 64-bit
    EMSPARCV9,
    // Siemens Tricore
    Tricore,
    // Argonaut RISC Core
    ARC,
    // Hitachi H8/300
    H8300,
    // Hitachi H8/300H
    H8300H,
    // Hitachi H8S
    H8S,
    // Hitachi H8/500
    H8500,
    // Stanford MIPS-X
    MIPSX,
    // Motorola Coldfire
    Coldfire,
    // Motorola M68HC12
    M68HC12,
    // Fujitsu MMA Multimedia Accelerator
    MMA,
    // Siemens PCP
    PCP,
    // Sony nCPU embedded RISC
    NCPU,
    // Denso NDR1 microprocessor
    NDR1,
    // Motorola Start*Core processor
    StarCore,
    // Toyota ME16 processor
    ME16,
    // STMicroelectronic ST100 processor
    ST100,
    // Advanced Logic Corp. TinyJ embedded processor
    TinyJ,
    // Advanced Micro Devices X86-64 processor
    X8664,
    // Sony DSP Processor
    PSDP,
    // Digital Equipment Corp. PDP-10
    PDP10,
    // Digital Equipment Corp. PDP-11
    PDP11,
    // Siemens FX66 microcontroller
    FX66,
    // STMicroelectronics ST9+ 8/16 bit microcontroller
    ST9Plus,
    // STMicroelectronics ST7 8-bit microcontroller
    ST7,
    // Motorola MC68HC16 Microcontroller
    MC68HC16,
    // Motorola MC68HC11 Microcontroller
    MC68HC11,
    // Motorola MC68HC08 Microcontroller
    MC68HC08,
    // Motorola MC68HC05 Microcontroller
    MC68HC05,
    // Silicon Graphics SVx
    SVx,
    // STMicroelectronics ST19 8-bit cpu
    ST19,
    // Digital VAX
    VAX,
    // Axis Communications 32-bit embedded processor
    CRIS,
    // Infineon Technologies 32-bit embedded cpu
    Javelin,
    // Element 14 64-bit DSP processor
    Firepath,
    // LSI Logic's 16-bit DSP processor
    ZSP,
    // Donald Knuth's educational 64-bit processor
    MMIX,
    // Harvard's machine-independent format
    HUANY,
    // SiTera Prism
    Prism,
    // Atmel AVR 8-bit microcontroller
    AVR,
    // Fujitsu FR30
    FR30,
    // Mitsubishi D10V
    D10V,
    // Mitsubishi D30V
    D30V,
    // Renesas V850 (formerly NEC V850)
    V850,
    // Renesas M32R (formerly Mitsubishi M32R)
    M32R,
    // Matsushita MN10300
    MN10300,
    // Matsushita MN10200
    MN10200,
    // picoJava
    PicoJava,
    // OpenRISC 1000 32-bit embedded processor
    OR1K,
    // ARC International ARCompact processor
    ARCompact,
    // Tensilica Xtensa Architecture
    Xtensa,
    // Old Sunplus S+core7 backend magic number.
    // Written in the absence of an ABI.
    SCoreOld,
    // Alphamosaic VideoCore processor
    VideoCore,
    // Thompson Multimedia General Purpose Processor
    TMMGPP,
    // National Semiconductor 32000 series
    NS32K,
    // Tenor Network TPC processor
    TPC,
    // Old value for picoJava. Deprecated.
    PicoJavaOld,
    // Trebia SNP 1000 processor
    SNP1K,
    // STMicroelectronics ST200 microcontroller
    ST200,
    Any(Elf64Half),
}

impl Machine {
    pub fn to_bytes(&self) -> Elf64Half {
        match self {
            Self::X8664 => 62,
            Self::Any(c) => *c,
            _ => panic!("not implemented -> {:?}", self),
        }
    }
}

impl From<Elf64Half> for Machine {
    fn from(bytes: Elf64Half) -> Self {
        match bytes {
            62 => Self::X8664,
            _ => Self::Any(bytes),
        }
    }
}