// Copyright 2024-2025, Amlal El Mahrouss (amlal@nekernel.org) // Licensed under the Apache License, Version 2.0 (see LICENSE file) // Official repository: https://github.com/ne-foss-org/nekernel #ifndef KERNELKIT_PEF_H #define KERNELKIT_PEF_H #include #include #include #define kPefMagic "Open" #define kPefMagicFat "nepO" #define kPefMagicLen (5) #define kPefVersion (0x0500) #define kPefNameLen (256U) /* not mandatory, only for non fork based filesystems. */ #define kPefExt ".exec" #define kPefDylibExt ".dylib" #define kPefLibExt ".lib" #define kPefObjectExt ".obj" #define kPefDebugExt ".dbg" #define kPefDriverExt ".sys" // Kernel System Binary Interface. #define kPefAbi (0x5046) #define kPefBaseOrigin (0x40000000) #define kPefStart "__ImageStart" #define kPefMainSymbol "_NeMain" #define kPefForkKind kPefMagic #define kPefForkKindFAT kPefMagicFat namespace Kernel { enum { kPefArchIntel86S, kPefArchAMD64, kPefArchRISCV, kPefArch64x0, /* 64x0. ISA */ kPefArch32x0, /* 32x0. ISA */ kPefArchPowerPC, kPefArchARM64, kPefArchCount = (kPefArchARM64 - kPefArchIntel86S) + 1, kPefArchInvalid = 0xFF, }; enum { kPefSubArchGeneric = 0, kPefSubArchAMD = 200, kPefSubArchIntel, kPefSubArchARM, kPefSubArchIBM, }; enum { kPefKindInvalid = 0, kPefKindExec = 1, /* .exec */ kPefKindDylib = 2, /* .dylib */ kPefKindObject = 4, /* .obj */ kPefKindDebug = 5, /* .dbg */ kPefKindDriver = 6, kPefKindCount, }; typedef struct PEFContainer final { Char Magic[kPefMagicLen]; UInt32 Linker; UInt32 Version; UInt32 Kind; UInt32 Abi; UInt32 Cpu; UInt32 SubCpu; /* Cpu specific information */ UIntPtr Start; SizeT HdrSz; /* Size of header */ SizeT Count; /* container header count */ UInt32 Checksum; } PACKED PEFContainer; /* First PEFCommandHeader starts after PEFContainer */ typedef struct PEFCommandHeader final { Char Name[kPefNameLen]; /* container name */ UInt32 Cpu; /* container cpu */ UInt32 SubCpu; /* container sub-cpu */ UInt32 Flags; /* container flags */ UInt16 Kind; /* container kind */ UIntPtr Offset; /* content offset */ SizeT OffsetSize; /* offset size (physical size inside the file) */ UIntPtr VMAddress; /* Virtual Address */ SizeT VMSize; /* Virtual Size */ } PACKED PEFCommandHeader; enum { kPefInvalid = 0x0, kPefCode = 0xC, kPefData = 0xD, kPefZero = 0xE, kPefLinkerID = 0x1, kPefCount = 4, }; } // namespace Kernel #endif /* ifndef KERNELKIT_PEF_H */