summaryrefslogtreecommitdiffhomepage
path: root/dev
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-10-14 10:08:11 +0200
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-10-14 10:08:11 +0200
commit5d09dd3d4cb414fa0ab86bc05c743fb224121287 (patch)
tree27155489835cd3c3a8312d6a3d928d528b7c023a /dev
parent7ad3739afdfaa2466723467f5ef2526f171c87c3 (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>
Diffstat (limited to 'dev')
-rw-r--r--dev/zba/amd64-efi.make2
-rw-r--r--dev/zka/HALKit/AMD64/HalCommonAPI.asm0
-rw-r--r--dev/zka/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx6
-rw-r--r--dev/zka/HALKit/AMD64/HalCoreMPScheduler.cxx4
-rw-r--r--dev/zka/HALKit/AMD64/HalDescriptorLoader.cxx77
-rw-r--r--dev/zka/HALKit/AMD64/HalInterruptAPI.asm97
-rw-r--r--dev/zka/HALKit/AMD64/HalKernelMain.cxx2
-rw-r--r--dev/zka/HALKit/AMD64/HalMPContextSwitch.asm13
-rw-r--r--dev/zka/HALKit/AMD64/Processor.hxx2
-rw-r--r--dev/zka/KernelKit/UserProcessScheduler.hxx2
-rw-r--r--dev/zka/src/Stop.cxx9
-rw-r--r--dev/zka/src/UserProcessScheduler.cxx6
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;
}