| 3218 | |
| 3219 | |
| 3220 | static Ref<Platform> ElfFlagsRecognize(BinaryView* view, Metadata* metadata) |
| 3221 | { |
| 3222 | Ref<Metadata> abiMetadata = metadata->Get("EI_OSABI"); |
| 3223 | if (!abiMetadata || !abiMetadata->IsUnsignedInteger()) |
| 3224 | return nullptr; |
| 3225 | |
| 3226 | uint64_t abi = abiMetadata->GetUnsignedInteger(); |
| 3227 | if (abi != 0 && abi != 3) |
| 3228 | return nullptr; |
| 3229 | |
| 3230 | Ref<Metadata> flagsMetadata = metadata->Get("e_flags"); |
| 3231 | if (!flagsMetadata || !flagsMetadata->IsUnsignedInteger()) |
| 3232 | return nullptr; |
| 3233 | |
| 3234 | uint64_t flagsValue = flagsMetadata->GetUnsignedInteger(); |
| 3235 | uint8_t machineVariant = (flagsValue >> 16) & 0xff; |
| 3236 | |
| 3237 | switch (machineVariant) |
| 3238 | { |
| 3239 | case 0x8b: // EF_MIPS_MACH_OCTEON |
| 3240 | case 0x8d: // EF_MIPS_MACH_OCTEON2 |
| 3241 | case 0x8e: // EF_MIPS_MACH_OCTEON3 |
| 3242 | LogInfo("ELF flags 0x%08" PRIx64 " machine variant 0x%02x: using cavium architecture", flagsValue, machineVariant); |
| 3243 | return Platform::GetByName("linux-cnmips64"); |
| 3244 | default: |
| 3245 | return nullptr; |
| 3246 | } |
| 3247 | } |
| 3248 | |
| 3249 | extern "C" |
| 3250 | { |
nothing calls this directly
no test coverage detected