summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/FirmwareKit/EPM.h
blob: c8b8b63bd6cee949c3ccff791b7a1fb87fcc074e (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
/* -------------------------------------------

  Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license.

------------------------------------------- */

/**
  @brief The Explicit Partition Map scheme.
*/

#ifndef FIRMWAREKIT_EPM_H
#define FIRMWAREKIT_EPM_H

#include <NeKit/Defines.h>

#define kEPMNameLength (32)
#define kEPMFilesystemLength (16)
#define kEPMMagicLength (5)

/* @brief AMD64 magic for EPM */
#define kEPMMagic86 "EPMAM"

/* @brief RISC-V magic for EPM */
#define kEPMMagicRISCV "EPMRV"

/* @brief ARM magic for EPM */
#define kEPMMagicARM "EPMAR"

/* @brief 64x0 magic for EPM */
#define kEPMMagic64k "EPM64"

/* @brief 32x0 magic for EPM */
#define kEPMMagic32k "EPM32"

/* @brief POWER magic for EPM */
#define kEPMMagicPPC "EPMPC"

/* @brief Invalid magic for EPM */
#define kEPMMagicError "EPM??"

#ifdef __NE_AMD64__
#define kEPMMagic kEPMMagic86
#else
#ifdef __NE_ARM64__
#define kEPMMagic kEPMMagicARM
#else
#define kEPMMagic kEPMMagicError
#endif
#endif

///! @brief partition must start at this address.
///! Anything below is reserved for Data backup by the Main OS.
#define kEPMPartBlockLba (sizeof(EPM_PART_BLOCK))

///! @brief Current EPM revision.
#define kEPMRevisionBcd (0x0100)

/// !@brief EPM boot block address.
#define kEPMBootBlockLba (0U)

#define kEPMReserveLen (399)

struct EPM_GUID;
struct EPM_PART_BLOCK;

/* The first 0 > 128 addresses of a disk contains these headers. */

/// @brief EPM GUID structure.
typedef struct EPM_GUID {
  Kernel::UInt32 Data1;
  Kernel::UInt16 Data2;
  Kernel::UInt16 Data3;
  Kernel::UInt8  Data4[8];
} PACKED EPM_GUID;

/**
 * @brief The EPM boot block.
 * @note NumBlock and LbaStart are ignored on some platforms.
 */
struct PACKED EPM_PART_BLOCK {
  Kernel::Char  Magic[kEPMMagicLength];
  Kernel::Char  Name[kEPMNameLength];
  EPM_GUID      Guid;
  Kernel::Int32 Version;
  Kernel::Int64 NumBlocks;
  Kernel::Int64 SectorSz;
  Kernel::Int64 LbaStart;  // base offset
  Kernel::Int64 LbaEnd;    // end offset
  Kernel::Int16 Kind;
  Kernel::Int16 Flags;
  Kernel::Int32 FsVersion;
  Kernel::Char  Fs[kEPMFilesystemLength];  /* NeFS, OpenHeFS... */
  Kernel::Char  Reserved[kEPMReserveLen];  // to fill a full sector.
};

///! @brief Version kind enum.
///! @brief Use in boot block version field.

enum {
  kEPMInvalid  = 0x00,
  kEPMGeneric  = 0xcf,  /// @brief Generic OS
  kEPMLinux    = 0x8f,  /// @brief Linux on EPM.
  kEPMBSD      = 0x9f,  /// @brief BSD on EPM.
  kEPMNeKernel = 0x1f,  /// @brief NeKernel.
  kEPMLegacy = 0x2f,  /// @brief Legacy VMKernel.
  /// @note ... the rest is reserved for future OSes.
  kEPMInvalidOS = 0xff,
};

inline EPM_GUID kEPMNilGuid = {0x0U, 0x0U, 0x0U, {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}};

#endif  // ifndef FIRMWAREKIT_EPM_H