diff options
| -rw-r--r-- | dev/boot/src/BootThread.cc | 21 | ||||
| -rw-r--r-- | dev/boot/src/HEL/AMD64/BootEFI.cc | 7 | ||||
| -rw-r--r-- | dev/kernel/FirmwareKit/GPT.h | 4 | ||||
| -rw-r--r-- | dev/kernel/FirmwareKit/Handover.h | 7 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc | 2 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc | 2 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalKernelMain.cc | 14 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/Processor.h | 2 |
8 files changed, 38 insertions, 21 deletions
diff --git a/dev/boot/src/BootThread.cc b/dev/boot/src/BootThread.cc index f1866a76..484c242d 100644 --- a/dev/boot/src/BootThread.cc +++ b/dev/boot/src/BootThread.cc @@ -80,6 +80,12 @@ namespace Boot fStack = new UInt8[mib_cast(16)]; + if (!fStack) + { + writer.Write("BootZ: Unable to allocate stack.\r"); + return; + } + LDR_SECTION_HEADER_PTR sectPtr = (LDR_SECTION_HEADER_PTR)(((Char*)opt_header_ptr) + header_ptr->SizeOfOptionalHeader); constexpr auto sectionForCode = ".text"; @@ -168,6 +174,21 @@ namespace Boot { fHandover = handover; + if (!fStartAddress) + { + return kEfiFail; + } + + if (!fHandover) + { + return kEfiFail; + } + + BootTextWriter writer; + + writer.Write("BootZ: Starting: ").Write(fBlobName).Write("\r"); + writer.Write("BootZ: Handover address: ").Write((UIntPtr)fHandover).Write("\r"); + if (own_stack) { return rt_jump_to_address(fStartAddress, fHandover, &fStack[mib_cast(16) - 1]); diff --git a/dev/boot/src/HEL/AMD64/BootEFI.cc b/dev/boot/src/HEL/AMD64/BootEFI.cc index 2ee662f3..58f04491 100644 --- a/dev/boot/src/HEL/AMD64/BootEFI.cc +++ b/dev/boot/src/HEL/AMD64/BootEFI.cc @@ -226,8 +226,8 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle, handover_hdr->f_Magic = kHandoverMagic; handover_hdr->f_Version = kHandoverVersion; - handover_hdr->f_EFIImageKey = map_key; - handover_hdr->f_EFIImage = image_handle; + handover_hdr->f_HardwareTables.f_ImageKey = map_key; + handover_hdr->f_HardwareTables.f_ImageHandle = image_handle; // Provide fimware vendor name. @@ -245,6 +245,7 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle, /// access attributes (in order) /// EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS UInt32 attr = 0x00000001 | 0x00000002 | 0x00000004; + ST->RuntimeServices->SetVariable(L"/props/boot_path", kEfiGlobalNamespaceVarGUID, &attr, &kernel_path_sz, kernel_path); } @@ -281,7 +282,7 @@ EFI_EXTERN_C EFI_API Int32 BootloaderMain(EfiHandlePtr image_handle, auto kernel_thread = Boot::BootThread(reader_kernel.Blob()); - kernel_thread.SetName("BootZ: Kernel"); + kernel_thread.SetName("BootZ: NeKernel"); handover_hdr->f_KernelImage = reader_kernel.Blob(); handover_hdr->f_KernelSz = reader_kernel.Size(); diff --git a/dev/kernel/FirmwareKit/GPT.h b/dev/kernel/FirmwareKit/GPT.h index 9a6cffc6..0515af8a 100644 --- a/dev/kernel/FirmwareKit/GPT.h +++ b/dev/kernel/FirmwareKit/GPT.h @@ -9,7 +9,7 @@ #include <NewKit/Defines.h> #include <FirmwareKit/EFI/EFI.h> -#define kSectorAlignGPT_Part (420U) +#define kSectorAlignGPT_PartTbl (420U) #define kSectorAlignGPT_PartEntry (72U) #define kPartNameGPT (8U) @@ -44,7 +44,7 @@ namespace Kernel UInt32 NumPartitionEntries; UInt32 SizeOfEntries; UInt32 CRC32PartEntry; - UInt8 Reserved2[kSectorAlignGPT_Part]; + UInt8 Reserved2[kSectorAlignGPT_PartTbl]; }; struct PACKED GPT_PARTITION_ENTRY diff --git a/dev/kernel/FirmwareKit/Handover.h b/dev/kernel/FirmwareKit/Handover.h index dd529a9e..4ff04e6d 100644 --- a/dev/kernel/FirmwareKit/Handover.h +++ b/dev/kernel/FirmwareKit/Handover.h @@ -71,11 +71,6 @@ 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 @@ -84,6 +79,8 @@ namespace Kernel::HEL VoidPtr f_VendorPtr; VoidPtr f_MpPtr; Bool f_MultiProcessingEnabled; + UInt32 f_ImageKey; + EfiHandlePtr f_ImageHandle; } f_HardwareTables; struct diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc index 94c1ae73..3b98e9e8 100644 --- a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc +++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc @@ -191,7 +191,7 @@ namespace Kernel::HAL /// @brief Fetch and enable SMP scheduler. /// @param vendor_ptr SMP containing structure. /***********************************************************************************/ - Void mp_get_cores(VoidPtr vendor_ptr) noexcept + Void mp_init_cores(VoidPtr vendor_ptr) noexcept { if (!vendor_ptr) return; diff --git a/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc b/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc index ddfc49b6..c0c7dfcf 100644 --- a/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc +++ b/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc @@ -109,8 +109,6 @@ namespace Kernel::HAL hal_load_idt(idt); - NeFS::fs_init_nefs(); - Detail::hal_enable_pit(kPITTickForScheduler); rt_sti(); diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc index 60df6a12..b716279d 100644 --- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc +++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc @@ -43,14 +43,14 @@ EXTERN_C Int32 hal_init_platform( return kEfiFail; } + kHandoverHeader = handover_hdr; + FB::fb_clear_video(); (Void)(Kernel::kout << "Welcome to NeKernel.\r"); fw_init_efi((EfiSystemTable*)handover_hdr->f_FirmwareCustomTables[1]); - Boot::ExitBootServices(handover_hdr->f_EFIImageKey, handover_hdr->f_EFIImage); - - kHandoverHeader = handover_hdr; + Boot::ExitBootServices(handover_hdr->f_HardwareTables.f_ImageKey, handover_hdr->f_HardwareTables.f_ImageHandle); hal_init_scheduler_team(); @@ -83,10 +83,6 @@ EXTERN_C Int32 hal_init_platform( gdt_reg.Base = reinterpret_cast<Kernel::UIntPtr>(kGDTArray); gdt_reg.Limit = (sizeof(Kernel::HAL::Detail::NE_GDT_ENTRY) * kGDTEntriesCount) - 1; - 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); @@ -96,6 +92,10 @@ EXTERN_C Int32 hal_init_platform( EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept { + Kernel::NeFS::fs_init_nefs(); + + Kernel::HAL::mp_init_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr); + Kernel::HAL::Register64 idt_reg; idt_reg.Base = (Kernel::UIntPtr)kInterruptVectorTable; diff --git a/dev/kernel/HALKit/AMD64/Processor.h b/dev/kernel/HALKit/AMD64/Processor.h index a5bc82c7..b813e1d9 100644 --- a/dev/kernel/HALKit/AMD64/Processor.h +++ b/dev/kernel/HALKit/AMD64/Processor.h @@ -181,7 +181,7 @@ namespace Kernel::HAL /// @brief Fetch and enable SMP scheduler. /// @param vendor_ptr SMP containing structure. /***********************************************************************************/ - Void mp_get_cores(VoidPtr vendor_ptr) noexcept; + Void mp_init_cores(VoidPtr vendor_ptr) noexcept; /***********************************************************************************/ /// @brief Do a cpuid to check if MSR exists on CPU. |
