summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/KernelKit/PEF.h
blob: 94284c98127ef674b93bcf69823df0b85ea1f749 (plain)
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__ */