1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
/*
* ========================================================
*
* hCore
* Copyright Mahrouss Logic, all rights reserved.
*
* ========================================================
*/
#ifndef _INC_SMP_MANAGER_HPP
#define _INC_SMP_MANAGER_HPP
#include <CompilerKit/Compiler.hpp>
#include <ArchKit/Arch.hpp>
#include <NewKit/Ref.hpp>
#define kMaxHarts 8
namespace hCore
{
using ThreadID = UInt32;
enum ThreadKind
{
kSystemReserved, // System reserved thread, well user can't use it
kStandard, // user thread, cannot be used by kernel
kFallback, // fallback thread, cannot be used by user if not clear or used by kernel.
kBoot, // The core we booted from, the mama.
};
///
/// \name ProcessorCore
/// CPU core (PowerPC, Intel, or NewCPU)
///
class ProcessorCore final
{
public:
explicit ProcessorCore();
~ProcessorCore();
public:
HCORE_COPY_DEFAULT(ProcessorCore)
public:
operator bool();
public:
void Wake(const bool wakeup = false) noexcept;
void Busy(const bool busy = false) noexcept;
public:
bool Switch(HAL::StackFrame* stack);
bool IsWakeup() noexcept;
public:
HAL::StackFrame* StackFrame() noexcept;
const ThreadKind& Kind() noexcept;
bool IsBusy() noexcept;
const ThreadID& ID() noexcept;
private:
HAL::StackFrame* m_Stack;
ThreadKind m_Kind;
ThreadID m_ID;
bool m_Wakeup;
bool m_Busy;
Int64 m_PID;
private:
friend class SMPManager;
};
///
/// \name ProcessorCore
///
/// Multi processor manager to manage other cores and dispatch tasks.
///
class SMPManager final
{
private:
explicit SMPManager();
public:
~SMPManager();
public:
HCORE_COPY_DEFAULT(SMPManager);
public:
bool Switch(HAL::StackFrame* the);
HAL::StackFramePtr GetStack() noexcept;
public:
Ref<ProcessorCore> operator[](const SizeT& idx);
bool operator!() noexcept;
operator bool() noexcept;
public:
/// @brief Shared instance of the SMP Manager.
/// @return the reference to the smp manager.
static Ref<SMPManager> Shared();
private:
Array<ProcessorCore, kMaxHarts> m_ThreadList;
ThreadID m_CurrentThread;
};
} // namespace hCore
#endif // !_INC_SMP_MANAGER_HPP
|