summaryrefslogtreecommitdiffhomepage
path: root/src/CompilerKit/PEF.h
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-11-24 03:05:29 +0100
committerAmlal El Mahrouss <amlal@nekernel.org>2025-11-24 03:05:29 +0100
commitbbe2c77243c541ca7e0075149f5be3262eb89523 (patch)
treeae5d59d299344fd19584a2c3642bacd788e841d4 /src/CompilerKit/PEF.h
parentb5adf16a96b9cbb80c74cf30404ed5bcff03ac34 (diff)
feat! breaking changes on necti sources.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'src/CompilerKit/PEF.h')
-rw-r--r--src/CompilerKit/PEF.h137
1 files changed, 137 insertions, 0 deletions
diff --git a/src/CompilerKit/PEF.h b/src/CompilerKit/PEF.h
new file mode 100644
index 0000000..edf8f5d
--- /dev/null
+++ b/src/CompilerKit/PEF.h
@@ -0,0 +1,137 @@
+/* =========================================
+
+ Copyright (C) 2024-2025 Amlal El Mahrouss, Licensed under the Apache 2.0 license
+
+======================================== */
+
+#pragma once
+
+#include <CompilerKit/Defines.h>
+
+// @file PEF.h
+// @brief Preferred Executable Format
+
+#define kPefMagic "Open"
+#define kPefMagicFat "nepO"
+
+#define kPefExt ".exec"
+#define kPefDylibExt ".dylib"
+#define kPefLibExt ".lib"
+#define kPefObjectExt ".obj"
+#define kPefDebugExt ".dbg"
+#define kPefDriverExt ".sys"
+
+#define kPefZero128 ".zero128"
+#define kPefCode128 ".code128"
+#define kPefData128 ".data128"
+
+#define kPefZero64 ".zero64"
+#define kPefCode64 ".code64"
+#define kPefData64 ".data64"
+
+/* @note counting the \0 at the end */
+#define kPefMagicLen (5)
+
+#define kPefVersion (0x0500)
+#define kPefNameLen (255)
+
+#define kPefBaseOrigin (0x40000000)
+
+/* @note this doesn't have to be __ImageStart only, any C initialization stub will do. */
+#define kPefStart "__ImageStart"
+
+namespace CompilerKit {
+/* @brief Architecture type. */
+enum {
+ kPefArchIntel86S,
+ kPefArchAMD64,
+ kPefArchRISCV,
+ kPefArch64000, /* Open64x0 RISC architecture. */
+ kPefArch32000,
+ kPefArchPowerPC, /* 64-bit POWER architecture. */
+ kPefArchARM64,
+ kPefArchCount = (kPefArchARM64 - kPefArchIntel86S) + 1,
+ kPefArchInvalid = 0xFF,
+};
+
+/* @brief Architecture vendor. */
+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,
+};
+
+/* PEF container information */
+typedef struct PEFContainer final {
+ Char Magic[kPefMagicLen];
+ UInt32 Linker; /* Linker used to link executable */
+ UInt32 Version;
+ UInt32 Kind;
+ UInt32 Abi;
+ UInt32 Cpu;
+ UInt32 SubCpu; /* Cpu specific information */
+ UIntPtr Start; /* Origin of code */
+ SizeType HdrSz; /* Size of header */
+ SizeType Count; /* container header count */
+ UInt32 Checksum; /* Whole binary checksum */
+} PACKED PEFContainer, *PEFContainerPtr;
+
+/* First PEFCommandHeader starts after PEFContainer */
+/* Last container is __exec_end */
+
+/* PEF executable section and commands. */
+
+/* @brief Command Header, a la Mach-O, designed with FAT binaries and virtual memory in mind. */
+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; /* File offset */
+ SizeType OffsetSize;
+ UIntPtr VirtualAddress; /* Virtual Address */
+ SizeType VirtualSize; /* Virtual Size */
+} PACKED PEFCommandHeader, *PEFCommandHeaderPtr;
+
+enum {
+ kPefInvalid = 0x0,
+ kPefCode = 0xC,
+ kPefData = 0xD,
+ kPefZero = 0xE,
+ kPefLinkerID = 0x1,
+ kPefCount = 4,
+};
+} // namespace CompilerKit
+
+inline std::ofstream& operator<<(std::ofstream& fp, CompilerKit::PEFContainer& container) {
+ fp.write((char*) &container, sizeof(CompilerKit::PEFContainer));
+ return fp;
+}
+
+inline std::ofstream& operator<<(std::ofstream& fp, CompilerKit::PEFCommandHeader& container) {
+ fp.write((char*) &container, sizeof(CompilerKit::PEFCommandHeader));
+ return fp;
+}
+
+inline std::ifstream& operator>>(std::ifstream& fp, CompilerKit::PEFContainer& container) {
+ fp.read((char*) &container, sizeof(CompilerKit::PEFContainer));
+ return fp;
+}
+
+inline std::ifstream& operator>>(std::ifstream& fp, CompilerKit::PEFCommandHeader& container) {
+ fp.read((char*) &container, sizeof(CompilerKit::PEFCommandHeader));
+ return fp;
+}