summaryrefslogtreecommitdiffhomepage
path: root/src/kernel/KernelKit/PEF.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/KernelKit/PEF.h')
-rw-r--r--src/kernel/KernelKit/PEF.h117
1 files changed, 117 insertions, 0 deletions
diff --git a/src/kernel/KernelKit/PEF.h b/src/kernel/KernelKit/PEF.h
new file mode 100644
index 00000000..94284c98
--- /dev/null
+++ b/src/kernel/KernelKit/PEF.h
@@ -0,0 +1,117 @@
+/* ========================================
+
+ Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license.
+
+ File: PEF.h
+ Purpose: Preferred Executable Format for Kernel.
+
+ Revision History:
+
+ ?/?/23: Added file (amlel)
+
+======================================== */
+
+#ifndef __KERNELKIT_PEF_H__
+#define __KERNELKIT_PEF_H__
+
+#include <CompilerKit/CompilerKit.h>
+#include <KernelKit/ILoader.h>
+#include <NeKit/Defines.h>
+
+#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__ */