21#include "pedigree/kernel/Log.h"
22#include "pedigree/kernel/processor/Processor.h"
23#include "pedigree/kernel/processor/ProcessorInformation.h"
24#include "pedigree/kernel/processor/x64/tss.h"
25#include "pedigree/kernel/stddef.h"
26#include "pedigree/kernel/utilities/Vector.h"
27#include "pedigree/kernel/utilities/utility.h"
29#include "InterruptManager.h"
32struct alignas(16) ExceptionStack {
35static_assert(offsetof(
X64TaskStateSegment, ist) == 0x24,
"IST1 must be at TSS offset 0x24");
36static_assert(
sizeof(ExceptionStack) % 16 == 0,
"IST stack top must be aligned");
62 NOTICE(
"Setting up TSS segment for CPU #" <<
Dec << i <<
Hex <<
".");
68 ProcessorInformation* processorInfo = *it;
69 processorInfo->setTss(Tss);
70 processorInfo->setTssSelector((i + 7) << 3);
71 processorInfo->setTlsSelector((i + 8) << 3);
80 processorInfo.setTss(Tss);
81 processorInfo.setTssSelector(7 << 3);
82 processorInfo.setTlsSelector(8 << 3);
95 asm volatile(
"lgdt %0" ::
"m"(gdtr));
117 Tss->
base3 = (base >> 32) & 0xFFFFFFFF;
127 for (
size_t i = 0; i < 6; ++i) {
128 auto* stack =
new ExceptionStack{};
129 pTss->ist[i] =
reinterpret_cast<uint64_t
>(stack + 1);
static ProcessorInformation & information()
static Vector< ProcessorInformation * > m_ProcessorInformation
X64GdtManager() INITIALISATION_ONLY
segment_descriptor * m_Gdt
void setSegmentDescriptor(size_t index, uint64_t base, uint32_t limit, uint8_t flags, uint8_t flags2)
void initialise(size_t processorCount) INITIALISATION_ONLY
static X64GdtManager m_Instance
static void loadSegmentRegisters()
static void initialiseProcessor() INITIALISATION_ONLY
void initialiseTss(X64TaskStateSegment *pTss) INITIALISATION_ONLY
void setTssDescriptor(size_t index, uint64_t base) INITIALISATION_ONLY
static void initialiseProcessorIst() INITIALISATION_ONLY