summaryrefslogtreecommitdiffhomepage
path: root/KernelKit/SMPManager.hpp
blob: 4ebc944a9bf869ec02beb6edad17558594fc9aa5 (plain)
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