diff options
Diffstat (limited to 'dev')
| -rw-r--r-- | dev/boot/BootKit/BootKit.h | 2 | ||||
| -rw-r--r-- | dev/boot/amd64-desktop.make | 2 | ||||
| -rw-r--r-- | dev/kernel/FirmwareKit/EPM.h | 4 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalApplicationProcessorStartup.s | 9 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalKernelMain.cc | 16 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/PCI/Iterator.cc | 10 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc | 4 | ||||
| -rw-r--r-- | dev/kernel/KernelKit/DriveMgr.h | 17 | ||||
| -rw-r--r-- | dev/kernel/KernelKit/PCI/Iterator.h | 2 | ||||
| -rw-r--r-- | dev/kernel/src/DriveMgr.cc | 34 | ||||
| -rw-r--r-- | dev/kernel/src/FS/OpenHeFS+FileSystemParser.cc | 28 | ||||
| -rw-r--r-- | dev/launch/src/AppMain.cc | 7 |
12 files changed, 81 insertions, 54 deletions
diff --git a/dev/boot/BootKit/BootKit.h b/dev/boot/BootKit/BootKit.h index 12ce305e..d4b6addb 100644 --- a/dev/boot/BootKit/BootKit.h +++ b/dev/boot/BootKit/BootKit.h @@ -261,7 +261,7 @@ inline Boolean BDiskFormatFactory<BootDev>::Format(const Char* part_name) { EPM_PART_BLOCK* epm_boot = (EPM_PART_BLOCK*) RTL_ALLOCA(sizeof(EPM_PART_BLOCK)); const auto kFsName = "NeKernel"; - const auto kBlockName = "OS (EPM)"; + const auto kBlockName = " NeKernelOS"; epm_boot->FsVersion = 0; epm_boot->LbaStart = sizeof(EPM_PART_BLOCK); diff --git a/dev/boot/amd64-desktop.make b/dev/boot/amd64-desktop.make index 25878092..337f78d5 100644 --- a/dev/boot/amd64-desktop.make +++ b/dev/boot/amd64-desktop.make @@ -133,7 +133,7 @@ run-efi-amd64-ata: run-efi-amd64-ata-pio # img_2 is the rescue disk. img is the bootable disk, as provided by the NeKernel specs. .PHONY: epm-img epm-img: - qemu-img create -f raw $(IMG) 8G + qemu-img create -f raw $(IMG) 2G .PHONY: efi efi: diff --git a/dev/kernel/FirmwareKit/EPM.h b/dev/kernel/FirmwareKit/EPM.h index 1921ae71..c8b8b63b 100644 --- a/dev/kernel/FirmwareKit/EPM.h +++ b/dev/kernel/FirmwareKit/EPM.h @@ -78,8 +78,8 @@ typedef struct EPM_GUID { * @note NumBlock and LbaStart are ignored on some platforms. */ struct PACKED EPM_PART_BLOCK { - Kernel::Char Magic[kEPMMagicLength] = {0}; - Kernel::Char Name[kEPMNameLength] = {0}; + Kernel::Char Magic[kEPMMagicLength]; + Kernel::Char Name[kEPMNameLength]; EPM_GUID Guid; Kernel::Int32 Version; Kernel::Int64 NumBlocks; diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessorStartup.s b/dev/kernel/HALKit/AMD64/HalApplicationProcessorStartup.s index 903038ea..7b383404 100644 --- a/dev/kernel/HALKit/AMD64/HalApplicationProcessorStartup.s +++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessorStartup.s @@ -1,3 +1,12 @@ + /* + * ======================================================== + * + * NeKernel + * Copyright (C) 2024-2025, Amlal El Mahrouss, licensed under the Apache 2.0 license. + * + * ======================================================== + */ + .text .global hal_ap_blob_start diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc index 50d022e9..051e3cc3 100644 --- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc +++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc @@ -134,7 +134,13 @@ EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) { } EXTERN_C Kernel::Void hal_real_init(Kernel::Void) { - using namespace Kernel; +#ifdef __FSKIT_INCLUDES_OPENHEFS__ + OpenHeFS::fs_init_openhefs(); +#endif + +#ifdef __FSKIT_INCLUDES_NEFS__ + NeFS::fs_init_nefs(); +#endif HAL::Register64 idt_reg; idt_reg.Base = reinterpret_cast<UIntPtr>(kInterruptVectorTable); @@ -144,14 +150,6 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) { HAL::mp_init_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr); -#ifdef __FSKIT_INCLUDES_OPENHEFS__ - OpenHeFS::fs_init_openhefs(); -#endif - -#ifdef __FSKIT_INCLUDES_NEFS__ - NeFS::fs_init_nefs(); -#endif - while (YES) ; } diff --git a/dev/kernel/HALKit/AMD64/PCI/Iterator.cc b/dev/kernel/HALKit/AMD64/PCI/Iterator.cc index 9d12c0d6..88bbce3f 100644 --- a/dev/kernel/HALKit/AMD64/PCI/Iterator.cc +++ b/dev/kernel/HALKit/AMD64/PCI/Iterator.cc @@ -7,12 +7,12 @@ #include <KernelKit/PCI/Iterator.h> namespace Kernel::PCI { -Iterator::Iterator(const Types::PciDeviceKind& type) { +Iterator::Iterator(const Types::PciDeviceKind type, UInt32 bar) { // probe devices. - for (int bus = 0; bus < NE_BUS_COUNT; ++bus) { - for (int device = 0; device < NE_DEVICE_COUNT; ++device) { - for (int function = 0; function < NE_FUNCTION_COUNT; ++function) { - Device dev(bus, device, function, 0x00); + for (Int32 bus = 0; bus < NE_BUS_COUNT; ++bus) { + for (Int32 device = 0; device < NE_DEVICE_COUNT; ++device) { + for (Int32 function = 0; function < NE_FUNCTION_COUNT; ++function) { + Device dev(bus, device, function, bar); if (dev.Class() == type) { fDevices[bus] = dev; diff --git a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc index 0bd9455d..821d80bb 100644 --- a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc +++ b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc @@ -397,7 +397,8 @@ STATIC Bool drv_init_command_structures_ahci() { /// @param atapi reference value, tells whether we should detect ATAPI instead of SATA. /// @return if the disk was successfully initialized or not. STATIC Bool drv_std_init_ahci(UInt16& pi, BOOL& atapi) { - PCI::Iterator iterator(Types::PciDeviceKind::MassStorageController); + /// AMLALE: TODO: Iterator is good enough, but we need to expand it. + PCI::Iterator iterator(Types::PciDeviceKind::MassStorageController, 0x00); for (SizeT device_index = 0; device_index < NE_BUS_COUNT; ++device_index) { kSATADev = iterator[device_index].Leak(); // Leak device. @@ -438,7 +439,6 @@ STATIC Bool drv_std_init_ahci(UInt16& pi, BOOL& atapi) { if (!drv_init_command_structures_ahci()) { err_global_get() = kErrorDisk; - return NO; } goto success_hba_fetch; diff --git a/dev/kernel/KernelKit/DriveMgr.h b/dev/kernel/KernelKit/DriveMgr.h index dd3f9614..1a6d1b08 100644 --- a/dev/kernel/KernelKit/DriveMgr.h +++ b/dev/kernel/KernelKit/DriveMgr.h @@ -52,7 +52,7 @@ enum { /// @brief Media drive trait type. struct DriveTrait final { - Char fName[kDriveNameLen] = {0}; // /System, /boot, //./Devices/USB... + Char fName[kDriveNameLen] = "/media/null"; // /System, /boot, //./Devices/USB... UInt32 fKind{}; // fMassStorage, fFloppy, fOpticalDrive. UInt32 fFlags{}; // fReadOnly, fEPMDrive... @@ -70,11 +70,11 @@ struct DriveTrait final { Lba fLbaStart{0}, fLbaEnd{0}; SizeT fSectorSz{kDriveSectorSz}; - Void (*fInput)(DrivePacket& packet){}; - Void (*fOutput)(DrivePacket& packet){}; - Void (*fVerify)(DrivePacket& packet){}; - Void (*fInit)(DrivePacket& packet){}; - const Char* (*fProtocol)(Void){}; + Void (*fInput)(DrivePacket& packet){nullptr}; + Void (*fOutput)(DrivePacket& packet){nullptr}; + Void (*fVerify)(DrivePacket& packet){nullptr}; + Void (*fInit)(DrivePacket& packet){nullptr}; + const Char* (*fProtocol)(Void){nullptr}; }; namespace Probe { @@ -155,7 +155,12 @@ const Char* io_drv_kind(Void); DriveTrait io_construct_blank_drive(Void) noexcept; /// @brief Fetches the main drive. +/// @param trait the new drive as a trait. +Void io_construct_main_drive(DriveTrait& trait) noexcept; + +/// @brief Fetches the main drive. /// @return the new drive as a trait. +/// @deprecated use io_construct_main_drive(DriveTrait& trait) instead. DriveTrait io_construct_main_drive(Void) noexcept; namespace Detect { diff --git a/dev/kernel/KernelKit/PCI/Iterator.h b/dev/kernel/KernelKit/PCI/Iterator.h index 9ab746d9..743e73ea 100644 --- a/dev/kernel/KernelKit/PCI/Iterator.h +++ b/dev/kernel/KernelKit/PCI/Iterator.h @@ -23,7 +23,7 @@ class Iterator final { Iterator() = delete; public: - explicit Iterator(const Types::PciDeviceKind& deviceType); + explicit Iterator(const Types::PciDeviceKind deviceType, UInt32 bar); Iterator& operator=(const Iterator&) = default; Iterator(const Iterator&) = default; diff --git a/dev/kernel/src/DriveMgr.cc b/dev/kernel/src/DriveMgr.cc index a0f7bb77..cf31928c 100644 --- a/dev/kernel/src/DriveMgr.cc +++ b/dev/kernel/src/DriveMgr.cc @@ -72,8 +72,6 @@ Void io_drv_output(DriveTrait::DrivePacket& pckt) { /// @param pckt the packet to read. /// @return Void io_drv_init(DriveTrait::DrivePacket& pckt) { - NE_UNUSED(pckt); - #if defined(__ATA_PIO__) || defined(__ATA_DMA__) kATAMaster = 0; kATAIO = 0; @@ -97,10 +95,9 @@ Void io_drv_init(DriveTrait::DrivePacket& pckt) { pckt.fPacketGood = YES; #elif defined(__AHCI__) kAHCIPortsImplemented = 0; + drv_std_init(kAHCIPortsImplemented); - if (drv_std_init(kAHCIPortsImplemented)) { - pckt.fPacketGood = YES; - } + pckt.fPacketGood = kAHCIPortsImplemented > 0; #endif // if defined(__ATA_PIO__) || defined (__ATA_DMA__) } @@ -154,6 +151,8 @@ DriveTrait io_construct_blank_drive() noexcept { namespace Probe { Void io_detect_drive(DriveTrait& trait) { + trait.fInit(trait.fPacket); + EPM_PART_BLOCK block_struct; trait.fPacket.fPacketLba = kEPMBootBlockLba; @@ -163,8 +162,6 @@ namespace Probe { rt_copy_memory((VoidPtr) "fs/detect-packet", trait.fPacket.fPacketMime, rt_string_len("fs/detect-packet")); - trait.fInit(trait.fPacket); - trait.fInput(trait.fPacket); if (rt_string_cmp(block_struct.Magic, kEPMMagic, kEPMMagicLength) == 0) { @@ -215,14 +212,14 @@ namespace Probe { trait.fPacket.fPacketSize = 0UL; trait.fPacket.fPacketContent = nullptr; } -} // namespace Detail +} // namespace Probe /// @brief Fetches the main drive. /// @return the new drive. (returns kEPMDrive if EPM formatted) DriveTrait io_construct_main_drive() noexcept { constexpr auto kMainDrive = "/media/main/"; - DriveTrait trait{}; + DriveTrait trait; rt_copy_memory((VoidPtr) kMainDrive, trait.fName, rt_string_len(kMainDrive)); MUST_PASS(trait.fName[0] != 0); @@ -232,9 +229,26 @@ DriveTrait io_construct_main_drive() noexcept { trait.fInput = io_drv_input; trait.fInit = io_drv_init; trait.fProtocol = io_drv_kind; - + Probe::io_detect_drive(trait); return trait; } + +/// @brief Replacement for io_construct_main_drive that works with IMountpoint. +/// @return the new drive. (returns kEPMDrive if EPM formatted) +Void io_construct_main_drive(DriveTrait& trait) noexcept { + constexpr auto kMainDrive = "/media/main/"; + + rt_copy_memory((VoidPtr) kMainDrive, trait.fName, rt_string_len(kMainDrive)); + MUST_PASS(trait.fName[0] != 0); + + trait.fVerify = io_drv_unimplemented; + trait.fOutput = io_drv_output; + trait.fInput = io_drv_input; + trait.fInit = io_drv_init; + trait.fProtocol = io_drv_kind; + + Probe::io_detect_drive(trait); +} } // namespace Kernel diff --git a/dev/kernel/src/FS/OpenHeFS+FileSystemParser.cc b/dev/kernel/src/FS/OpenHeFS+FileSystemParser.cc index 8bfbf7fb..5d9bbd55 100644 --- a/dev/kernel/src/FS/OpenHeFS+FileSystemParser.cc +++ b/dev/kernel/src/FS/OpenHeFS+FileSystemParser.cc @@ -86,7 +86,7 @@ namespace Detail { ((val << 8) & 0x000000FF00000000ULL) | ((val << 24) & 0x0000FF0000000000ULL) | ((val << 40) & 0x00FF000000000000ULL) | ((val << 56) & 0xFF00000000000000ULL); } - + /// @brief Simple algorithm to hash directory entries for INDs. /// @param path the directory path. /// @return The hashed path. @@ -759,15 +759,14 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* mnt, _Input c // if disk isn't good, then error out. if (false == mnt->fPacket.fPacketGood) { err_global_get() = kErrorDiskIsCorrupted; - return false; + return NO; } if (drv_std_get_size() < kHeFSMinimumDiskSize) { (Void)(kout << "OpenHeFS recommends at least 128 GiB of free space." << kendl); - (Void)( - kout - << "The OS will still try to format a OpenHeFS disk here anyway, don't expect perfect geometry." - << kendl); + (Void)(kout << "The OS will still try to format a OpenHeFS disk here anyway, don't expect " + "perfect geometry." + << kendl); } HEFS_BOOT_NODE* boot = (HEFS_BOOT_NODE*) RTL_ALLOCA(sizeof(HEFS_BOOT_NODE)); @@ -1145,23 +1144,28 @@ _Output Bool HeFileSystemParser::INodeCtlManip(_Input DriveTrait* mnt, _Input co return NO; } -STATIC DriveTrait kMountPoint; +STATIC IMountpoint kMountpoint; /// @brief Initialize the OpenHeFS filesystem. /// @return To check its status, see err_local_get(). Boolean OpenHeFS::fs_init_openhefs(Void) noexcept { - kout << "Verifying disk...\r"; + io_construct_main_drive(kMountpoint.A()); - kMountPoint = io_construct_main_drive(); - - if (kMountPoint.fPacket.fPacketReadOnly == YES) { + if (kMountpoint.A().fPacket.fPacketReadOnly == YES) { kout << "Main disk cannot be mounted (read-only media).\r"; return NO; } HeFileSystemParser parser; - return parser.Format(&kMountPoint, kHeFSEncodingFlagsUTF8, kHeFSDefaultVolumeName); + if (!parser.Format(&kMountpoint.A(), kHeFSEncodingFlagsUTF8, kHeFSDefaultVolumeName)) { + kout << "Failed to format OpenHeFS partition!\r"; + return NO; + } + + kout << "Valid OpenHeFS disk...\r"; + + return YES; } } // namespace Kernel diff --git a/dev/launch/src/AppMain.cc b/dev/launch/src/AppMain.cc index 94b0ba35..b75b928a 100644 --- a/dev/launch/src/AppMain.cc +++ b/dev/launch/src/AppMain.cc @@ -10,11 +10,8 @@ /// @note This called by _NeMain from its own runtime. extern "C" SInt32 nelaunch_startup_fn(Void) { - /// @todo Start LaunchHelpers.fwrk services, make the launcher manageable too (via mgmt.launch) - - NELAUNCH_INFO("Turning on launcher..."); - - UInt32* ret = (UInt32*) libsys_syscall_arg_1(libsys_hash_64("__launch_register_pid0")); + /// Start LaunchHelpers.fwrk services, and make the launcher manageable too (via mgmt.launch) + UInt32* ret = (UInt32*) libsys_syscall_arg_1(libsys_hash_64("__launch_register_launch_service")); if (ret) { switch (*ret) { |
