Iros
 
Loading...
Searching...
No Matches
processor.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/sync/prelude.h"
8
9#include IRIS_ARCH_INCLUDE(core/processor.h)
10
11namespace iris {
18
19class Processor : public di::SelfPointer<Processor> {
20public:
21 Processor() = default;
22
23 explicit Processor(u16 id) : m_id(id) {}
24
25 auto id() const -> u16 { return m_id; }
26 auto scheduler() -> Scheduler& { return m_scheduler; }
27
28 void mark_as_initialized() { m_is_initialized.store(true, di::MemoryOrder::Release); }
29 auto is_initialized() const -> bool { return m_is_initialized.load(di::MemoryOrder::Acquire); }
30
31 void mark_as_booted() { m_is_booted.store(true, di::MemoryOrder::Release); }
32 auto is_booted() const -> bool { return m_is_booted.load(di::MemoryOrder::Acquire); }
33
34 void mark_as_online() { m_is_online.store(true, di::MemoryOrder::Relaxed); }
35 auto is_online() const -> bool { return m_is_online.load(di::MemoryOrder::Relaxed); }
36
37 auto arch_processor() -> arch::ArchProcessor& { return m_arch_processor; }
38
39 void send_ipi(u32 target_processor_id, di::FunctionRef<void(IpiMessage&)> factory);
40 void broadcast_ipi(di::FunctionRef<void(IpiMessage&)> factory);
41
43
44 void flush_tlb_local(mm::VirtualAddress base, usize byte_length);
45 void flush_tlb_local();
46
47private:
48 Scheduler m_scheduler;
49 di::Atomic<bool> m_is_initialized { false };
50 di::Atomic<bool> m_is_booted { false };
51 di::Atomic<bool> m_is_online { false };
52 di::Synchronized<di::Queue<IpiMessage*, di::StaticRing<IpiMessage*, di::Constexpr<32ZU>>>> m_ipi_message_queue;
53 u16 m_id {};
54 arch::ArchProcessor m_arch_processor;
55};
56
62
66void set_current_processor(Processor& processor);
67
68inline auto current_processor() {
69 auto guard = PreemptionDisabler {};
70 // SAFETY: This is safe since preemption is disabled.
71 auto& processor = current_processor_unsafe();
72 return di::GuardedReference<Processor, PreemptionDisabler> { processor, di::move(guard) };
73}
74
75inline auto current_scheduler() {
76 auto guard = PreemptionDisabler {};
77 // SAFETY: This is safe since preemption is disabled.
78 auto& processor = current_processor_unsafe();
79 return di::GuardedReference<Scheduler, PreemptionDisabler> { processor.scheduler(), di::move(guard) };
80}
81}
Definition function_ref.h:116
Definition atomic.h:15
Definition guarded_reference.h:8
Definition preemption.h:9
Definition processor.h:19
auto is_online() const -> bool
Definition processor.h:35
void broadcast_ipi(di::FunctionRef< void(IpiMessage &)> factory)
Definition local_apic.cpp:69
void flush_tlb_local()
Definition processor.cpp:66
auto id() const -> u16
Definition processor.h:25
void mark_as_initialized()
Definition processor.h:28
Processor(u16 id)
Definition processor.h:23
void handle_pending_ipi_messages()
Definition local_apic.cpp:20
void mark_as_online()
Definition processor.h:34
auto arch_processor() -> arch::ArchProcessor &
Definition processor.h:37
auto is_initialized() const -> bool
Definition processor.h:29
void mark_as_booted()
Definition processor.h:31
auto scheduler() -> Scheduler &
Definition processor.h:26
Processor()=default
void send_ipi(u32 target_processor_id, di::FunctionRef< void(IpiMessage &)> factory)
Definition local_apic.cpp:44
auto is_booted() const -> bool
Definition processor.h:32
Definition scheduler.h:6
Definition task.h:30
Definition processor.h:12
size_t usize
Definition integers.h:33
__UINT32_TYPE__ u32
Definition integers.h:11
__UINT16_TYPE__ u16
Definition integers.h:10
di::StrongInt< VirtualAddressTag > VirtualAddress
Definition virtual_address.h:25
Definition cxx_init.cpp:12
auto current_processor_unsafe() -> Processor &
Get the current processor.
Definition processor.h:55
auto current_processor()
Definition processor.h:68
void set_current_processor(Processor &processor)
Sets the current processor address.
Definition gdt.cpp:12
auto current_scheduler()
Definition processor.h:75
void setup_current_processor_access()
Setups access to the current processor.
Definition gdt.cpp:8
Definition self_pointer.h:5
Definition processor.h:12
usize tlb_flush_size
Definition processor.h:15
Task * task_to_schedule
Definition processor.h:16
mm::VirtualAddress tlb_flush_base
Definition processor.h:14
di::Atomic< u32 > times_processed
Definition processor.h:13