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
|
/* ========================================
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__ */
|