diff options
Diffstat (limited to 'dev/kernel')
30 files changed, 223 insertions, 117 deletions
diff --git a/dev/kernel/CompilerKit/Version.h b/dev/kernel/CompilerKit/Version.h index 0d53b5ed..0f4f863d 100644 --- a/dev/kernel/CompilerKit/Version.h +++ b/dev/kernel/CompilerKit/Version.h @@ -6,5 +6,5 @@ #define BOOTLOADER_VERSION "1104.2025.110" #define KERNEL_VERSION "1104.2025.110" -#define BOOTLOADER_VERSION_BCD 0x11042025110 -#define KERNEL_VERSION_BCD 0x11042025110 +#define BOOTLOADER_VERSION_BCD 0x20250415 +#define KERNEL_VERSION_BCD 0x20250415 diff --git a/dev/kernel/FSKit/NeFS.h b/dev/kernel/FSKit/NeFS.h index 4b54afc8..3c11fdb4 100644 --- a/dev/kernel/FSKit/NeFS.h +++ b/dev/kernel/FSKit/NeFS.h @@ -336,8 +336,8 @@ namespace Kernel public: STATIC const Char* Root(); STATIC const Char* UpDir(); - STATIC Char Separator(); - STATIC Char MetaFile(); + STATIC Char Separator(); + STATIC Char MetaFile(); }; /// @brief Journal class for NeFS. diff --git a/dev/kernel/FirmwareKit/CoreBoot/BootNet.h b/dev/kernel/FirmwareKit/CoreBoot/BootNet.h index e3cda0ba..c2bfe161 100644 --- a/dev/kernel/FirmwareKit/CoreBoot/BootNet.h +++ b/dev/kernel/FirmwareKit/CoreBoot/BootNet.h @@ -26,5 +26,5 @@ typedef struct BOOTNET_INTERNET_HEADER Kernel::Char Target[kBootNetNameLen]; /// the target file. Kernel::Boolean ImpliesProgram : 1; /// does it imply an EEPROM program? Kernel::Boolean Preflight : 1; /// is it a preflight packet. - Kernel::Char Data[]; /// non preflight packet has a patch blob for a **PatchTarget** + Kernel::Char Data[1]; /// non preflight packet has a patch blob for a **PatchTarget** } ATTRIBUTE(packed) BOOTNET_INTERNET_HEADER; diff --git a/dev/kernel/FirmwareKit/CoreBoot/CoreBoot.h b/dev/kernel/FirmwareKit/CoreBoot/CoreBoot.h index f5470877..e1f3fbc6 100644 --- a/dev/kernel/FirmwareKit/CoreBoot/CoreBoot.h +++ b/dev/kernel/FirmwareKit/CoreBoot/CoreBoot.h @@ -24,12 +24,12 @@ namespace Firmware::Detail::CoreBoot const UInt32 fStartAddress; // start address (master/slave(s) thread) #ifdef NE_IS_EXTENDED_COREBOOT - UIntPtr fMasterStructure; // master structure for MP/PM and device tree and such. (ARM) + UIntPtr fMasterStructure; // master structure for MP/PM and device tree and such. (ARM) UIntPtr fMasterStructureVersion; // master structure version. #endif #ifdef NE_IS_MBCI_COREBOOT - UIntPtr fMBCIStructure; // MBCI structure for MBCI (ARM) + UIntPtr fMBCIStructure; // MBCI structure for MBCI (ARM) UIntPtr fMBCIStructureVersion; // MBCI structure version. #endif }; diff --git a/dev/kernel/FirmwareKit/EFI/API.h b/dev/kernel/FirmwareKit/EFI/API.h index 403e017e..f3b03bb5 100644 --- a/dev/kernel/FirmwareKit/EFI/API.h +++ b/dev/kernel/FirmwareKit/EFI/API.h @@ -48,7 +48,7 @@ namespace Boot @brief Exit EFI API to let the OS load correctly. Bascially frees everything we have in the EFI side. */ - inline void ExitBootServices(UInt64 MapKey, EfiHandlePtr ImageHandle) noexcept + inline Void ExitBootServices(UInt64 MapKey, EfiHandlePtr ImageHandle) noexcept { if (!ST) return; @@ -83,7 +83,7 @@ Bascially frees everything we have in the EFI side. } } // namespace Boot -inline void InitEFI(EfiSystemTable* SystemTable) noexcept +inline void fw_init_efi(EfiSystemTable* SystemTable) noexcept { if (!SystemTable) return; diff --git a/dev/kernel/FirmwareKit/EFI/EFI.h b/dev/kernel/FirmwareKit/EFI/EFI.h index 1e6de42c..24f474d1 100644 --- a/dev/kernel/FirmwareKit/EFI/EFI.h +++ b/dev/kernel/FirmwareKit/EFI/EFI.h @@ -21,10 +21,16 @@ using namespace Kernel; #define EFI_API __attribute__((ms_abi)) #endif // ifndef EPI_API +#ifndef EPIAPI +#define EFIAPI __attribute__((ms_abi)) +#endif // ifndef EPIAPI + #define IN #define OUT #define OPTIONAL +#define EFI_STATUS EfiStatusType + #define EFI_FINAL final // Forward decls @@ -285,6 +291,24 @@ typedef struct EfiTableHeader } \ } +#define EFI_SIMPLE_NETWORK_PROTOCOL_GUID \ + { \ + 0xA19832B9, 0xAC25, 0x11D3, \ + { \ + 0x9A, 0x2D, 0x00, 0x90, 0x27, 0x3f, 0xc1, 0x4d \ + } \ + } + +#define EFI_SIMPLE_NETWORK_PROTOCOL_REVISION 0x00010000 + +#define EFI_IP4_PROTOCOL_GUID \ + { \ + 0x41d94cd2, 0x35b6, 0x455a, \ + { \ + 0x82, 0x58, 0xd4, 0xe5, 0x13, 0x34, 0xaa, 0xdd \ + } \ + } + #define EFI_LOADED_IMAGE_PROTOCOL_REVISION 0x1000 #define EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID \ @@ -330,6 +354,91 @@ enum kPixelFormatMax }; +struct EFI_SIMPLE_NETWORK_PROTOCOL; + +typedef EFI_STATUS(EFI_API* EFI_SIMPLE_NETWORK_START)( + IN EFI_SIMPLE_NETWORK_PROTOCOL* This); + +typedef EFI_STATUS(EFI_API* EFI_SIMPLE_NETWORK_STOP)( + IN EFI_SIMPLE_NETWORK_PROTOCOL* This); + +typedef EFI_STATUS(EFI_API* EFI_SIMPLE_NETWORK_INITIALIZE)( + IN EFI_SIMPLE_NETWORK_PROTOCOL* This, + IN UInt32 ExtraRxBufferSize OPTIONAL, + IN UInt32 ExtraTxBufferSize OPTIONAL); + +typedef EFI_STATUS(EFIAPI* EFI_SIMPLE_NETWORK_RESET)( + IN EFI_SIMPLE_NETWORK_PROTOCOL* This, + IN Boolean ExtendedVerification); + +typedef EFI_STATUS(EFIAPI* EFI_SIMPLE_NETWORK_SHUTDOWN)( + IN EFI_SIMPLE_NETWORK_PROTOCOL* This); + +typedef UInt8 EfiMacAddress[32]; + +#define MAX_MCAST_FILTER_CNT 16 + +typedef struct +{ + UInt32 State; + UInt32 HwAddressSize; + UInt32 MediaHeaderSize; + UInt32 MaxPacketSize; + UInt32 NvRamSize; + UInt32 NvRamAccessSize; + UInt32 ReceiveFilterMask; + UInt32 ReceiveFilterSetting; + UInt32 MaxMCastFilterCount; + UInt32 MCastFilterCount; + EfiMacAddress MCastFilter[MAX_MCAST_FILTER_CNT]; + EfiMacAddress CurrentAddress; + EfiMacAddress BroadcastAddress; + EfiMacAddress PermanentAddress; + UInt8 IfType; + BOOL MacAddressChangeable; + BOOL MultipleTxSupported; + BOOL MediaPresentSupported; + BOOL MediaPresent; +} EFI_SIMPLE_NETWORK_MODE; + +typedef EFI_STATUS(EFIAPI* EFI_SIMPLE_NETWORK_TRANSMIT)( + IN EFI_SIMPLE_NETWORK_PROTOCOL* This, + IN UInt32 HeaderSize, + IN UInt32 BufferSize, + IN Void* Buffer, + IN EfiMacAddress* SrcAddr OPTIONAL, + IN EfiMacAddress* DestAddr OPTIONAL, + IN UInt16* Protocol OPTIONAL); + +typedef EFI_STATUS(EFIAPI* EFI_SIMPLE_NETWORK_RECEIVE)( + IN EFI_SIMPLE_NETWORK_PROTOCOL* This, + OUT UInt32* HeaderSize OPTIONAL, + IN OUT UInt32* BufferSize, + OUT Void* Buffer, + OUT EfiMacAddress* SrcAddr OPTIONAL, + OUT EfiMacAddress* DestAddr OPTIONAL, + OUT UInt16* Protocol OPTIONAL); + +typedef struct EFI_SIMPLE_NETWORK_PROTOCOL +{ + UInt64 Revision; + EFI_SIMPLE_NETWORK_START Start; + EFI_SIMPLE_NETWORK_STOP Stop; + EFI_SIMPLE_NETWORK_INITIALIZE Initialize; + EFI_SIMPLE_NETWORK_RESET Reset; + EFI_SIMPLE_NETWORK_SHUTDOWN Shutdown; + VoidPtr ReceiveFilters; + VoidPtr StationAddress; + VoidPtr Statistics; + VoidPtr MCastIpToMac; + VoidPtr NvData; + VoidPtr GetStatus; + EFI_SIMPLE_NETWORK_TRANSMIT Transmit; + EFI_SIMPLE_NETWORK_RECEIVE Receive; + VoidPtr WaitForPacket; + EFI_SIMPLE_NETWORK_MODE* Mode; +} EFI_SIMPLE_NETWORK_PROTOCOL; + typedef struct EfiBitmask { UInt32 RedMask; diff --git a/dev/kernel/FirmwareKit/GPT.h b/dev/kernel/FirmwareKit/GPT.h index c903f3ab..a8b53ead 100644 --- a/dev/kernel/FirmwareKit/GPT.h +++ b/dev/kernel/FirmwareKit/GPT.h @@ -10,7 +10,7 @@ #include <FirmwareKit/EFI/EFI.h> #define kSectorSizeGPT (512U) -#define kPartNameGPT (8U) +#define kPartNameGPT (8U) namespace Kernel { diff --git a/dev/kernel/FirmwareKit/Handover.h b/dev/kernel/FirmwareKit/Handover.h index 22d96ca9..ecdaca64 100644 --- a/dev/kernel/FirmwareKit/Handover.h +++ b/dev/kernel/FirmwareKit/Handover.h @@ -17,6 +17,7 @@ #pragma once +#include "FirmwareKit/EFI/EFI.h" #include <NewKit/Defines.h> #define kHandoverMagic 0xBADCC @@ -70,6 +71,11 @@ namespace Kernel::HEL WideChar f_FirmwareVendorName[32]; SizeT f_FirmwareVendorLen; +#ifdef __NE_AMD64__ + UInt32 f_EFIImageKey; + EfiHandlePtr f_EFIImage; +#endif + VoidPtr f_FirmwareCustomTables[2]; // On EFI 0: BS 1: ST struct diff --git a/dev/kernel/HALKit/AMD64/HalDebugOutput.cc b/dev/kernel/HALKit/AMD64/HalDebugOutput.cc index 0ee7eef0..b69614fd 100644 --- a/dev/kernel/HALKit/AMD64/HalDebugOutput.cc +++ b/dev/kernel/HALKit/AMD64/HalDebugOutput.cc @@ -181,7 +181,7 @@ namespace Kernel TerminalDevice TerminalDevice::The() noexcept { - static TerminalDevice out(Kernel::ke_io_write, Kernel::ke_io_read); + TerminalDevice out(Kernel::ke_io_write, Kernel::ke_io_read); return out; } diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc index cc3c8e93..60df6a12 100644 --- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc +++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc @@ -4,6 +4,7 @@ ------------------------------------------- */ +#include "modules/CoreGfx/CoreGfx.h" #include <StorageKit/AHCI.h> #include <ArchKit/ArchKit.h> #include <KernelKit/ProcessScheduler.h> @@ -13,6 +14,11 @@ #include <NetworkKit/IPC.h> #include <CFKit/Property.h> #include <modules/CoreGfx/TextGfx.h> +#include <KernelKit/Timer.h> + +#include <FirmwareKit/EFI/API.h> +#include <FirmwareKit/EFI/EFI.h> + EXTERN_C Kernel::VoidPtr kInterruptVectorTable[]; EXTERN_C Kernel::VoidPtr mp_user_switch_proc; @@ -27,31 +33,25 @@ STATIC Kernel::Void hal_init_scheduler_team() } } -STATIC Kernel::UInt64 hal_rdtsc_fn() +/// @brief Kernel init procedure. +EXTERN_C Int32 hal_init_platform( + Kernel::HEL::BootInfoHeader* handover_hdr) { - Kernel::UInt32 lo, hi; - __asm__ volatile("rdtsc" - : "=a"(lo), "=d"(hi)); + if (handover_hdr->f_Magic != kHandoverMagic && + handover_hdr->f_Version != kHandoverVersion) + { + return kEfiFail; + } - return ((Kernel::UInt64)hi << 32) | lo; -} + FB::fb_clear_video(); -STATIC Kernel::UInt64 kStartTim, kEndTim; + (Void)(Kernel::kout << "Welcome to NeKernel.\r"); -/// @brief Kernel init procedure. -EXTERN_C void hal_init_platform( - Kernel::HEL::BootInfoHeader* handover_hdr) -{ - kStartTim = hal_rdtsc_fn(); + fw_init_efi((EfiSystemTable*)handover_hdr->f_FirmwareCustomTables[1]); + Boot::ExitBootServices(handover_hdr->f_EFIImageKey, handover_hdr->f_EFIImage); kHandoverHeader = handover_hdr; - if (kHandoverHeader->f_Magic != kHandoverMagic && - kHandoverHeader->f_Version != kHandoverVersion) - { - return; - } - hal_init_scheduler_team(); /************************************** */ @@ -83,35 +83,24 @@ EXTERN_C void hal_init_platform( gdt_reg.Base = reinterpret_cast<Kernel::UIntPtr>(kGDTArray); gdt_reg.Limit = (sizeof(Kernel::HAL::Detail::NE_GDT_ENTRY) * kGDTEntriesCount) - 1; - FB::fb_clear_video(); + Kernel::NeFS::fs_init_nefs(); + + Kernel::HAL::mp_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr); //! GDT will load hal_read_init after it successfully loads the segments. Kernel::HAL::GDTLoader gdt_loader; gdt_loader.Load(gdt_reg); - Kernel::ke_panic(RUNTIME_CHECK_BOOTSTRAP); + return kEfiFail; } EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept { - kEndTim = hal_rdtsc_fn(); - - (void)(Kernel::kout << "Boot Time: " << Kernel::number(kEndTim - kStartTim) << Kernel::kendl); - - Kernel::NeFS::fs_init_nefs(); - - Kernel::HAL::mp_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr); - Kernel::HAL::Register64 idt_reg; - idt_reg.Base = (Kernel::UIntPtr)kInterruptVectorTable; Kernel::HAL::IDTLoader idt_loader; - kEndTim = hal_rdtsc_fn(); - - (void)(Kernel::kout << "Init Time: " << Kernel::number(kEndTim - kStartTim) << Kernel::kendl); - idt_loader.Load(idt_reg); dbg_break_point(); diff --git a/dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc b/dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc index 8bd98923..4b50a3f4 100644 --- a/dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc +++ b/dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc @@ -14,6 +14,7 @@ namespace Kernel::HAL { namespace Detail { + /// @brief Page Table Entry for AMD64. struct PTE { UInt64 Present : 1; @@ -28,7 +29,7 @@ namespace Kernel::HAL UInt64 Ignored1 : 3; // Available to software UInt64 PhysicalAddress : 40; // Physical page frame address (bits 12–51) UInt64 Ignored2 : 7; // More software bits / reserved - UInt64 Protection_key : 4; // Optional (if PKU enabled) + UInt64 ProtectionKey : 4; // Optional (if PKU enabled) UInt64 Reserved : 1; // Usually reserved UInt64 Nx : 1; // No Execute }; @@ -45,6 +46,9 @@ namespace Kernel::HAL (void)(kout << (pte->Nx ? "NX" : "Not NX") << kendl); (void)(kout << (pte->User ? "User" : "Not User") << kendl); (void)(kout << (pte->Pcd ? "Not Cached" : "Cached") << kendl); + (void)(kout << (pte->Accessed ? "Accessed" : "Not Accessed") << kendl); + (void)(kout << hex_number(pte->PhysicalAddress) << kendl); + (void)(kout << (pte->ProtectionKey ? "Protected" : "Not Protected/PKU Disabled") << kendl); } /***********************************************************************************/ @@ -54,31 +58,29 @@ namespace Kernel::HAL /***********************************************************************************/ UIntPtr hal_get_phys_address(VoidPtr virt) { - const UInt64 vaddr = (UInt64)virt; + const UInt64 kVMAddr = (UInt64)virt; const UInt64 kMask9Bits = 0x1FFULL; const UInt64 kPageOffsetMask = 0xFFFULL; UInt64 cr3 = (UInt64)hal_read_cr3() & ~kPageOffsetMask; - hal_invl_tlb(virt); - // Level 4 auto pml4 = reinterpret_cast<UInt64*>(cr3); - UInt64 pml4e = pml4[(vaddr >> 39) & kMask9Bits]; + UInt64 pml4e = pml4[(kVMAddr >> 39) & kMask9Bits]; if (!(pml4e & 1)) return 0; // Level 3 auto pdpt = reinterpret_cast<UInt64*>(pml4e & ~kPageOffsetMask); - UInt64 pdpte = pdpt[(vaddr >> 30) & kMask9Bits]; + UInt64 pdpte = pdpt[(kVMAddr >> 30) & kMask9Bits]; if (!(pdpte & 1)) return 0; // Level 2 auto pd = reinterpret_cast<UInt64*>(pdpte & ~kPageOffsetMask); - UInt64 pde = pd[(vaddr >> 21) & kMask9Bits]; + UInt64 pde = pd[(kVMAddr >> 21) & kMask9Bits]; if (!(pde & 1)) return 0; @@ -86,12 +88,12 @@ namespace Kernel::HAL // 1 GiB page support if (pde & (1 << 7)) { - return (pde & ~((1ULL << 30) - 1)) | (vaddr & ((1ULL << 30) - 1)); + return (pde & ~((1ULL << 30) - 1)) | (kVMAddr & ((1ULL << 30) - 1)); } // Level 1 - auto pt = reinterpret_cast<UInt64*>(pde & ~kPageOffsetMask); - Detail::PTE* pte = (Detail::PTE*)pt[(vaddr >> 12) & kMask9Bits]; + auto pt = reinterpret_cast<UInt64*>(pde & ~kPageOffsetMask); + Detail::PTE* pte = (Detail::PTE*)pt[(kVMAddr >> 12) & kMask9Bits]; if (!pte->Present) return 0; @@ -110,46 +112,44 @@ namespace Kernel::HAL /***********************************************************************************/ EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UInt32 flags) { - const UInt64 vaddr = (UInt64)virtual_address; + const UInt64 kVMAddr = (UInt64)virtual_address; constexpr UInt64 kMask9 = 0x1FF; constexpr UInt64 kPageMask = 0xFFF; UInt64 cr3 = (UIntPtr)hal_read_cr3() & ~kPageMask; auto pml4 = reinterpret_cast<UInt64*>(cr3); - UInt64 pml4e = pml4[(vaddr >> 39) & kMask9]; + UInt64 pml4e = pml4[(kVMAddr >> 39) & kMask9]; if (!(pml4e & 1)) return kErrorInvalidData; - auto pdpt = reinterpret_cast<UInt64*>(pml4e & ~kPageMask); - UInt64 pdpte = pdpt[(vaddr >> 30) & kMask9]; + UInt64* pdpt = reinterpret_cast<UInt64*>(pml4e & ~kPageMask); + UInt64 pdpte = pdpt[(kVMAddr >> 30) & kMask9]; if (!(pdpte & 1)) return kErrorInvalidData; - auto pd = reinterpret_cast<UInt64*>(pdpte & ~kPageMask); - UInt64 pde = pd[(vaddr >> 21) & kMask9]; + UInt64* pd = reinterpret_cast<UInt64*>(pdpte & ~kPageMask); + UInt64 pde = pd[(kVMAddr >> 21) & kMask9]; if (!(pde & 1)) return kErrorInvalidData; UInt64* pt = reinterpret_cast<UInt64*>(pde & ~kPageMask); - Detail::PTE* pte = (Detail::PTE*)pt[(vaddr >> 12) & kMask9]; + Detail::PTE* pte = (Detail::PTE*)pt[(kVMAddr >> 12) & kMask9]; - pte->Present = !!(flags & kMMFlagsPresent); - pte->Wr = !!(flags & kMMFlagsWr); - pte->User = !!(flags & kMMFlagsUser); - pte->Nx = !!(flags & kMMFlagsNX); - pte->Pcd = !(flags & kMMFlagsUncached); + pte->Present = !!(flags & kMMFlagsPresent); + pte->Wr = !!(flags & kMMFlagsWr); + pte->User = !!(flags & kMMFlagsUser); + pte->Nx = !!(flags & kMMFlagsNX); + pte->Pcd = !(flags & kMMFlagsUncached); + pte->PhysicalAddress = (UIntPtr)(physical_address); - if (physical_address) - pte->PhysicalAddress = (UIntPtr)physical_address; + mmi_page_status(pte); hal_invl_tlb(virtual_address); - mmi_page_status(pte); - return kErrorSuccess; } } // namespace Kernel::HAL diff --git a/dev/kernel/HALKit/AMD64/HalSchedulerCorePrimitivesAMD64.cc b/dev/kernel/HALKit/AMD64/HalSchedulerCorePrimitivesAMD64.cc index ba5710e3..edad0e97 100644 --- a/dev/kernel/HALKit/AMD64/HalSchedulerCorePrimitivesAMD64.cc +++ b/dev/kernel/HALKit/AMD64/HalSchedulerCorePrimitivesAMD64.cc @@ -46,7 +46,7 @@ namespace Kernel Void mp_hang_thread(HAL::StackFrame* stack) { NE_UNUSED(stack); - + while (Yes) { /* Nothing to do, code is spinning */ diff --git a/dev/kernel/HALKit/AMD64/HalTimerAMD64.cc b/dev/kernel/HALKit/AMD64/HalTimerAMD64.cc index 01be2be5..72de8eb0 100644 --- a/dev/kernel/HALKit/AMD64/HalTimerAMD64.cc +++ b/dev/kernel/HALKit/AMD64/HalTimerAMD64.cc @@ -45,7 +45,7 @@ namespace Kernel::Detail using namespace Kernel;
-HardwareTimer::HardwareTimer(Int64 ms)
+HardwareTimer::HardwareTimer(UInt64 ms)
: fWaitFor(ms)
{
auto power = PowerFactoryInterface(kHandoverHeader->f_HardwareTables.f_VendorPtr);
diff --git a/dev/kernel/HALKit/AMD64/Paging.h b/dev/kernel/HALKit/AMD64/Paging.h index da90a71a..ea20dece 100644 --- a/dev/kernel/HALKit/AMD64/Paging.h +++ b/dev/kernel/HALKit/AMD64/Paging.h @@ -64,7 +64,6 @@ namespace Kernel::HAL } } // namespace Detail - auto mm_alloc_bitmap(Boolean wr, Boolean user, SizeT size, Bool is_page, SizeT pad = 0) -> VoidPtr; auto mm_free_bitmap(VoidPtr page_ptr) -> Bool; } // namespace Kernel::HAL diff --git a/dev/kernel/HALKit/AMD64/Processor.h b/dev/kernel/HALKit/AMD64/Processor.h index 084bc962..e375a935 100644 --- a/dev/kernel/HALKit/AMD64/Processor.h +++ b/dev/kernel/HALKit/AMD64/Processor.h @@ -68,13 +68,13 @@ namespace Kernel::HAL /// @brief Memory Manager mapping flags. enum { - kMMFlagsInvalid = 1 << 0, - kMMFlagsPresent = 1 << 1, - kMMFlagsWr = 1 << 2, - kMMFlagsUser = 1 << 3, - kMMFlagsNX = 1 << 4, + kMMFlagsInvalid = 1 << 0, + kMMFlagsPresent = 1 << 1, + kMMFlagsWr = 1 << 2, + kMMFlagsUser = 1 << 3, + kMMFlagsNX = 1 << 4, kMMFlagsUncached = 1 << 5, - kMMFlagsCount = 4, + kMMFlagsCount = 4, }; struct PACKED Register64 final diff --git a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc index 728b20ed..2dfd89a1 100644 --- a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc +++ b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc @@ -152,9 +152,9 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz /// check for command header. MUST_PASS(command_header); - command_header->Struc.Cfl = sizeof(FisRegH2D) / sizeof(UInt32); + command_header->Struc.Cfl = sizeof(FisRegH2D) / sizeof(UInt32); command_header->Struc.Write = Write; - command_header->Prdtl = 1; + command_header->Prdtl = 8; auto ctba_phys = ((UInt64)command_header->Ctbau << 32) | command_header->Ctba; auto command_table = reinterpret_cast<volatile HbaCmdTbl*>(ctba_phys); diff --git a/dev/kernel/HALKit/ARM64/Processor.h b/dev/kernel/HALKit/ARM64/Processor.h index f0f09578..b108fc82 100644 --- a/dev/kernel/HALKit/ARM64/Processor.h +++ b/dev/kernel/HALKit/ARM64/Processor.h @@ -28,7 +28,8 @@ namespace Kernel::HAL kMMFlagsWr = 1 << 1, kMMFlagsUser = 1 << 2, kMMFlagsNX = 1 << 3, - kMMFlagsCount = 3, + kMMFlagsUncached = 1 << 4, + kMMFlagsCount = 4, }; /// @brief Set a PTE from pd_base. @@ -38,6 +39,8 @@ namespace Kernel::HAL /// @return Status code of page manip. EXTERN_C Int32 mm_map_page(VoidPtr virtual_address, VoidPtr physical_address, UInt32 flags); + EXTERN_C UIntPtr hal_get_phys_address(VoidPtr virtual_address); + typedef UIntPtr Reg; typedef Register64 Register; diff --git a/dev/kernel/KernelKit/DeviceMgr.h b/dev/kernel/KernelKit/DeviceMgr.h index fcafa7a5..9cfc54dd 100644 --- a/dev/kernel/KernelKit/DeviceMgr.h +++ b/dev/kernel/KernelKit/DeviceMgr.h @@ -52,13 +52,13 @@ namespace Kernel IDeviceObject(const IDeviceObject<T>&) = default; public: - virtual IDeviceObject<T>& operator<<(T Data) + virtual IDeviceObject<T>& operator<<(T Data) { fOut(this, Data); return *this; } - virtual IDeviceObject<T>& operator>>(T Data) + virtual IDeviceObject<T>& operator>>(T Data) { fIn(this, Data); return *this; diff --git a/dev/kernel/KernelKit/FileMgr.h b/dev/kernel/KernelKit/FileMgr.h index b4da6d5b..03e74ee8 100644 --- a/dev/kernel/KernelKit/FileMgr.h +++ b/dev/kernel/KernelKit/FileMgr.h @@ -347,7 +347,7 @@ namespace Kernel const Encoding* restrict_type) : fFile(Class::GetMounted()->Open(path, restrict_type)) { - SizeT kRestrictCount = kRestrictMax; + SizeT kRestrictCount = kRestrictMax; const FileRestrictKind kRestrictList[] = { { .fRestrict = kRestrictR, diff --git a/dev/kernel/KernelKit/ProcessScheduler.h b/dev/kernel/KernelKit/ProcessScheduler.h index db6f9aed..cff2ce6b 100644 --- a/dev/kernel/KernelKit/ProcessScheduler.h +++ b/dev/kernel/KernelKit/ProcessScheduler.h @@ -181,7 +181,7 @@ namespace Kernel AffinityKind Affinity{AffinityKind::kStandard}; ProcessStatusKind Status{ProcessStatusKind::kFinished}; UInt8* StackReserve{nullptr}; - ProcessImage Image{}; + ProcessImage Image{}; SizeT StackSize{kSchedMaxStackSz}; IDylibObject* DylibDelegate{nullptr}; SizeT MemoryCursor{0UL}; @@ -205,9 +205,9 @@ namespace Kernel UIntPtr SignalID; }; - ProcessSignal ProcessSignal; + ProcessSignal ProcessSignal; ProcessMemoryHeapList* ProcessMemoryHeap{nullptr}; - ProcessTeam* ProcessParentTeam; + ProcessTeam* ProcessParentTeam; VoidPtr VMRegister{0UL}; @@ -303,13 +303,13 @@ namespace Kernel Array<Process, kSchedProcessLimitPerTeam>& AsArray(); Ref<Process>& AsRef(); - ProcessID& Id() noexcept; + ProcessID& Id() noexcept; public: Array<Process, kSchedProcessLimitPerTeam> mProcessList; Ref<Process> mCurrentProcess; - ProcessID mTeamId{0}; - ProcessID mProcessCount{0}; + ProcessID mTeamId{0}; + ProcessID mProcessCount{0}; }; typedef Array<Process, kSchedProcessLimitPerTeam> UserThreadArray; @@ -337,8 +337,8 @@ namespace Kernel ProcessTeam& CurrentTeam(); public: - ProcessID Spawn(const Char* name, VoidPtr code, VoidPtr image); - Void Remove(ProcessID process_id); + ProcessID Spawn(const Char* name, VoidPtr code, VoidPtr image); + Void Remove(ProcessID process_id); Bool IsUser() override; Bool IsKernel() override; diff --git a/dev/kernel/KernelKit/Timer.h b/dev/kernel/KernelKit/Timer.h index 6c9195aa..b6d23e6b 100644 --- a/dev/kernel/KernelKit/Timer.h +++ b/dev/kernel/KernelKit/Timer.h @@ -44,13 +44,13 @@ namespace Kernel private: UIntPtr* fDigitalTimer{nullptr}; - Int64 fWaitFor{0}; + Int64 fWaitFor{0}; }; class HardwareTimer final : public TimerInterface { public: - explicit HardwareTimer(Int64 seconds); + explicit HardwareTimer(UInt64 seconds); ~HardwareTimer() override; public: @@ -61,7 +61,7 @@ namespace Kernel private: UIntPtr* fDigitalTimer{nullptr}; - Int64 fWaitFor{0}; + Int64 fWaitFor{0}; }; inline Int64 rtl_ms(Int64 time) diff --git a/dev/kernel/NetworkKit/MAC.h b/dev/kernel/NetworkKit/MAC.h index 55e444dc..0509fed4 100644 --- a/dev/kernel/NetworkKit/MAC.h +++ b/dev/kernel/NetworkKit/MAC.h @@ -10,7 +10,7 @@ #include <NewKit/Defines.h> #include <NewKit/KString.h> -#define kMACAddrLen (12) +#define kMACAddrLen (32) namespace Kernel { @@ -27,10 +27,10 @@ namespace Kernel NE_COPY_DEFAULT(MacAddressGetter) public: - Array<WideChar, kMACAddrLen>& AsBytes(); + Array<UInt8, kMACAddrLen>& AsBytes(); private: - Array<WideChar, kMACAddrLen> fMacAddress; + Array<UInt8, kMACAddrLen> fMacAddress; }; } // namespace Kernel diff --git a/dev/kernel/NewKit/KernelPanic.h b/dev/kernel/NewKit/KernelPanic.h index 60a6519c..d630e6b4 100644 --- a/dev/kernel/NewKit/KernelPanic.h +++ b/dev/kernel/NewKit/KernelPanic.h @@ -33,7 +33,7 @@ namespace Kernel #undef __MUST_PASS #endif -#define __MUST_PASS(EXPR, FILE, LINE) Kernel::ke_runtime_check(EXPR, FILE, STRINGIFY(LINE)) +#define __MUST_PASS(EXPR, FILE, LINE) Kernel::ke_runtime_check(EXPR, FILE, STRINGIFY(LINE)) #ifdef __DEBUG__ #define MUST_PASS(EXPR) __MUST_PASS((EXPR), __FILE__, __LINE__) diff --git a/dev/kernel/amd64-ci.make b/dev/kernel/amd64-ci.make index 9e881123..e9a4d4b0 100644 --- a/dev/kernel/amd64-ci.make +++ b/dev/kernel/amd64-ci.make @@ -5,7 +5,7 @@ CXX = x86_64-w64-mingw32-g++ LD = x86_64-w64-mingw32-ld -CCFLAGS = -fshort-wchar -c -D__NE_AMD64__ -Werror -Wall -Wpedantic -Wextra -mno-red-zone -fno-rtti -fno-exceptions -std=c++20 -D__NE_SUPPORT_NX__ -O0 -I../Vendor -D__FSKIT_INCLUDES_NEFS__ -D__NEOSKRNL__ -D__HAVE_NE_APIS__ -D__FREESTANDING__ -D__NE_VIRTUAL_MEMORY_SUPPORT__ -D__NE_AUTO_FORMAT__ -D__NE__ -I./ -I../ -I../zba +CCFLAGS = -fshort-wchar -c -D__NE_AMD64__ -Werror -Wall -Wpedantic -Wextra -mno-red-zone -fno-rtti -fno-exceptions -std=c++20 -D__NE_SUPPORT_NX__ -O0 -I../vendor -D__FSKIT_INCLUDES_NEFS__ -D__NEOSKRNL__ -D__HAVE_NE_APIS__ -D__FREESTANDING__ -D__NE_VIRTUAL_MEMORY_SUPPORT__ -D__NE_AUTO_FORMAT__ -D__NE__ -I./ -I../ -I../boot ASM = nasm diff --git a/dev/kernel/amd64-desktop.make b/dev/kernel/amd64-desktop.make index 905a6c91..02b0a3b4 100644 --- a/dev/kernel/amd64-desktop.make +++ b/dev/kernel/amd64-desktop.make @@ -5,7 +5,7 @@ CXX = x86_64-w64-mingw32-g++ LD = x86_64-w64-mingw32-ld -CCFLAGS = -fshort-wchar -c -D__NE_AMD64__ -Wall -Wpedantic -Wextra -mno-red-zone -fno-rtti -fno-exceptions -std=c++20 -D__NE_SUPPORT_NX__ -O0 -I../Vendor -D__FSKIT_INCLUDES_NEFS__ -D__NEOSKRNL__ -D__HAVE_NE_APIS__ -D__FREESTANDING__ -D__NE_VIRTUAL_MEMORY_SUPPORT__ -D__NE_AUTO_FORMAT__ -D__NE__ -I./ -I../ -I../zba +CCFLAGS = -fshort-wchar -c -D__NE_AMD64__ -Wall -Wpedantic -Wextra -mno-red-zone -fno-rtti -fno-exceptions -std=c++20 -D__NE_SUPPORT_NX__ -O0 -I../vendor -D__FSKIT_INCLUDES_NEFS__ -D__NEOSKRNL__ -D__HAVE_NE_APIS__ -D__FREESTANDING__ -D__NE_VIRTUAL_MEMORY_SUPPORT__ -D__NE_AUTO_FORMAT__ -D__NE__ -I./ -I../ -I../boot ASM = nasm @@ -33,7 +33,7 @@ COPY = cp ASMFLAGS = -f win64 # Kernel subsystem is 17 and entrypoint is hal_init_platform -LDFLAGS = -e hal_init_platform --subsystem=17 --image-base 0x4000000 +LDFLAGS = -e hal_init_platform --subsystem=17 --image-base 0x10000000 LDOBJ = obj/*.obj # This file is the Kernel, responsible of task, memory, driver, sci, disk and device management. diff --git a/dev/kernel/src/FS/NeFS.cc b/dev/kernel/src/FS/NeFS.cc index 369e1eca..8bbec1d2 100644 --- a/dev/kernel/src/FS/NeFS.cc +++ b/dev/kernel/src/FS/NeFS.cc @@ -145,7 +145,7 @@ _Output BOOL NeFileSystemParser::CreateFork(_Input NEFS_FORK_STRUCT& the_fork) /// log what we have now. (void)(kout << "Fork offset is at: " << hex_number(the_fork.DataOffset) - << kendl); + << kendl); (void)(kout << "Wrote fork metadata at: " << hex_number(lba) << kendl); @@ -735,7 +735,7 @@ _Output NEFS_CATALOG_STRUCT* NeFileSystemParser::FindCatalog(_Input const Char* drive.fInput(drive.fPacket); - auto start_catalog_lba = kNeFSCatalogStartAddress; + auto start_catalog_lba = kNeFSCatalogStartAddress; if (!KStringBuilder::Equals(catalog_name, NeFileSystemHelper::Root()) && local_search) { @@ -966,7 +966,7 @@ VoidPtr NeFileSystemParser::ReadCatalog(_Input _Output NEFS_CATALOG_STRUCT* cata NE_UNUSED(dataSz); - Lba dataForkLba = (!is_rsrc_fork) ? catalog->DataFork : catalog->ResourceFork; + Lba dataForkLba = (!is_rsrc_fork) ? catalog->DataFork : catalog->ResourceFork; NEFS_FORK_STRUCT* fs_buf = new NEFS_FORK_STRUCT(); auto& drive = kMountpoint.A(); @@ -1030,7 +1030,7 @@ bool NeFileSystemParser::Seek(_Input _Output NEFS_CATALOG_STRUCT* catalog, SizeT SizeT NeFileSystemParser::Tell(_Input _Output NEFS_CATALOG_STRUCT* catalog) { NE_UNUSED(catalog); - + err_global_get() = kErrorUnimplemented; return 0; } diff --git a/dev/kernel/src/GUIDWizard.cc b/dev/kernel/src/GUIDWizard.cc index 4aab3b76..b14f637f 100644 --- a/dev/kernel/src/GUIDWizard.cc +++ b/dev/kernel/src/GUIDWizard.cc @@ -26,9 +26,9 @@ namespace CF::XRN::Version1 Ref<GUIDSequence*> seq_ref{seq}; - seq_ref.Leak()->fUuid.fMs1 = uuidSeq[0]; - seq_ref.Leak()->fUuid.fMs2 = uuidSeq[1]; - seq_ref.Leak()->fUuid.fMs3 = uuidSeq[2]; + seq_ref.Leak()->fUuid.fMs1 = uuidSeq[0]; + seq_ref.Leak()->fUuid.fMs2 = uuidSeq[1]; + seq_ref.Leak()->fUuid.fMs3 = uuidSeq[2]; seq_ref.Leak()->fUuid.fMs4[0] = uuidSeq[3]; seq_ref.Leak()->fUuid.fMs4[1] = uuidSeq[4]; seq_ref.Leak()->fUuid.fMs4[2] = uuidSeq[5]; diff --git a/dev/kernel/src/Network/IPCMsg.cc b/dev/kernel/src/Network/IPCMsg.cc index 0f3e61e5..ceb0ae98 100644 --- a/dev/kernel/src/Network/IPCMsg.cc +++ b/dev/kernel/src/Network/IPCMsg.cc @@ -90,11 +90,11 @@ namespace Kernel (*pckt_in)->IpcEndianess = static_cast<UInt8>(endianess); (*pckt_in)->IpcPacketSize = sizeof(IPC_MSG); - (*pckt_in)->IpcTo.UserProcessID = 0; - (*pckt_in)->IpcTo.ProcessTeam = 0; + (*pckt_in)->IpcTo.UserProcessID = 0; + (*pckt_in)->IpcTo.ProcessTeam = 0; - (*pckt_in)->IpcFrom.UserProcessID = 0; - (*pckt_in)->IpcFrom.ProcessTeam = 0; + (*pckt_in)->IpcFrom.UserProcessID = 0; + (*pckt_in)->IpcFrom.ProcessTeam = 0; return Yes; } diff --git a/dev/kernel/src/Network/MACAddressGetter.cc b/dev/kernel/src/Network/MACAddressGetter.cc index b6659298..192dbc70 100644 --- a/dev/kernel/src/Network/MACAddressGetter.cc +++ b/dev/kernel/src/Network/MACAddressGetter.cc @@ -8,7 +8,7 @@ namespace Kernel { - Array<WideChar, kMACAddrLen>& MacAddressGetter::AsBytes() + Array<UInt8, kMACAddrLen>& MacAddressGetter::AsBytes() { return this->fMacAddress; } diff --git a/dev/kernel/src/UserProcessScheduler.cc b/dev/kernel/src/UserProcessScheduler.cc index 5f627dd5..b2052723 100644 --- a/dev/kernel/src/UserProcessScheduler.cc +++ b/dev/kernel/src/UserProcessScheduler.cc @@ -133,14 +133,14 @@ namespace Kernel } else { - ProcessMemoryHeapList* entry = this->ProcessMemoryHeap; + ProcessMemoryHeapList* entry = this->ProcessMemoryHeap; while (entry) { if (entry->MemoryEntry == nullptr) break; // chose to break here, when we get an already allocated memory entry for our needs. - entry = entry->MemoryNext; + entry = entry->MemoryNext; } entry->MemoryNext = new ProcessMemoryHeapList(); |
