diff options
| -rw-r--r-- | compile_flags.txt | 1 | ||||
| -rw-r--r-- | dev/LibSCI/Macros.h | 5 | ||||
| -rw-r--r-- | public/frameworks/CoreFoundation.fwrk/.keep | 0 | ||||
| -rw-r--r-- | public/frameworks/CoreFoundation.fwrk/headers/.keep | 0 | ||||
| -rw-r--r-- | public/frameworks/CoreFoundation.fwrk/xml/.keep | 0 | ||||
| -rw-r--r-- | public/frameworks/CoreFoundation.fwrk/xml/app.xml | 8 | ||||
| -rw-r--r-- | public/frameworks/DiskImage.fwrk/headers/DiskImage.h | 21 | ||||
| -rw-r--r-- | public/frameworks/DiskImage.fwrk/src/DiskImage.cc | 68 | ||||
| -rw-r--r-- | public/frameworks/DiskImage.fwrk/xml/.keep | 0 | ||||
| -rw-r--r-- | public/frameworks/DiskImage.fwrk/xml/app.xml | 5 | ||||
| -rw-r--r-- | public/tools/make_fs/CommandLine.cc | 188 |
11 files changed, 204 insertions, 92 deletions
diff --git a/compile_flags.txt b/compile_flags.txt index b93c0ea8..f99ee4ef 100644 --- a/compile_flags.txt +++ b/compile_flags.txt @@ -6,6 +6,7 @@ -Ipublic/tools/make_app -Ipublic/tools/make_fs -Ipublic/tools/open +-Ipublic/frameworks/ -Idev/Boot/BootKit -std=c++20 -D__NE_AMD64__ diff --git a/dev/LibSCI/Macros.h b/dev/LibSCI/Macros.h index 0868ed2f..4e4bff9a 100644 --- a/dev/LibSCI/Macros.h +++ b/dev/LibSCI/Macros.h @@ -28,8 +28,11 @@ Purpose: LibSCI Macros header. #define FILE_MAX_LEN 256 +#ifndef BOOL +#define BOOL bool +#endif + typedef bool Bool; -typedef bool BOOL; typedef bool Boolean; typedef void Void; diff --git a/public/frameworks/CoreFoundation.fwrk/.keep b/public/frameworks/CoreFoundation.fwrk/.keep new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/public/frameworks/CoreFoundation.fwrk/.keep diff --git a/public/frameworks/CoreFoundation.fwrk/headers/.keep b/public/frameworks/CoreFoundation.fwrk/headers/.keep new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/public/frameworks/CoreFoundation.fwrk/headers/.keep diff --git a/public/frameworks/CoreFoundation.fwrk/xml/.keep b/public/frameworks/CoreFoundation.fwrk/xml/.keep new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/public/frameworks/CoreFoundation.fwrk/xml/.keep diff --git a/public/frameworks/CoreFoundation.fwrk/xml/app.xml b/public/frameworks/CoreFoundation.fwrk/xml/app.xml new file mode 100644 index 00000000..d4ac9b98 --- /dev/null +++ b/public/frameworks/CoreFoundation.fwrk/xml/app.xml @@ -0,0 +1,8 @@ +<MLCoreFoundation> +<MLAppName> + CoreFoundation +</MLAppName> +<MLInternalSDK> + CoreFoundationInternal +</MLInternalSDK> +</MLCoreFoundation>
\ No newline at end of file diff --git a/public/frameworks/DiskImage.fwrk/headers/DiskImage.h b/public/frameworks/DiskImage.fwrk/headers/DiskImage.h new file mode 100644 index 00000000..34a0bc0c --- /dev/null +++ b/public/frameworks/DiskImage.fwrk/headers/DiskImage.h @@ -0,0 +1,21 @@ +/* ------------------------------------------- + + Copyright (C) 2025, Amlal EL Mahrouss, all rights reserved. + + FILE: DiskImage.h + PURPOSE: Disk Imaging. + + ------------------------------------------- */ + +#pragma once + +#include <FirmwareKit/EPM.h> +#include <FSKit/NeFS.h> +#include <uuid/uuid.h> +#include <LibSCI/SCI.h> + +SInt32 DIFormatDiskToFile(const char* kDiskName = "Disk", + int kDiskSectorSz = 512, + const int kDiskBlockCnt = 1, + size_t kDiskSz = gib_cast(4), + const char* kOutDisk = "disk.eimg") noexcept;
\ No newline at end of file diff --git a/public/frameworks/DiskImage.fwrk/src/DiskImage.cc b/public/frameworks/DiskImage.fwrk/src/DiskImage.cc new file mode 100644 index 00000000..c992371b --- /dev/null +++ b/public/frameworks/DiskImage.fwrk/src/DiskImage.cc @@ -0,0 +1,68 @@ +/* ------------------------------------------- + + Copyright (C) 2025, Amlal EL Mahrouss, all rights reserved. + + FILE: DiskImage.cc + PURPOSE: Disk Imaging. + + ------------------------------------------- */ + +#include <DiskImage.fwrk/headers/DiskImage.h> + +SInt32 DIFormatDiskToFile(const char* kDiskName, + int kDiskSectorSz, + const int kDiskBlockCnt, + size_t kDiskSz, + const char* kOutDisk) noexcept +{ + struct ::EPM_PART_BLOCK block + { + 0 + }; + + block.NumBlocks = kDiskBlockCnt; + block.SectorSz = kDiskSectorSz; + block.Version = kEPMRevisionBcd; + block.LbaStart = sizeof(struct ::EPM_PART_BLOCK); + block.LbaEnd = 0; + block.FsVersion = kNeFSVersionInteger; + + ::MmCopyMemory(block.Name, (VoidPtr)kDiskName, ::MmStrLen(kDiskName)); + ::MmCopyMemory(block.Magic, (VoidPtr)kEPMMagic86, ::MmStrLen(kEPMMagic86)); + + ::uuid_generate_random((NeOS::UInt8*)&block.Guid); + + IOObject handle = IoOpenFile(kDiskName, nullptr); + ::IoWriteFile(handle, (NeOS::Char*)&block, sizeof(struct ::EPM_PART_BLOCK)); + + struct ::NEFS_ROOT_PARTITION_BLOCK rpb + { + }; + + ::MmCopyMemory(rpb.PartitionName, (VoidPtr)kDiskName, ::MmStrLen(kDiskName)); + ::MmCopyMemory(rpb.Ident, (VoidPtr)kNeFSIdent, ::MmStrLen(kNeFSIdent)); + + rpb.Version = kNeFSVersionInteger; + rpb.EpmBlock = kEPMBootBlockLba; + + rpb.StartCatalog = kNeFSCatalogStartAddress; + rpb.CatalogCount = 0; + + rpb.DiskSize = kDiskSz; + + rpb.SectorSize = kDiskSectorSz; + rpb.SectorCount = rpb.DiskSize / rpb.SectorSize; + + rpb.FreeSectors = rpb.SectorCount; + rpb.FreeCatalog = rpb.DiskSize / sizeof(NEFS_CATALOG_STRUCT); + + auto p_prev = ::IoTellFile(handle); + + ::IoWriteFile(handle, (NeOS::Char*)&rpb, sizeof(struct ::NEFS_ROOT_PARTITION_BLOCK)); + + ::IoSeekFile(handle, p_prev); + + ::IoCloseFile(handle); + + return 0; +}
\ No newline at end of file diff --git a/public/frameworks/DiskImage.fwrk/xml/.keep b/public/frameworks/DiskImage.fwrk/xml/.keep new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/public/frameworks/DiskImage.fwrk/xml/.keep diff --git a/public/frameworks/DiskImage.fwrk/xml/app.xml b/public/frameworks/DiskImage.fwrk/xml/app.xml new file mode 100644 index 00000000..a3ab79f0 --- /dev/null +++ b/public/frameworks/DiskImage.fwrk/xml/app.xml @@ -0,0 +1,5 @@ +<MLCoreFoundation> +<MLAppName> + DiskImage +</MLAppName> +</MLCoreFoundation>
\ No newline at end of file diff --git a/public/tools/make_fs/CommandLine.cc b/public/tools/make_fs/CommandLine.cc index 5cdcba52..f3ea3f18 100644 --- a/public/tools/make_fs/CommandLine.cc +++ b/public/tools/make_fs/CommandLine.cc @@ -7,105 +7,111 @@ ------------------------------------------- */ +#include <string> #include <iostream> #include <fstream> + #include <FirmwareKit/EPM.h> #include <FSKit/NeFS.h> -#include <string> #include <uuid/uuid.h> -static std::string kDiskName = "Disk"; -static int kDiskSectorSz = 512; -static const int kDiskBlockCnt = 1; -static size_t kDiskSz = gib_cast(4); -std::string kOutDisk = "disk.eimg"; +static std::string kDiskName = "Disk"; +static int kDiskSectorSz = 512; +static const int kDiskBlockCnt = 1; +static size_t kDiskSz = gib_cast(4); +static std::string kOutDisk = "disk.eimg"; /// @brief Filesystem tool entrypoint. int main(int argc, char** argv) { - for (size_t arg = 0; arg < argc; ++arg) - { - std::string arg_s = argv[arg]; - - if (arg_s == "--disk-output-name") - { - if ((arg + 1) < argc) - { - kOutDisk = argv[arg + 1]; - } - } - else if (arg_s == "--disk-size") - { - if ((arg + 1) < argc) - { - kDiskSz = strtol(argv[arg + 1], nullptr, 10); - } - } - else if (arg_s == "--disk-sector-size") - { - if ((arg + 1) < argc) - { - kDiskSectorSz = strtol(argv[arg + 1], nullptr, 10); - } - } - else if (arg_s == "--disk-name") - { - if ((arg + 1) < argc) - { - kDiskName = argv[arg + 1]; - } - } - } - - std::cout << "make_fs: EPM Image Creator.\n"; - - struct ::EPM_PART_BLOCK block{0}; - - block.NumBlocks = kDiskBlockCnt; - block.SectorSz = kDiskSectorSz; - block.Version = kEPMRevisionBcd; - block.LbaStart = sizeof(struct ::EPM_PART_BLOCK); - block.LbaEnd = 0; - block.FsVersion = kNeFSVersionInteger; - - ::memcpy(block.Name, kDiskName.c_str(), strlen(kDiskName.c_str())); - ::memcpy(block.Magic, kEPMMagic86, strlen(kEPMMagic86)); - - ::uuid_generate_random((NeOS::UInt8*)&block.Guid); - - std::ofstream output_epm(kOutDisk); - output_epm.write((NeOS::Char*)&block, sizeof(struct ::EPM_PART_BLOCK)); - - struct ::NEFS_ROOT_PARTITION_BLOCK rpb{}; - - ::memcpy(rpb.PartitionName, kDiskName.c_str(), strlen(kDiskName.c_str())); - ::memcpy(rpb.Ident, kNeFSIdent, strlen(kNeFSIdent)); - - rpb.Version = kNeFSVersionInteger; - rpb.EpmBlock = kEPMBootBlockLba; - - rpb.StartCatalog = kNeFSCatalogStartAddress; - rpb.CatalogCount = 0; - - rpb.DiskSize = kDiskSz; - - rpb.SectorSize = kDiskSectorSz; - rpb.SectorCount = rpb.DiskSize / rpb.SectorSize; - - rpb.FreeSectors = rpb.SectorCount; - rpb.FreeCatalog = rpb.DiskSize / sizeof(NEFS_CATALOG_STRUCT); - - auto p_prev = output_epm.tellp(); - - output_epm.seekp(kNeFSRootCatalogStartAddress); - - output_epm.write((NeOS::Char*)&rpb, sizeof(struct ::NEFS_ROOT_PARTITION_BLOCK)); - - output_epm.seekp(p_prev); - - output_epm.close(); - - std::cout << "make_fs: EPM Image has been written to: " << kOutDisk << "\n"; - - return 0; + for (size_t arg = 0; arg < argc; ++arg) + { + std::string arg_s = argv[arg]; + + if (arg_s == "--disk-output-name") + { + if ((arg + 1) < argc) + { + kOutDisk = argv[arg + 1]; + } + } + else if (arg_s == "--disk-size") + { + if ((arg + 1) < argc) + { + kDiskSz = strtol(argv[arg + 1], nullptr, 10); + } + } + else if (arg_s == "--disk-sector-size") + { + if ((arg + 1) < argc) + { + kDiskSectorSz = strtol(argv[arg + 1], nullptr, 10); + } + } + else if (arg_s == "--disk-name") + { + if ((arg + 1) < argc) + { + kDiskName = argv[arg + 1]; + } + } + } + + std::cout << "make_fs: EPM Image Creator.\n"; + + struct ::EPM_PART_BLOCK block + { + 0 + }; + + block.NumBlocks = kDiskBlockCnt; + block.SectorSz = kDiskSectorSz; + block.Version = kEPMRevisionBcd; + block.LbaStart = sizeof(struct ::EPM_PART_BLOCK); + block.LbaEnd = 0; + block.FsVersion = kNeFSVersionInteger; + + ::memcpy(block.Name, kDiskName.c_str(), strlen(kDiskName.c_str())); + ::memcpy(block.Magic, kEPMMagic86, strlen(kEPMMagic86)); + + ::uuid_generate_random((NeOS::UInt8*)&block.Guid); + + std::ofstream output_epm(kOutDisk); + output_epm.write((NeOS::Char*)&block, sizeof(struct ::EPM_PART_BLOCK)); + + struct ::NEFS_ROOT_PARTITION_BLOCK rpb + { + }; + + ::memcpy(rpb.PartitionName, kDiskName.c_str(), strlen(kDiskName.c_str())); + ::memcpy(rpb.Ident, kNeFSIdent, strlen(kNeFSIdent)); + + rpb.Version = kNeFSVersionInteger; + rpb.EpmBlock = kEPMBootBlockLba; + + rpb.StartCatalog = kNeFSCatalogStartAddress; + rpb.CatalogCount = 0; + + rpb.DiskSize = kDiskSz; + + rpb.SectorSize = kDiskSectorSz; + rpb.SectorCount = rpb.DiskSize / rpb.SectorSize; + + rpb.FreeSectors = rpb.SectorCount; + rpb.FreeCatalog = rpb.DiskSize / sizeof(NEFS_CATALOG_STRUCT); + + auto p_prev = output_epm.tellp(); + + output_epm.seekp(kNeFSRootCatalogStartAddress); + + output_epm.write((NeOS::Char*)&rpb, sizeof(struct ::NEFS_ROOT_PARTITION_BLOCK)); + + output_epm.seekp(p_prev); + + output_epm.close(); + + std::cout << "make_fs: EPM Image has been written to: " << kOutDisk << "\n"; + + return 0; }
\ No newline at end of file |
