summaryrefslogtreecommitdiffhomepage
path: root/KernelKit/PEF.hpp
blob: 384182868e4cab19e008a300d7e28eacbf529ad5 (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
/*
 *	========================================================
 *
 *	hCore
 * 	Copyright Mahrouss Logic, all rights reserved.
 *
 * 	========================================================
 */

#ifndef _INC_LOADER_PEF_HPP
#define _INC_LOADER_PEF_HPP

#include <NewKit/Defines.hpp>
#include <KernelKit/Loader.hpp>
#include <CompilerKit/Compiler.hpp>

#define kPefMagic    "PEF"
#define kPefMagicFat "FEP"

#define kPefMagicLen 3

#define kPefVersion 1
#define kPefNameLen 64

// @brief Preferred Executable Format, a format designed for any computer.

namespace hCore
{
    enum
    {
        kPefArchIntel86S,
        kPefArchAMD64,
        kPefArchRISCV,
        kPefArchARC, /* Advanced RISC architecture. */
        kPefArchPower,
        kPefArchInvalid = 0xFF,
    };

    enum
    {
        kPefKindExec = 1, /* .exe */
        kPefKindSharedObject = 2, /* .lib */
        kPefKindObject = 4, /* .obj */
        kPefKindDebug = 5, /* .debug */
    };

    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 */
    } __attribute__((packed)) PEFContainer;

    /* First PEFCommandHeader starts after PEFContainer */
    /* Last container is __exec_end */

    /* PEF executable section and commands. */

    typedef struct PEFCommandHeader final
    {
        Char Name[kPefNameLen]; /* container name */
        UInt32 Flags; /* container flags */
        UInt16 Kind; /* container kind */
        UIntPtr Offset; /* content offset */
        SizeT Size; /* content Size */
    } __attribute__((packed)) PEFCommandHeader;

    enum
    {
        kPefCode = 0xC,
        kPefData = 0xD,
        kPefZero = 0xE,
        kPefLinkerID = 0x1,
    };
}

#define kPefExt ".o"
#define kPefDylibExt ".so"
#define kPefObjectExt ".o"
#define kPefDebugExt ".dbg"

// hCore System Binary Interface.
#define kPefAbi     (0xDEAD2)

#define kPefStart "__start"

#endif /* ifndef _INC_LOADER_PEF_HPP */