summaryrefslogtreecommitdiffhomepage
path: root/Kernel
diff options
context:
space:
mode:
Diffstat (limited to 'Kernel')
-rw-r--r--Kernel/ArchKit/ArchKit.hxx2
-rw-r--r--Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx121
-rw-r--r--Kernel/HALKit/AMD64/HalPageAlloc.cxx20
-rw-r--r--Kernel/HALKit/AMD64/HalRoutines.s4
-rw-r--r--Kernel/HALKit/AMD64/HalSMPCoreManager.asm60
-rw-r--r--Kernel/HALKit/AMD64/Processor.hxx1
-rw-r--r--Kernel/HALKit/POWER/HalThread.cxx5
-rw-r--r--Kernel/Sources/ProcessScheduler.cxx30
8 files changed, 114 insertions, 129 deletions
diff --git a/Kernel/ArchKit/ArchKit.hxx b/Kernel/ArchKit/ArchKit.hxx
index 1e7f287c..a3fd81a6 100644
--- a/Kernel/ArchKit/ArchKit.hxx
+++ b/Kernel/ArchKit/ArchKit.hxx
@@ -102,4 +102,4 @@ inline Kernel::Array<HAL_SYSCALL_RECORD,
kKerncalls;
EXTERN_C Kernel::HAL::StackFramePtr rt_get_current_context();
-EXTERN_C Kernel::Void rt_do_context_switch(Kernel::HAL::StackFramePtr stackFrame);
+EXTERN_C Kernel::Void rt_do_context_switch(Kernel::HAL::StackFramePtr stack_frame);
diff --git a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx
index 7f70bdee..9de1b5b4 100644
--- a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx
+++ b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx
@@ -27,9 +27,6 @@
#define kAPIC_BASE_MSR_BSP 0x100
#define kAPIC_BASE_MSR_ENABLE 0x800
-/// @brief assembly routine. internal use only.
-EXTERN_C void _hal_enable_smp(void);
-
/// @note: _hal_switch_context is internal
///////////////////////////////////////////////////////////////////////////////////////
@@ -40,12 +37,25 @@ EXTERN_C void _hal_enable_smp(void);
namespace Kernel::HAL
{
+ struct MADT_TABLE;
+
+ EXTERN_C Void _hal_spin_core(Void);
+
+ STATIC Void hal_switch_context(HAL::StackFramePtr stack_frame);
+
constexpr Int32 kThreadAPIC = 0;
constexpr Int32 kThreadLAPIC = 1;
constexpr Int32 kThreadIOAPIC = 2;
constexpr Int32 kThreadAPIC64 = 3;
constexpr Int32 kThreadBoot = 4;
+ STATIC MADT_TABLE* kSMPBlock = nullptr;
+ Bool kSMPAware = false;
+
+ STATIC Int32 cSMPInterrupt = 34;
+
+ STATIC VoidPtr kRawMADT = nullptr;
+
/*
*
* this is used to store info about the current running thread
@@ -67,67 +77,13 @@ namespace Kernel::HAL
} Selector;
};
- STATIC VoidPtr kApicMadt = nullptr;
-
/// @brief Multiple APIC Descriptor Table.
- struct MadtType final : public SDT
- {
- UInt32 Address;
- UInt32 Flags; // 1 = Dual Legacy PICs installed
-
- struct MadtAddress final
- {
- Char RecordType;
- Char RecordLen; // record length
- } MadtRecords[];
- };
-
- struct MadtProcessorLocalApic final
- {
- Char AcpiProcessorId;
- Char ApicId;
- UInt32 Flags;
- };
-
- struct MadtIOApic final
- {
- Char ApicId;
- Char Reserved;
- UInt32 Address;
- UInt32 SystemInterruptBase;
- };
-
- struct MadtInterruptSource final
+ struct MADT_TABLE final : public SDT
{
- Char BusSource;
- Char IrqSource;
- UInt32 GSI;
- UInt16 Flags;
- };
+ UInt32 Address; // Madt address
+ UInt8 Flags; // Madt flags
- struct MadtInterruptNmi final
- {
- Char NmiSource;
- Char Reserved;
- UInt16 Flags;
- UInt32 GSI;
- };
-
- struct MadtLocalApicAddressOverride final
- {
- UInt16 Resvered;
- UIntPtr Address;
- };
-
- STATIC Void hal_switch_context(HAL::StackFramePtr stackFrame);
-
- ///////////////////////////////////////////////////////////////////////////////////////
-
- STATIC MadtType* kApicInfoBlock = nullptr;
-
- enum
- {
- cAPICEOI = 0xb0,
+ VoidPtr Records[]; // Records List
};
///////////////////////////////////////////////////////////////////////////////////////
@@ -143,8 +99,6 @@ namespace Kernel::HAL
Kernel::ke_dma_write(targetAddress, kAPIC_ICR_Low, kAPIC_SIPI_Vector | vector);
}
- EXTERN_C Void _hal_spin_core(Void);
-
/// @brief Send end IPI for CPU.
/// @param apicId
/// @param vector
@@ -156,28 +110,16 @@ namespace Kernel::HAL
Kernel::ke_dma_write(targetAddress, kAPIC_ICR_Low, kAPIC_EIPI_Vector | vector);
}
- STATIC HAL::StackFramePtr cFramePtr = nullptr;
- STATIC Int32 cSMPInterrupt = 34;
-
- /// @brief Gets the current context, used for context switching.
- /// @retval StackFramePtr the current context.
- EXTERN_C StackFramePtr _hal_leak_current_context(Void)
- {
- return cFramePtr;
- }
-
/// @internal
EXTERN_C Void hal_ap_startup(Void)
{
- while (Yes)
- {
- }
+ ke_stop(RUNTIME_CHECK_BOOTSTRAP);
}
/// @internal
- EXTERN_C Void _hal_switch_context(HAL::StackFramePtr stackFrame)
+ EXTERN_C Void _hal_switch_context(HAL::StackFramePtr stack_frame)
{
- hal_switch_context(stackFrame);
+ hal_switch_context(stack_frame);
}
constexpr auto cMaxPCBBlocks = cMaxHWThreads;
@@ -188,7 +130,12 @@ namespace Kernel::HAL
HAL::StackFramePtr f_StackFrame;
} fBlocks[cMaxPCBBlocks] = {0};
- STATIC Void hal_switch_context(HAL::StackFramePtr stackFrame)
+ EXTERN_C HAL::StackFramePtr _hal_leak_current_context(Void)
+ {
+ return fBlocks[ProcessScheduler::The().Leak().TheCurrent().Leak().ProcessId % cMaxPCBBlocks].f_StackFrame;
+ }
+
+ STATIC Void hal_switch_context(HAL::StackFramePtr stack_frame)
{
STATIC Semaphore sem;
@@ -197,10 +144,8 @@ namespace Kernel::HAL
HardwareTimer timer(Seconds(cSeconds));
sem.LockOrWait(&ProcessScheduler::The().Leak().TheCurrent().Leak(), &timer);
- cFramePtr = stackFrame;
-
fBlocks[ProcessScheduler::The().Leak().TheCurrent().Leak().ProcessId % cMaxPCBBlocks].f_Header = &ProcessScheduler::The().Leak().TheCurrent().Leak();
- fBlocks[ProcessScheduler::The().Leak().TheCurrent().Leak().ProcessId % cMaxPCBBlocks].f_StackFrame = stackFrame;
+ fBlocks[ProcessScheduler::The().Leak().TheCurrent().Leak().ProcessId % cMaxPCBBlocks].f_StackFrame = stack_frame;
sem.Unlock();
}
@@ -233,11 +178,17 @@ namespace Kernel::HAL
Void hal_system_get_cores(voidPtr rsdPtr)
{
auto acpi = ACPIFactoryInterface(rsdPtr);
- kApicMadt = acpi.Find(kApicSignature).Leak().Leak();
+ kRawMADT = acpi.Find(kApicSignature).Leak().Leak();
+
+ kSMPBlock = reinterpret_cast<MADT_TABLE*>(kRawMADT);
- MUST_PASS(kApicMadt);
+ if (!kSMPBlock)
+ kSMPAware = false;
- kApicInfoBlock = (MadtType*)kApicMadt;
+ if (kSMPBlock)
+ {
+ kSMPAware = true;
+ }
}
} // namespace Kernel::HAL
diff --git a/Kernel/HALKit/AMD64/HalPageAlloc.cxx b/Kernel/HALKit/AMD64/HalPageAlloc.cxx
index 5354bb25..b554e211 100644
--- a/Kernel/HALKit/AMD64/HalPageAlloc.cxx
+++ b/Kernel/HALKit/AMD64/HalPageAlloc.cxx
@@ -73,24 +73,24 @@ namespace Kernel
kAllocationInProgress = true;
//! fetch from the start.
- Detail::VIRTUAL_MEMORY_HEADER* vmHeader = reinterpret_cast<Detail::VIRTUAL_MEMORY_HEADER*>(kKernelVMTStart);
+ Detail::VIRTUAL_MEMORY_HEADER* vmh_header = reinterpret_cast<Detail::VIRTUAL_MEMORY_HEADER*>(kKernelVMTStart);
Detail::VirtualMemoryHeaderTraits traits;
- while (vmHeader->Present &&
- vmHeader->Magic == cVMHMagic)
+ while (vmh_header->Present &&
+ vmh_header->Magic == cVMHMagic)
{
- vmHeader = traits.Next(vmHeader);
+ vmh_header = traits.Next(vmh_header);
}
- vmHeader->Magic = cVMHMagic;
- vmHeader->Present = true;
- vmHeader->ReadWrite = rw;
- vmHeader->User = user;
- vmHeader->Size = size;
+ vmh_header->Magic = cVMHMagic;
+ vmh_header->Present = true;
+ vmh_header->ReadWrite = rw;
+ vmh_header->User = user;
+ vmh_header->Size = size;
kAllocationInProgress = false;
- return reinterpret_cast<VoidPtr>(vmHeader + sizeof(Detail::VIRTUAL_MEMORY_HEADER));
+ return reinterpret_cast<VoidPtr>(vmh_header + sizeof(Detail::VIRTUAL_MEMORY_HEADER));
}
/// @brief Allocate a new page to be used by the OS.
diff --git a/Kernel/HALKit/AMD64/HalRoutines.s b/Kernel/HALKit/AMD64/HalRoutines.s
index 321ad3d3..d794882d 100644
--- a/Kernel/HALKit/AMD64/HalRoutines.s
+++ b/Kernel/HALKit/AMD64/HalRoutines.s
@@ -1,8 +1,4 @@
-.globl hal_load_idt
-.globl hal_load_gdt
.globl rt_wait_400ns
-.globl rt_get_current_context
-.globl hal_ap_trampoline
.section .text
rt_wait_400ns:
diff --git a/Kernel/HALKit/AMD64/HalSMPCoreManager.asm b/Kernel/HALKit/AMD64/HalSMPCoreManager.asm
index 508abf80..3c53d49d 100644
--- a/Kernel/HALKit/AMD64/HalSMPCoreManager.asm
+++ b/Kernel/HALKit/AMD64/HalSMPCoreManager.asm
@@ -11,7 +11,6 @@
[global rt_get_current_context]
[global rt_do_context_switch]
-[global _hal_enable_smp]
[global _hal_spin_core]
[extern _hal_switch_context]
[extern _hal_leak_current_context]
@@ -22,20 +21,53 @@ section .text
;; rcx: Stack Pointer
;; rdx: SMP core address.
rt_do_context_switch:
- push rcx
push rax
-
call _hal_switch_context
+ pop rax
+
+ ;; Now grab newly allocated process's stack frame.
- pop rcx
+ push rax
+ call _hal_leak_current_context
+ mov rax, r9
pop rax
- retfq
+
+ ;; Take care of context switching within AP.
+
+ mov r9, rax
+
+ mov rbp, [r9 + (8 * 5)]
+ mov rsp, [r9 + (8 * 6)]
+
+ mov gs, [r9 + (8 * 19)]
+ mov fs, [r9 + (8 * 20)]
+
+ mov rcx, [r9 + (8 * 3)]
+ mov rdx, [r9 + (8 * 4)]
+ mov rbx, [r9 + (8 * 7)]
+ mov rax, [r9 + (8 * 8)]
+ movq xmm0, [r9 + (8 * 9)]
+ movq xmm1, [r9 + (8 * 10)]
+
+ mov r8, [r9 + (8 * 11)]
+ mov r10, [r9 + (8 * 13)]
+ mov r11, [r9 + (8 * 14)]
+ mov r12, [r9 + (8 * 15)]
+ mov r13, [r9 + (8 * 16)]
+ mov r14, [r9 + (8 * 17)]
+ mov r15, [r9 + (8 * 18)]
+
+ fldcw word [r9 + (8 * 21)]
+
+ mov r9, [r9 + (8 * 12)]
+
+ retfq
;; gets the current stack frame.
rt_get_current_context:
push rax
- jmp _hal_leak_current_context
+ call _hal_leak_current_context
mov rax, r9
pop rax
@@ -44,22 +76,6 @@ rt_get_current_context:
retfq
-;; @brief enables a smp core to run.
-_hal_enable_smp:
- ; Read the APIC base MSR
- mov ecx, 0x1B ; IA32_APIC_BASE MSR
- rdmsr
-
- ; Enable the APIC by setting bit 11 (APIC Global Enable)
- or rdx, 0x800
-
- ; Set the base address (0xFEE00000)
- mov eax, 0xFEE
- shl rax, 12
- or rax, rdx
- wrmsr
- ret
-
_hal_spin_core:
jmp $
ret
diff --git a/Kernel/HALKit/AMD64/Processor.hxx b/Kernel/HALKit/AMD64/Processor.hxx
index 42495b61..d80a2834 100644
--- a/Kernel/HALKit/AMD64/Processor.hxx
+++ b/Kernel/HALKit/AMD64/Processor.hxx
@@ -168,6 +168,7 @@ namespace Kernel::HAL
Reg A0, A2, BP, SP, A3, A4, A5, A6;
Reg R8, R9, R10, R11, R12, R13, R14, R15;
Reg Gs, Fs;
+ Reg ControlWord;
};
typedef StackFrame* StackFramePtr;
diff --git a/Kernel/HALKit/POWER/HalThread.cxx b/Kernel/HALKit/POWER/HalThread.cxx
index b6a15918..3e2f1703 100644
--- a/Kernel/HALKit/POWER/HalThread.cxx
+++ b/Kernel/HALKit/POWER/HalThread.cxx
@@ -6,8 +6,3 @@
#include <HALKit/POWER/Processor.hxx>
#include <KernelKit/DebugOutput.hxx>
-
-EXTERN_C Kernel::HAL::StackFramePtr rt_get_current_context()
-{
- return nullptr;
-}
diff --git a/Kernel/Sources/ProcessScheduler.cxx b/Kernel/Sources/ProcessScheduler.cxx
index 954d9a7c..8ca94b60 100644
--- a/Kernel/Sources/ProcessScheduler.cxx
+++ b/Kernel/Sources/ProcessScheduler.cxx
@@ -244,11 +244,27 @@ namespace Kernel
}
process.Leak().StackFrame = reinterpret_cast<HAL::StackFrame*>(
- mm_new_ke_heap(sizeof(HAL::StackFrame), true, false));
+ mm_new_ke_heap(sizeof(HAL::StackFrame), Yes, Yes));
MUST_PASS(process.Leak().StackFrame);
- process.Leak().Status = ProcessStatus::kRunning;
+ if (process.Leak().Image)
+ {
+ process.Leak().StackFrame->BP = reinterpret_cast<HAL::Reg>(process.Leak().Image);
+ }
+ else
+ {
+ if (process.Leak().Kind != PROCESS_HEADER_BLOCK::kSharedObjectKind)
+ {
+ process.Leak().Crash();
+ return -kErrorProcessFault;
+ }
+ }
+
+ if (!process.Leak().StackFrame->SP)
+ process.Leak().StackFrame->SP = reinterpret_cast<HAL::Reg>(mm_new_ke_heap(sizeof(UInt8) * 8196, Yes, Yes));
+
+ process.Leak().Status = ProcessStatus::kStarting;
process.Leak().ProcessId = (mTeam.AsArray().Count() - 1);
process.Leak().HeapCursor = process.Leak().HeapPtr;
@@ -356,6 +372,16 @@ namespace Kernel
process.Leak().Status == ProcessStatus::kDead)
return false;
+ if (process.Leak().Kind == PROCESS_HEADER_BLOCK::kSharedObjectKind)
+ {
+ if (auto start = process.Leak().DLLPtr->Load<VoidPtr>(kPefStart, rt_string_len(kPefStart), kPefCode);
+ start)
+ {
+ process.Leak().Image = start;
+ process.Leak().StackFrame->BP = reinterpret_cast<HAL::Reg>(start);
+ }
+ }
+
if (process.Leak().GetStatus() == ProcessStatus::kStarting)
{
if (process.Leak().PTime <= 0)