Iros
 
Loading...
Searching...
No Matches
local_apic.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/bit/prelude.h"
4#include "di/util/prelude.h"
6
7namespace iris::x86::amd64 {
45
46struct ApicVersion : di::BitField<0, 8> {};
47struct ApicMaxLvtEntry : di::BitField<16, 8> {};
49
54
59
65
69
75
81enum class ApicMessageType : u8 {
82 Fixed = 0b000,
84 Smi = 0b010,
85 RemoteRead = 0b011,
86 Nmi = 0b100,
87 Init = 0b101,
88 Startup = 0b110,
89 External = 0b111,
90};
91
93struct ApicLvtEntryMessageType : di::BitEnum<ApicMessageType, 8, 3> {};
99
106
111 DivideBy2 = 0b0000,
112 DivideBy4 = 0b0001,
113 DivideBy8 = 0b0010,
114 DivideBy16 = 0b0011,
115 DivideBy32 = 0b1000,
116 DivideBy64 = 0b1001,
117 DivideBy128 = 0b1010,
118 DivideBy1 = 0b1011,
119};
120
125 None = 0b00,
126 Self = 0b01,
129};
130
132struct ApicInterruptCommandDeliveryMode : di::BitEnum<ApicMessageType, 8, 3> {};
138struct ApicInterruptCommandDestinationShorthand : di::BitEnum<ApicDestinationShorthand, 18, 2> {};
140
149
151public:
152 explicit LocalApic(mm::PhysicalAddress base);
153
154 auto direct_read(ApicOffset offset) const -> u32 { return m_base[di::to_underlying(offset) / sizeof(u32)]; }
155 void direct_write(ApicOffset offset, u32 value) { m_base[di::to_underlying(offset) / sizeof(u32)] = value; }
156
160 auto id() const -> u16 { return direct_read(ApicOffset::Id) >> 24; }
161
162 auto version() const -> ApicVersionRegister {
163 return di::bit_cast<ApicVersionRegister>(direct_read(ApicOffset::Version));
164 }
165
167 return di::bit_cast<ApicExtendedFeatureRegister>(direct_read(ApicOffset::ExtendedFeature));
168 }
169
171 return di::bit_cast<ApicExtendedControlRegister>(direct_read(ApicOffset::ExtendedControl));
172 }
176
178
179 auto lvt_entry(ApicOffset offset) const -> ApicLvtEntry { return di::bit_cast<ApicLvtEntry>(direct_read(offset)); }
180 void write_lvt_entry(ApicOffset offset, ApicLvtEntry value) { direct_write(offset, di::bit_cast<u32>(value)); }
181
184
187
194
198 return di::bit_cast<ApicInterruptCommandRegister>((u64(high) << 32) | low);
199 }
201 auto raw_value = di::bit_cast<u64>(value);
202 auto low = static_cast<u32>(raw_value);
203 auto high = static_cast<u32>(raw_value >> 32);
206 }
207
209
210private:
211 u32 volatile* m_base { nullptr };
212};
213
214void init_local_apic(bool print_info = true);
216}
Definition bit_struct.h:11
auto timer_divide_configuration() const -> ApicTimerDivideConfiguration
Definition local_apic.h:188
void write_timer_current_count(u32 value)
Definition local_apic.h:186
auto id() const -> u16
Read the Local APIC ID.
Definition local_apic.h:160
auto extended_feature() const -> ApicExtendedFeatureRegister
Definition local_apic.h:166
void direct_write(ApicOffset offset, u32 value)
Definition local_apic.h:155
auto direct_read(ApicOffset offset) const -> u32
Definition local_apic.h:154
void send_eoi()
Definition local_apic.h:208
auto lvt_entry(ApicOffset offset) const -> ApicLvtEntry
Definition local_apic.h:179
auto extended_control() const -> ApicExtendedControlRegister
Definition local_apic.h:170
auto interrupt_command_register() const -> ApicInterruptCommandRegister
Definition local_apic.h:195
auto version() const -> ApicVersionRegister
Definition local_apic.h:162
void write_lvt_entry(ApicOffset offset, ApicLvtEntry value)
Definition local_apic.h:180
void write_timer_divide_configuration(ApicTimerDivideConfiguration value)
Definition local_apic.h:191
void write_interrupt_command_register(ApicInterruptCommandRegister value)
Definition local_apic.h:200
void write_extended_control(ApicExtendedControlRegister value)
Definition local_apic.h:173
auto timer_initial_count() const -> u32
Definition local_apic.h:182
void write_timer_initial_count(u32 value)
Definition local_apic.h:183
LocalApic(mm::PhysicalAddress base)
Definition local_apic.cpp:116
void write_spurious_interrupt_vector(u32 value)
Definition local_apic.h:177
auto timer_current_count() const -> u32
Definition local_apic.h:185
__UINT64_TYPE__ u64
Definition integers.h:12
__UINT8_TYPE__ u8
Definition integers.h:9
__UINT32_TYPE__ u32
Definition integers.h:11
__UINT16_TYPE__ u16
Definition integers.h:10
constexpr auto to_underlying
Definition to_underlying.h:15
di::StrongInt< PhysicalAddressTag > PhysicalAddress
Definition physical_address.h:12
Definition gdt.cpp:38
void init_local_apic(bool print_info)
Definition local_apic.cpp:228
di::BitStruct< 8, ApicInterruptCommandVector, ApicInterruptCommandDeliveryMode, ApicInterruptCommandDestinationMode, ApicInterruptCommandDeliveryStatus, ApicInterruptCommandLevel, ApicInterruptCommandTriggerMode, ApicInterruptCommandRemoteReadStatus, ApicInterruptCommandDestinationShorthand, ApicInterruptCommandDestination > ApicInterruptCommandRegister
Local APIC Interrupt Command Register.
Definition local_apic.h:144
di::BitStruct< 4, ApicExtendedFeatureInterruptEnable, ApicExtendedFeatureSpecificEoi, ApicExtendedFeatureExtendedId, ApicExtendedFeatureExtendedLvtCount > ApicExtendedFeatureRegister
Local APIC Extended Feature Register.
Definition local_apic.h:63
void init_alternative_processors()
Definition local_apic.cpp:485
di::BitStruct< 4, ApicVersion, ApicMaxLvtEntry, ApicExtendedRegisterPresent > ApicVersionRegister
Local APIC Version Register.
Definition local_apic.h:53
ApicTimerDivideConfiguration
Local APIC Timer Divide Configuration.
Definition local_apic.h:110
@ DivideBy8
Definition local_apic.h:113
@ DivideBy1
Definition local_apic.h:118
@ DivideBy2
Definition local_apic.h:111
@ DivideBy4
Definition local_apic.h:112
@ DivideBy128
Definition local_apic.h:117
@ DivideBy16
Definition local_apic.h:114
@ DivideBy32
Definition local_apic.h:115
@ DivideBy64
Definition local_apic.h:116
@ Version
Definition io_apic.h:31
@ Id
Definition io_apic.h:30
ApicOffset
Local APIC Register Offsets.
Definition local_apic.h:12
@ EndOfInterrupt
Definition local_apic.h:18
@ PerformanceLvtEntry
Definition local_apic.h:32
@ Lint0Entry
Definition local_apic.h:33
@ TimerCurrentCount
Definition local_apic.h:37
@ Version
Definition local_apic.h:14
@ Id
Definition local_apic.h:13
@ RemoteRead
Definition local_apic.h:19
@ InterruptRequest
Definition local_apic.h:25
@ InterruptEnable
Definition local_apic.h:42
@ SpuriousInterruptVector
Definition local_apic.h:22
@ TimerDivideConfiguration
Definition local_apic.h:38
@ InterruptCommandHigh
Definition local_apic.h:29
@ TimerInitialCount
Definition local_apic.h:36
@ InterruptCommandLow
Definition local_apic.h:28
@ LogicalDestination
Definition local_apic.h:20
@ TaskPriority
Definition local_apic.h:15
@ TimerLvtEntry
Definition local_apic.h:30
@ InService
Definition local_apic.h:23
@ ExtendedFeature
Definition local_apic.h:39
@ DestinationFormat
Definition local_apic.h:21
@ Lint1Entry
Definition local_apic.h:34
@ ErrorEntry
Definition local_apic.h:35
@ ArbitrationPriority
Definition local_apic.h:16
@ TriggerMode
Definition local_apic.h:24
@ ProcessorPriority
Definition local_apic.h:17
@ ExtendedControl
Definition local_apic.h:40
@ LvtTimer
Definition local_apic.h:27
@ ThermalLvtEntry
Definition local_apic.h:31
@ SpecificEndOfInterrupt
Definition local_apic.h:41
@ ExtendedLvtEntries
Definition local_apic.h:43
@ ErrorStatus
Definition local_apic.h:26
di::BitStruct< 4, ApicLvtEntryVector, ApicLvtEntryMessageType, ApicLvtEntryDeliveryStatus, ApicLvtEntryRemoteIrr, ApicLvtEntryTriggerMode, ApicLvtEntryMask, ApicLvtEntryTimerMode > ApicLvtEntry
Local APIC LVT Entry.
Definition local_apic.h:103
di::BitStruct< 4, ApicExtendedControlInterruptEnable, ApicExtendedControlSpecificEoi, ApicExtendedControlExtendId > ApicExtendedControlRegister
Local APIC Extended Control Register.
Definition local_apic.h:73
ApicMessageType
Local APIC Message Type.
Definition local_apic.h:81
@ Startup
Definition local_apic.h:88
@ Fixed
Definition local_apic.h:82
@ LowestPriority
Definition local_apic.h:83
@ Nmi
Definition local_apic.h:86
@ Init
Definition local_apic.h:87
@ External
Definition local_apic.h:89
@ Smi
Definition local_apic.h:84
ApicDestinationShorthand
Local APIC Destination Shorthands.
Definition local_apic.h:124
@ None
Definition local_apic.h:125
@ AllIncludingSelf
Definition local_apic.h:127
@ AllExcludingSelf
Definition local_apic.h:128
@ Self
Definition local_apic.h:126
Definition bit_enum.h:9
Definition bit_field.h:9
Definition bit_flag.h:7
Definition local_apic.h:97
Definition local_apic.h:95
Definition local_apic.h:98
Definition local_apic.h:92
Definition local_apic.h:47
Definition local_apic.h:46