NeKernel dev
Loading...
Searching...
No Matches
BootKit.h
Go to the documentation of this file.
1/* ========================================
2
3 Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license.
4
5======================================== */
6
7/***********************************************************************************/
10/***********************************************************************************/
11
12#pragma once
13
14#include <BootKit/HW/ATA.h>
15#include <CompilerKit/Version.h>
17
19
20#include <BootKit/Support.h>
21#include <FSKit/NeFS.h>
22
23/***********************************************************************************/
25/***********************************************************************************/
26
27#include <NeKit/Config.h>
28#include <modules/ATA/ATA.h>
29
30#include <FirmwareKit/EFI.h>
31#include <FirmwareKit/EPM.h>
32#include <FirmwareKit/GPT.h>
33#include <FirmwareKit/VEPM.h>
34
35#define kBKBootFileMime "boot-x/file"
36#define kBKBootDirMime "boot-x/dir"
37
38/***********************************************************************************/
40/***********************************************************************************/
41
42namespace Boot {
43void ThrowError(const WideChar* errorCode, const WideChar* reason);
44
45class BootTextWriter;
46class BootFileReader;
47class BootThread;
48class BVersionString;
49
52
55typedef char8_t CharacterTypeUTF8;
56
57using namespace Kernel;
58
63class BootTextWriter final {
64 BootTextWriter& _Write(const UInt64& num);
65
66 public:
67 BootTextWriter& Write(const UInt64& num);
68 BootTextWriter& Write(const Char* str);
71 BootTextWriter& Write(const UChar* str);
72
73 template <typename T>
75 this->Write(elem);
76 return *this;
77 }
78
79 public:
80 explicit BootTextWriter() = default;
81 ~BootTextWriter() = default;
82
83 public:
85 BootTextWriter(const BootTextWriter&) = default;
86};
87
89
91 const Kernel::SizeT len);
92
94
97
100 const Kernel::SizeT len);
101
106class BootFileReader final {
107 public:
108 explicit BootFileReader(const CharacterTypeUTF16* path, EfiHandlePtr ImageHandle);
110
111 public:
112 Void ReadAll(SizeT until, SizeT chunk = kib_cast(4), UIntPtr out_address = 0UL);
113
114 enum {
122 };
123
126 Int32& Error();
127
130 VoidPtr Blob();
131
134 UInt64& Size();
135
136 public:
139
140 private:
142 VoidPtr mBlob{nullptr};
148};
149
151
153class BVersionString final {
154 public:
155 static const CharacterTypeASCII* The() { return BOOTLOADER_VERSION; }
156};
157
158/***********************************************************************************/
160/***********************************************************************************/
161
162#ifdef __EFI_x86_64__
163
164/***
165 * Common processor instructions.
166 */
167
168EXTERN_C void rt_out8(UInt16 port, UInt8 value);
169EXTERN_C void rt_out16(UInt16 port, UInt16 value);
170EXTERN_C void rt_out32(UInt16 port, UInt32 value);
171EXTERN_C UInt8 rt_in8(UInt16 port);
172EXTERN_C UInt16 rt_in16(UInt16 port);
173EXTERN_C UInt32 rt_in32(UInt16 port);
174
175EXTERN_C void rt_halt();
176EXTERN_C void rt_cli();
177EXTERN_C void rt_sti();
178EXTERN_C void rt_cld();
179EXTERN_C void rt_std();
180
181#endif // __EFI_x86_64__
182
184template <typename BootDev>
186 public:
192
193 public:
194 explicit BDiskFormatFactory() = default;
196
198
199
205 Boolean Format(const Char* part_name);
206
209#if defined(BOOTZ_EPM_SUPPORT)
210 fDiskDev.Leak().mBase = (kEPMBootBlockLba);
211 fDiskDev.Leak().mSize = sizeof(EPM_PART_BLOCK);
212
213 EPM_PART_BLOCK buf_epm = {};
214
215 fDiskDev.Read((Char*) &buf_epm, sizeof(EPM_PART_BLOCK));
216
217 if (StrCmp(buf_epm.Magic, kEPMMagic) > 0) {
218 return false;
219 }
220
221 if (buf_epm.Version != kEPMRevisionBcd) {
222 return false;
223 }
224
225 BootTextWriter writer;
226 writer.Write("BootZ: EPM Partition found.\r");
227
228 return true;
229#else
231
232 fDiskDev.Leak().mBase = (kGPTPartitionTableLBA);
233 fDiskDev.Leak().mSize = sizeof(GPT_PARTITION_TABLE);
234
235 fDiskDev.Read((Char*) gpt_part, sizeof(GPT_PARTITION_TABLE));
236
237 BootTextWriter writer;
238
239 if (StrCmp(gpt_part->Signature, kMagicGPT) == 0) {
240 writer.Write("BootZ: GPT Partition found.\r");
241 return true;
242 }
243
244 writer.Write("BootZ: No Partition found.\r");
245
246 return false;
247#endif
248 }
249
250 private:
251 BootDev fDiskDev;
252};
253
258template <typename BootDev>
260#if defined(BOOTZ_EPM_SUPPORT)
262
263 const auto kFsName = "NeKernel";
264 const auto kBlockName = " NeKernelOS";
265
266 epm_boot->FsVersion = 0;
267 epm_boot->LbaStart = sizeof(EPM_PART_BLOCK);
268 epm_boot->LbaEnd = fDiskDev.GetDiskSize() - 1;
269 epm_boot->SectorSz = BootDev::kSectorSize;
270 epm_boot->Kind = kEPMNeKernel;
271 epm_boot->NumBlocks = 1;
272
273 epm_boot->Guid = kEPMNilGuid;
274
275 CopyMem(epm_boot->Fs, reinterpret_cast<VoidPtr>(const_cast<Char*>(kFsName)), StrLen(kFsName));
276 CopyMem(epm_boot->Name, reinterpret_cast<VoidPtr>(const_cast<Char*>(kBlockName)),
277 StrLen(kBlockName));
278 CopyMem(epm_boot->Magic, reinterpret_cast<VoidPtr>(const_cast<Char*>(kEPMMagic)),
280
281 fDiskDev.Leak().mBase = kEPMBootBlockLba; // always always resies at zero block.
282 fDiskDev.Leak().mSize = sizeof(EPM_PART_BLOCK);
283
284 fDiskDev.Write((Char*) epm_boot, sizeof(EPM_PART_BLOCK));
285
286 BootTextWriter writer;
287 writer.Write(L"BootZ: Drive is EPM formatted.\r");
288#elif defined(BOOTZ_GPT_SUPPORT)
289 NE_UNUSED(part_name);
290
292
293 CopyMem(gpt_part->Signature, reinterpret_cast<VoidPtr>(const_cast<Char*>(kMagicGPT)),
295
296 gpt_part->Revision = 0x00010000;
297 gpt_part->HeaderSize = sizeof(GPT_PARTITION_TABLE);
298
299 gpt_part->CRC32 = 0x00000000;
300
301 gpt_part->Reserved1 = 0x00000000;
302 gpt_part->LBAHeader = 0x00000000;
303 gpt_part->LBAAltHeader = 0x00000000;
304 gpt_part->FirstGPTEntry = 0x00000000;
305 gpt_part->LastGPTEntry = 0x00000000;
306
307 gpt_part->Guid.Data1 = 0x00000000;
308 gpt_part->Guid.Data2 = 0x0000;
309 gpt_part->Guid.Data3 = 0x0000;
310
311 SetMem(gpt_part->Guid.Data4, 0, 8);
312
313 gpt_part->Revision = 0x00010000;
314
315 gpt_part->StartingLBA = 0x00000000;
316 gpt_part->NumPartitionEntries = 0x00000000;
317 gpt_part->SizeOfEntries = 0x00000000;
318 gpt_part->CRC32PartEntry = 0x00000000;
319
321
322 fDiskDev.Leak().mBase = kGPTPartitionTableLBA; // always always resies at zero block.
323 fDiskDev.Leak().mSize = sizeof(GPT_PARTITION_TABLE);
324
325 fDiskDev.Write((Char*) gpt_part, sizeof(GPT_PARTITION_TABLE));
326
327 BootTextWriter writer;
328 writer.Write(L"BootZ: Drive is GPT formatted.\r");
329#else
330 NE_UNUSED(part_name);
331#endif
332
333 return YES;
334}
335} // namespace Boot
EXTERN_C void rt_cli()
EXTERN_C void rt_halt()
#define NE_COPY_DELETE(KLASS)
Definition Detail.h:13
struct EfiHandle * EfiHandlePtr
Core Handle Kind Self is like NT's Win32 HANDLE type.
#define kPathLen
#define kib_cast(X)
#define NE_UNUSED(X)
#define RTL_ALLOCA(sz)
#define YES
#define EXTERN_C
#define kGPTPartitionTableLBA
Definition GPT.h:16
#define kMagicGPT
Definition GPT.h:15
#define kSectorAlignGPT_PartTbl
Definition GPT.h:12
#define kNeFSCatalogNameLen
Definition NeFS.h:32
Purpose of this file is to help port libs into the bootloader.
#define CopyMem(dst, src, sz)
Definition Support.h:49
#define SetMem(dst, c, sz)
Definition Support.h:47
#define StrLen(src)
Definition Support.h:50
#define StrCmp(dst, src)
Definition Support.h:51
#define BOOTLOADER_VERSION
Definition Version.h:5
Boolean Format(const Char *part_name)
Format disk using partition name and blob.
Definition BootKit.h:259
Bool IsPartitionValid()
check if partition is good.
Definition BootKit.h:208
BootDev fDiskDev
Definition BootKit.h:251
Bootloader Version String.
Definition BootKit.h:153
static const CharacterTypeASCII * The()
Definition BootKit.h:155
BootKit File Reader class Reads the Firmware Boot partition and filesystem.
Definition BootKit.h:106
VoidPtr Blob()
blob getter.
Definition BootFileReader.cc:169
BootTextWriter mWriter
Definition BootKit.h:144
Int32 mErrorCode
Definition BootKit.h:141
VoidPtr mBlob
Definition BootKit.h:142
@ kNoSuchEntry
Definition BootKit.h:118
@ kIsDirectory
Definition BootKit.h:119
@ kNotSupported
Definition BootKit.h:116
@ kEmptyDirectory
Definition BootKit.h:117
@ kOperationOkay
Definition BootKit.h:115
@ kCount
Definition BootKit.h:121
@ kTooSmall
Definition BootKit.h:120
BootFileReader & operator=(const BootFileReader &)=default
BootFileReader(const CharacterTypeUTF16 *path, EfiHandlePtr ImageHandle)
Definition BootFileReader.cc:34
~BootFileReader()
Definition BootFileReader.cc:90
Void ReadAll(SizeT until, SizeT chunk=kib_cast(4), UIntPtr out_address=0UL)
Reads all of the file into a buffer.
Definition BootFileReader.cc:114
CharacterTypeUTF16 mPath[kPathLen]
Definition BootKit.h:143
EfiFileProtocol * mRootFs
Definition BootKit.h:147
UInt64 mSizeFile
Definition BootKit.h:146
UInt64 & Size()
Definition BootFileReader.cc:175
EfiFileProtocol * mFile
Definition BootKit.h:145
Int32 & Error()
error code getter.
Definition BootFileReader.cc:163
BootFileReader(const BootFileReader &)=default
BootKit Text Writer class Writes to UEFI StdOut.
Definition BootKit.h:63
BootTextWriter & operator<<(T elem)
Definition BootKit.h:74
BootTextWriter & operator=(const BootTextWriter &)=default
BootTextWriter(const BootTextWriter &)=default
BootTextWriter & WriteCharacter(CharacterTypeUTF16 c)
putc wrapper over EFI ConOut.
Definition BootTextWriter.cc:109
BootTextWriter()=default
~BootTextWriter()=default
BootTextWriter & _Write(const UInt64 &num)
Definition BootTextWriter.cc:134
BootTextWriter & Write(const UInt64 &num)
Definition BootTextWriter.cc:123
Bootloader Thread class.
Definition BootThread.h:19
@ kEPMNeKernel
BSD on EPM.
Definition EPM.h:104
#define kEPMRevisionBcd
!
Definition EPM.h:56
#define kEPMMagic
Definition EPM.h:47
EPM_GUID kEPMNilGuid
Definition EPM.h:110
#define kEPMBootBlockLba
!
Definition EPM.h:59
Framebuffer helpers.
Definition BootKit.h:42
void ThrowError(const WideChar *errorCode, const WideChar *reason)
Definition API.h:60
Kernel::SizeT BSetMem(CharacterTypeASCII *src, const CharacterTypeASCII byte, const Kernel::SizeT len)
Definition BootString.cc:65
char8_t CharacterTypeUTF8
Definition BootKit.h:55
Kernel::SizeT BCopyMem(CharacterTypeUTF16 *dest, CharacterTypeUTF16 *src, const Kernel::SizeT len)
BUGS: 0.
Definition BootString.cc:22
Char * PEFImagePtr
Definition BootKit.h:50
Char * PEImagePtr
Definition BootKit.h:51
UInt8 * BlobType
Definition BootKit.h:150
WideChar CharacterTypeUTF16
Definition BootKit.h:53
Char CharacterTypeASCII
Definition BootKit.h:54
Kernel::SizeT BStrLen(const CharacterTypeUTF16 *ptr)
String length functions.
Definition BootString.cc:34
UPS inline definitions.
Definition Device.h:12
char Char
Definition Config.h:51
void Void
Definition Config.h:87
__UINT8_TYPE__ UChar
Definition Config.h:54
__UINT16_TYPE__ UInt16
Definition Config.h:40
__SIZE_TYPE__ SizeT
Definition Config.h:60
__UINT8_TYPE__ UInt8
Definition Config.h:55
__UINT32_TYPE__ UInt32
Definition Config.h:44
void * VoidPtr
Definition Config.h:33
__INT32_TYPE__ Int32
Definition Config.h:38
bool Boolean
Definition Config.h:49
__UINTPTR_TYPE__ UIntPtr
Definition Config.h:62
__UINT64_TYPE__ UInt64
Definition Config.h:48
wchar_t WideChar
Definition Config.h:77
bool Bool
Definition Config.h:50
File entry for BDiskFormatFactory.
Definition BootKit.h:188
Int32 fKind
Definition BootKit.h:190
Char fFileName[kNeFSCatalogNameLen]
Definition BootKit.h:189
The EPM boot block.
Definition EPM.h:80
Kernel::Char Name[kEPMNameLength]
Definition EPM.h:82
Kernel::Int64 LbaStart
Definition EPM.h:87
Kernel::Int64 LbaEnd
Definition EPM.h:88
Kernel::Char Fs[kEPMFilesystemLength]
Definition EPM.h:92
Kernel::Int32 FsVersion
Definition EPM.h:91
EPM_GUID Guid
Definition EPM.h:83
Kernel::Int32 Version
Definition EPM.h:84
Kernel::Int64 SectorSz
Definition EPM.h:86
Kernel::Int64 NumBlocks
Definition EPM.h:85
Kernel::Int16 Kind
Definition EPM.h:89
Kernel::Char Magic[kEPMMagicLength]
Definition EPM.h:81
Definition EFI.h:751
Definition GPT.h:22
UInt64 FirstGPTEntry
Definition GPT.h:30
UInt32 NumPartitionEntries
Definition GPT.h:34
UInt64 LBAAltHeader
Definition GPT.h:29
UInt32 HeaderSize
Definition GPT.h:25
Char Signature[kMagicLenGPT]
Definition GPT.h:23
EFI_GUID Guid
Definition GPT.h:32
UInt64 StartingLBA
Definition GPT.h:33
UInt32 Revision
Definition GPT.h:24
UInt32 Reserved1
Definition GPT.h:27
UInt32 SizeOfEntries
Definition GPT.h:35
UInt32 CRC32PartEntry
Definition GPT.h:36
UInt64 LBAHeader
Definition GPT.h:28
UInt32 CRC32
Definition GPT.h:26
UInt64 LastGPTEntry
Definition GPT.h:31
UInt8 Reserved2[kSectorAlignGPT_PartTbl]
Definition GPT.h:37