summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc
diff options
context:
space:
mode:
Diffstat (limited to 'dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc')
-rw-r--r--dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc67
1 files changed, 36 insertions, 31 deletions
diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc
index 46ad8fd6..e4ad1024 100644
--- a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc
+++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc
@@ -4,21 +4,8 @@
------------------------------------------- */
-#include <ArchKit/ArchKit.h>
-#include <HALKit/AMD64/Processor.h>
-#include <KernelKit/BinaryMutex.h>
-#include <KernelKit/HardwareThreadScheduler.h>
-#include <KernelKit/ProcessScheduler.h>
-#include <KernelKit/Timer.h>
-#include <NewKit/KernelPanic.h>
-#include <modules/ACPI/ACPIFactoryInterface.h>
-#include <modules/CoreGfx/TextGfx.h>
-#include "NewKit/Defines.h"
-
#define APIC_MAG "APIC"
-#define AP_BLOB_SIZE 126
-
#define APIC_ICR_LOW 0x300
#define APIC_ICR_HIGH 0x310
#define APIC_SIPI_VEC 0x00500
@@ -35,6 +22,16 @@
#define APIC_BASE_MSR_BSP 0x100
#define APIC_BASE_MSR_ENABLE 0x800
+#include <ArchKit/ArchKit.h>
+#include <HALKit/AMD64/Processor.h>
+#include <KernelKit/BinaryMutex.h>
+#include <KernelKit/HardwareThreadScheduler.h>
+#include <KernelKit/ProcessScheduler.h>
+#include <KernelKit/Timer.h>
+#include <NewKit/KernelPanic.h>
+#include <modules/ACPI/ACPIFactoryInterface.h>
+#include <modules/CoreGfx/TextGfx.h>
+
/// @note: _hal_switch_context is internal
///////////////////////////////////////////////////////////////////////////////////////
@@ -44,8 +41,6 @@
///////////////////////////////////////////////////////////////////////////////////////
namespace Kernel::HAL {
-EXTERN_C Void sched_jump_to_task(HAL::StackFramePtr stack_frame);
-
struct HAL_APIC_MADT;
struct HAL_HARDWARE_THREAD;
@@ -54,6 +49,8 @@ struct HAL_HARDWARE_THREAD final {
ProcessID mThreadID{0};
};
+EXTERN_C Void sched_jump_to_task(HAL::StackFramePtr stack_frame);
+
STATIC HAL_APIC_MADT* kMADTBlock = nullptr;
STATIC Bool kSMPAware = false;
STATIC Int64 kSMPCount = 0;
@@ -64,6 +61,8 @@ STATIC Int32 kSMPInterrupt = 0;
STATIC UInt64 kAPICLocales[kMaxAPInsideSched] = {0};
STATIC VoidPtr kRawMADT = nullptr;
+STATIC HAL_HARDWARE_THREAD kHWThread[kSchedProcessLimitPerTeam] = {{}};
+
/// @brief Multiple APIC Descriptor Table.
struct HAL_APIC_MADT final SDT_OBJECT {
UInt32 Address; // Madt address
@@ -97,7 +96,10 @@ Void hal_send_ipi_msg(UInt32 target, UInt32 apic_id, UInt8 vector) {
}
}
-STATIC HAL_HARDWARE_THREAD kHWThread[kSchedProcessLimitPerTeam] = {{}};
+/***********************************************************************************/
+/// @brief Get current stack frame for a thread.
+/// @param thrdid The thread ID.
+/***********************************************************************************/
EXTERN_C HAL::StackFramePtr mp_get_current_context(Int64 thrdid) {
const auto process_index = thrdid % kSchedProcessLimitPerTeam;
@@ -105,16 +107,28 @@ EXTERN_C HAL::StackFramePtr mp_get_current_context(Int64 thrdid) {
return kHWThread[process_index].mFramePtr;
}
+/***********************************************************************************/
+/// @brief Register current stack frame for a thread.
+/// @param stack_frame The current stack frame.
+/// @param thrdid The thread ID.
+/***********************************************************************************/
+
EXTERN_C BOOL mp_register_process(HAL::StackFramePtr stack_frame, ProcessID thrdid) {
if (thrdid > kSMPCount) return NO;
- if (mp_is_smp()) {
- kHWThread[thrdid].mFramePtr = stack_frame;
- kHWThread[thrdid].mThreadID = thrdid;
+ if (!mp_is_smp()) {
+ if (stack_frame) {
+ kHWThread[thrdid].mFramePtr = stack_frame;
+ kHWThread[thrdid].mThreadID = thrdid;
+ HardwareThreadScheduler::The()[thrdid].Leak()->Busy(NO);
- HardwareThreadScheduler::The()[thrdid].Leak()->Busy(NO);
+ sched_jump_to_task(stack_frame);
- sched_jump_to_task(stack_frame);
+ return YES;
+ }
+ } else {
+ kHWThread[thrdid].mFramePtr = stack_frame;
+ kHWThread[thrdid].mThreadID = thrdid;
return YES;
}
@@ -131,19 +145,10 @@ Bool mp_is_smp(Void) noexcept {
}
/***********************************************************************************/
-/// @brief Assembly symbol to bootstrap AP.
-/***********************************************************************************/
-EXTERN_C Char* hal_ap_blob_start;
-
-/***********************************************************************************/
-/// @brief Assembly symbol to bootstrap AP.
-/***********************************************************************************/
-EXTERN_C Char* hal_ap_blob_end;
-
-/***********************************************************************************/
/// @brief Fetch and enable SMP scheduler.
/// @param vendor_ptr SMP containing structure.
/***********************************************************************************/
+
Void mp_init_cores(VoidPtr vendor_ptr) noexcept {
if (!vendor_ptr) return;