diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-10-14 10:08:11 +0200 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-10-14 10:08:11 +0200 |
| commit | 5d09dd3d4cb414fa0ab86bc05c743fb224121287 (patch) | |
| tree | 27155489835cd3c3a8312d6a3d928d528b7c023a | |
| parent | 7ad3739afdfaa2466723467f5ef2526f171c87c3 (diff) | |
IMP: Fixed the PIC remapping side of the initiliazion on PC
distributions.
- Need to fix the scheduler interrupt now.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
| -rw-r--r-- | dev/zba/amd64-efi.make | 2 | ||||
| -rw-r--r-- | dev/zka/HALKit/AMD64/HalCommonAPI.asm | 0 | ||||
| -rw-r--r-- | dev/zka/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx | 6 | ||||
| -rw-r--r-- | dev/zka/HALKit/AMD64/HalCoreMPScheduler.cxx | 4 | ||||
| -rw-r--r-- | dev/zka/HALKit/AMD64/HalDescriptorLoader.cxx | 77 | ||||
| -rw-r--r-- | dev/zka/HALKit/AMD64/HalInterruptAPI.asm | 97 | ||||
| -rw-r--r-- | dev/zka/HALKit/AMD64/HalKernelMain.cxx | 2 | ||||
| -rw-r--r-- | dev/zka/HALKit/AMD64/HalMPContextSwitch.asm | 13 | ||||
| -rw-r--r-- | dev/zka/HALKit/AMD64/Processor.hxx | 2 | ||||
| -rw-r--r-- | dev/zka/KernelKit/UserProcessScheduler.hxx | 2 | ||||
| -rw-r--r-- | dev/zka/src/Stop.cxx | 9 | ||||
| -rw-r--r-- | dev/zka/src/UserProcessScheduler.cxx | 6 |
12 files changed, 132 insertions, 88 deletions
diff --git a/dev/zba/amd64-efi.make b/dev/zba/amd64-efi.make index ae019d74..7bf3ceaa 100644 --- a/dev/zba/amd64-efi.make +++ b/dev/zba/amd64-efi.make @@ -36,7 +36,7 @@ EMU_FLAGS=-net none -smp 4 -m 8G -M q35 \ file=fat:rw:src/Root/,index=2,format=raw \ -drive id=disk_2,file=$(IMG_2),if=none \ -device ahci,id=ahci \ - -device ide-hd,drive=disk_2,bus=ahci.0 -d int -no-shutdown -no-reboot + -device ide-hd,drive=disk_2,bus=ahci.0 -no-shutdown -no-reboot -serial stdio LD_FLAGS=-e Main --subsystem=10 diff --git a/dev/zka/HALKit/AMD64/HalCommonAPI.asm b/dev/zka/HALKit/AMD64/HalCommonAPI.asm new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/dev/zka/HALKit/AMD64/HalCommonAPI.asm diff --git a/dev/zka/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx b/dev/zka/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx index 1167e861..e087fbb6 100644 --- a/dev/zka/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx +++ b/dev/zka/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx @@ -24,9 +24,6 @@ EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) } Kernel::UserProcessScheduler::The().CurrentProcess().Leak().Crash(); - - Kernel::UserProcessHelper::StartScheduling(); - Kernel::ke_stop(RUNTIME_CHECK_PROCESS); } /// @brief Handle page fault. @@ -39,9 +36,6 @@ EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) } Kernel::UserProcessScheduler::The().CurrentProcess().Leak().Crash(); - - Kernel::UserProcessHelper::StartScheduling(); - Kernel::ke_stop(RUNTIME_CHECK_PROCESS); } /// @brief Handle scheduler interrupt. diff --git a/dev/zka/HALKit/AMD64/HalCoreMPScheduler.cxx b/dev/zka/HALKit/AMD64/HalCoreMPScheduler.cxx index 44f1f60a..42305218 100644 --- a/dev/zka/HALKit/AMD64/HalCoreMPScheduler.cxx +++ b/dev/zka/HALKit/AMD64/HalCoreMPScheduler.cxx @@ -221,9 +221,7 @@ namespace Kernel::HAL kSMPAware = true; - const auto cStartIPI = 0x34; - - /// TODO: Notify AP core that it must start. + /// TODO: Notify Boot AP that it must start. } } } // namespace Kernel::HAL diff --git a/dev/zka/HALKit/AMD64/HalDescriptorLoader.cxx b/dev/zka/HALKit/AMD64/HalDescriptorLoader.cxx index bc06d01a..599b490e 100644 --- a/dev/zka/HALKit/AMD64/HalDescriptorLoader.cxx +++ b/dev/zka/HALKit/AMD64/HalDescriptorLoader.cxx @@ -14,34 +14,53 @@ namespace Kernel::HAL STATIC ::Kernel::Detail::AMD64::InterruptDescriptorAMD64 kInterruptVectorTable[kKernelIdtSize]; - STATIC Void hal_remap_intel_pic_ctrl(Void) noexcept + STATIC Void hal_enable_pit(UInt16 ticks) noexcept { - uint8_t a1_saved = In8(kPICData); - uint8_t a2_saved = In8(kPIC2Data); - - Out8(kPICCommand, 0x11); // Start initialization - Out8(kPICData, 0x20); // Master PIC offset - Out8(kPICData, 0x04); // Tell master PIC there is a slave - Out8(kPICData, 0x01); // 8086 mode + // Configure PIT to receieve scheduler interrupts. - Out8(kPIC2Command, 0x11); // Start initialization - Out8(kPIC2Data, 0x28); // Slave PIC offset - Out8(kPIC2Data, 0x02); // Tell slave PIC its cascade - Out8(kPIC2Data, 0x01); // 8086 mode + UInt16 cCommonDivisor = kPITFrequency / ticks; // 100 Hz. - Out8(kPICData, a1_saved); // Restore saved masks - Out8(kPIC2Data, a2_saved); + HAL::Out8(kPITControlPort, 0x36); // Command to PIT + HAL::Out8(kPITChannel0Port, cCommonDivisor & 0xFF); // Send low byte + HAL::Out8(kPITChannel0Port, (cCommonDivisor >> 8) & 0xFF); // Send high byte } - STATIC Void hal_enable_pit() noexcept + STATIC void hal_set_irq_mask(UInt8 irql) { - // Configure PIT to receieve scheduler interrupts. - - UInt32 cCommonDivisor = kPITFrequency / 100; // 100 Hz. + UInt16 port; + UInt8 value; + + if (irql < 8) + { + port = kPICData; + } + else + { + port = kPIC2Data; + irql -= 8; + } + + value = In8(port) | (1 << irql); + Out8(port, value); + } - HAL::Out8(kPITControlPort, 0x36); // Command to PIT - HAL::Out8(kPITChannel0Port, cCommonDivisor & 0xFF); // Send low byte - HAL::Out8(kPITControlPort, (cCommonDivisor >> 8) & 0xFF); // Send high byte + STATIC void hal_clear_irq_mask(UInt8 irql) + { + UInt16 port; + UInt8 value; + + if (irql < 8) + { + port = kPICData; + } + else + { + port = kPIC2Data; + irql -= 8; + } + + value = In8(port) & ~(1 << irql); + Out8(port, value); } } // namespace Detail @@ -55,12 +74,13 @@ namespace Kernel::HAL Void IDTLoader::Load(Register64& idt) { - Detail::hal_remap_intel_pic_ctrl(); - Detail::hal_enable_pit(); + rt_cli(); + + const auto cPITTickForScheduler = 1000; volatile ::Kernel::UIntPtr** ptr_ivt = (volatile ::Kernel::UIntPtr**)idt.Base; - for (UInt16 idt_indx = 0; idt_indx < (kKernelIdtSize); ++idt_indx) + for (UInt16 idt_indx = 0; idt_indx < kKernelIdtSize; ++idt_indx) { Detail::kInterruptVectorTable[idt_indx].Selector = kIDTSelector; Detail::kInterruptVectorTable[idt_indx].Ist = 0; @@ -70,14 +90,19 @@ namespace Kernel::HAL Detail::kInterruptVectorTable[idt_indx].OffsetHigh = (((UIntPtr)ptr_ivt[idt_indx] >> 32) & 0xFFFFFFFF); - Detail::kInterruptVectorTable[idt_indx].Zero = 0x0; + Detail::kInterruptVectorTable[idt_indx].Zero = 0; } - idt.Base = (UIntPtr)&Detail::kInterruptVectorTable; + idt.Base = (UIntPtr)&Detail::kInterruptVectorTable[0]; idt.Limit = sizeof(::Kernel::Detail::AMD64::InterruptDescriptorAMD64) * (kKernelIdtSize)-1; hal_load_idt(idt); + + Detail::hal_enable_pit(cPITTickForScheduler); + Detail::hal_clear_irq_mask(32); + + rt_sti(); } void GDTLoader::Load(Ref<RegisterGDT>& gdt) diff --git a/dev/zka/HALKit/AMD64/HalInterruptAPI.asm b/dev/zka/HALKit/AMD64/HalInterruptAPI.asm index d9e16f6c..557a0a50 100644 --- a/dev/zka/HALKit/AMD64/HalInterruptAPI.asm +++ b/dev/zka/HALKit/AMD64/HalInterruptAPI.asm @@ -16,14 +16,16 @@ %macro IntExp 1 global __ZKA_INT_%1 __ZKA_INT_%1: - cld + cli + sti o64 iret %endmacro %macro IntNormal 1 global __ZKA_INT_%1 __ZKA_INT_%1: - cld + cli + sti o64 iret %endmacro @@ -52,7 +54,10 @@ IntNormal 5 ;; Invalid opcode interrupt __ZKA_INT_6: - cld + cli + + mov al, 0x20 + out 0x20, al push rax @@ -61,14 +66,17 @@ __ZKA_INT_6: pop rax - std + sti o64 iret IntNormal 7 ;; Invalid opcode interrupt __ZKA_INT_8: - cld + cli + + mov al, 0x20 + out 0x21, al push rax @@ -77,7 +85,7 @@ __ZKA_INT_8: pop rax - std + sti o64 iret IntNormal 9 @@ -87,7 +95,10 @@ IntExp 11 IntExp 12 __ZKA_INT_13: - cld + cli + + mov al, 0x20 + out 0x21, al push rax @@ -96,11 +107,14 @@ __ZKA_INT_13: pop rax - std + sti o64 iret __ZKA_INT_14: - cld + cli + + mov al, 0x20 + out 0x21, al push rax @@ -109,7 +123,8 @@ __ZKA_INT_14: pop rax - std + sti + o64 iret IntNormal 15 @@ -135,16 +150,21 @@ IntNormal 31 [extern idt_handle_scheduler] __ZKA_INT_32: - cli + mov al, 0x20 + out 0x21, al + push rbp push rsp - + push rcx + push rdx + push r8 jmp idt_handle_scheduler - - add rsp, 16 pop rsp + pop rbp + pop rcx + pop rdx + pop r8 - sti o64 iret IntNormal 33 @@ -172,7 +192,8 @@ IntNormal 49 [extern hal_kernel_call_enter] __ZKA_INT_50: - cld + mov al, 0x20 + out 0x21, al push r8 push r9 @@ -187,27 +208,25 @@ __ZKA_INT_50: pop r9 pop r8 - std o64 iret __ZKA_INT_51: - cld + mov al, 0x20 + out 0x21, al - push rcx - push rdx push r8 push r9 - push rax + push r10 + push rsp call hal_kernel_call_enter - pop rax + add rsp, 16 + pop rsp + pop r10 pop r9 pop r8 - pop rdx - pop rcx - std o64 iret IntNormal 52 @@ -306,9 +325,33 @@ mp_system_call_handler: o64 sysret hal_load_idt: - cld lidt [rcx] - std + + ; Master PIC initialization + mov al, 0x11 ; Start initialization in cascade mode + out 0x20, al ; Send initialization command to Master PIC + out 0xA0, al ; Send initialization command to Slave PIC + + ; Remap the PIC to use vectors 32-39 for Master and 40-47 for Slave + mov al, 0x20 ; Set Master PIC offset to 32 + out 0x21, al ; Send offset to Master PIC + + mov al, 0x28 ; Set Slave PIC offset to 40 + out 0xA1, al ; Send offset to Slave PIC + + ; Configure Master PIC to inform Slave PIC at IRQ2 + mov al, 0x04 ; Tell Master PIC there is a Slave PIC at IRQ2 + out 0x21, al + + ; Configure Slave PIC identity + mov al, 0x02 ; Tell Slave PIC its cascade identity + out 0xA1, al + + ; Set both PICs to 8086 mode + mov al, 0x01 ; 8086 mode + out 0x21, al + out 0xA1, al + ret section .data diff --git a/dev/zka/HALKit/AMD64/HalKernelMain.cxx b/dev/zka/HALKit/AMD64/HalKernelMain.cxx index ad32ada6..9b0e2713 100644 --- a/dev/zka/HALKit/AMD64/HalKernelMain.cxx +++ b/dev/zka/HALKit/AMD64/HalKernelMain.cxx @@ -95,7 +95,7 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept Kernel::NeFileSystemMgr* mgr = Kernel::mm_new_class<Kernel::NeFileSystemMgr>(); Kernel::NeFileSystemMgr::Mount(mgr); - Kernel::UserProcessHelper::InitializeScheduling(); + Kernel::UserProcessHelper::InitializeScheduler(); Kernel::ke_stop(RUNTIME_CHECK_BOOTSTRAP); } diff --git a/dev/zka/HALKit/AMD64/HalMPContextSwitch.asm b/dev/zka/HALKit/AMD64/HalMPContextSwitch.asm index 2ad38107..47524090 100644 --- a/dev/zka/HALKit/AMD64/HalMPContextSwitch.asm +++ b/dev/zka/HALKit/AMD64/HalMPContextSwitch.asm @@ -40,16 +40,3 @@ mp_do_task_switch: push rax o64 iret - -section .bss - -mp_user_switch_proc_stack_begin: - resb 4*4096 -mp_user_switch_proc_stack_end: - -section .text - -mp_user_switch_proc: - nop - jmp $ -mp_user_switch_proc_end: diff --git a/dev/zka/HALKit/AMD64/Processor.hxx b/dev/zka/HALKit/AMD64/Processor.hxx index f01c73ab..1bc14e7f 100644 --- a/dev/zka/HALKit/AMD64/Processor.hxx +++ b/dev/zka/HALKit/AMD64/Processor.hxx @@ -44,7 +44,7 @@ EXTERN_C #define IsActiveLow(FLG) (FLG & 2) #define IsLevelTriggered(FLG) (FLG & 8) -#define kInterruptGate (0x0E) +#define kInterruptGate (0x8E) #define kTrapGate (0xEF) #define kTaskGate (0b10001100) #define kIDTSelector (0x08) diff --git a/dev/zka/KernelKit/UserProcessScheduler.hxx b/dev/zka/KernelKit/UserProcessScheduler.hxx index 84d674cc..3b67ba71 100644 --- a/dev/zka/KernelKit/UserProcessScheduler.hxx +++ b/dev/zka/KernelKit/UserProcessScheduler.hxx @@ -304,7 +304,7 @@ namespace Kernel STATIC bool CanBeScheduled(const UserProcess& process); STATIC PID& TheCurrentPID(); STATIC SizeT StartScheduling(); - STATIC Bool InitializeScheduling(); + STATIC Bool InitializeScheduler(); }; const UInt32& sched_get_exit_code(void) noexcept; diff --git a/dev/zka/src/Stop.cxx b/dev/zka/src/Stop.cxx index 9c25f374..646d3121 100644 --- a/dev/zka/src/Stop.cxx +++ b/dev/zka/src/Stop.cxx @@ -48,17 +48,15 @@ namespace Kernel { case RUNTIME_CHECK_PROCESS: { CGDrawString("0x00000008 Scheduler error.", start_y, x, panic_text); - break; } case RUNTIME_CHECK_ACPI: { CGDrawString("0x00000006 ACPI configuration error.", start_y, x, panic_text); - break; } case RUNTIME_CHECK_PAGE: { CGDrawString("0x0000000B Write/Read in non paged area.", start_y, x, panic_text); - + break; } case RUNTIME_CHECK_FILESYSTEM: { CGDrawString("0x0000000A Filesystem error.", start_y, x, panic_text); @@ -78,17 +76,14 @@ namespace Kernel } case RUNTIME_CHECK_HANDSHAKE: { CGDrawString("0x00000005 Handshake fault.", start_y, x, panic_text); - break; } case RUNTIME_CHECK_IPC: { CGDrawString("0x00000003 Bad IPC/XPCOM message.", start_y, x, panic_text); - break; } case RUNTIME_CHECK_INVALID_PRIVILEGE: { CGDrawString("0x00000007 Privilege access violation.", start_y, x, panic_text); - break; case RUNTIME_CHECK_UNEXCPECTED: { CGDrawString("0x0000000B Unexpected violation.", start_y, x, panic_text); @@ -101,11 +96,9 @@ namespace Kernel } case RUNTIME_CHECK_FAILED: { CGDrawString("0x10000001 Kernel Bug check appears to have failed, a dump has been written to the storage.", start_y, x, panic_text); - break; } default: { - CGDrawString("0xFFFFFFFC Unknown Kernel Error.", start_y, x, panic_text); break; } diff --git a/dev/zka/src/UserProcessScheduler.cxx b/dev/zka/src/UserProcessScheduler.cxx index b5a2a998..9ba06d83 100644 --- a/dev/zka/src/UserProcessScheduler.cxx +++ b/dev/zka/src/UserProcessScheduler.cxx @@ -497,7 +497,7 @@ namespace Kernel */ /***********************************************************************************/ - Bool UserProcessHelper::InitializeScheduling() + Bool UserProcessHelper::InitializeScheduler() { if (!cProcessScheduler) { @@ -516,9 +516,13 @@ namespace Kernel SizeT UserProcessHelper::StartScheduling() { + kcout << "Sched: Trying to schedule processes...\r"; + if (!cProcessScheduler) return 0; + kcout << "Sched: Scheduling processes...\r"; + SizeT ret = cProcessScheduler->Run(); return ret; } |
