20#include "pedigree/kernel/process/initialiseMultitasking.h"
21#include "pedigree/kernel/processor/IoPortManager.h"
22#include "pedigree/kernel/processor/NMFaultHandler.h"
23#include "pedigree/kernel/processor/PageFaultHandler.h"
24#include "pedigree/kernel/processor/Processor.h"
25#include "pedigree/kernel/processor/state.h"
26#include "pedigree/kernel/utilities/utility.h"
28#include "../x86_common/Multiprocessor.h"
29#include "../x86_common/PhysicalMemoryManager.h"
30#include "InterruptManager.h"
31#include "SyscallManager.h"
32#include "VirtualAddressSpace.h"
40#define PAT_UCMINUS 0x07
42constinit ProcessorInformation::KernelGsAnchor ProcessorBase::m_BootstrapKernelGsAnchor = {
43 0, 0, &m_SafeBspProcessorInformation, 0,
nullptr};
87 asm volatile(
"mov %%cr3, %0" :
"=r"(cr3));
95 const uint64_t bit = processor < 64 ? uint64_t(1) << processor : 0;
101 asm volatile(
"mov %0, %%cr3" ::
"r"(x64AddressSpace.
m_PhysicalPML4) :
"memory");
102 processorInformation.setVirtualAddressSpace(AddressSpace);
109 shutdownMultitasking();
129 asm volatile(
"mov %%cr0, %%rax; or $0x10000, %%rax; mov %%rax, %%cr0" :::
"rax");
163 uint32_t pat_lo, pat_hi;
164 asm volatile(
"rdmsr" :
"=a"(pat_lo),
"=d"(pat_hi) :
"c"(0x277));
167 p.x = pat_lo | (
static_cast<uint64_t
>(pat_hi) << 32ULL);
170 p.s.pa2 = PAT_UCMINUS;
174 p.s.pa6 = PAT_UCMINUS;
176 pat_lo =
static_cast<uint32_t
>(p.x);
177 pat_hi =
static_cast<uint32_t
>(p.x >> 32ULL);
179 asm volatile(
"wrmsr" ::
"a"(pat_lo),
"d"(pat_hi),
"c"(0x277));
185 size_t nProcessors = 1;
195 initialiseMultitasking();
197 doInitialise64(Info);
202 if (nProcessors != 1)
208 uint32_t eax, ebx, ecx, edx;
211 MemoryCopy(ident, &ebx, 4);
212 MemoryCopy(&ident[4], &edx, 4);
213 MemoryCopy(&ident[8], &ecx, 4);
219 pedigree_materialize_user_entry();
221 asm volatile(
"wrmsr" ::
"a"(newBase),
"d"(newBase >> 32ULL),
"c"(0xC0000100));
224uintptr_t ProcessorBase::getUserGsBase() {
226 asm volatile(
"rdmsr" :
"=a"(low),
"=d"(high) :
"c"(0xc0000102) :
"memory");
227 return low | (
static_cast<uintptr_t
>(high) << 32);
230void ProcessorBase::setUserGsBase(uintptr_t newBase) {
231 pedigree_materialize_user_entry();
234 :
"a"(
static_cast<uint32_t
>(newBase)),
"d"(
static_cast<uint32_t
>(newBase >> 32)),
Manages hardware I/O port (de)allocations.
void initialise(io_port_t ioPortBase, size_t size) INITIALISATION_ONLY
static IoPortManager & instance()
static size_t initialise1() INITIALISATION_ONLY
static void initialise2() INITIALISATION_ONLY
static NMFaultHandler & instance()
bool initialiseProcessor()
static PageFaultHandler & instance()
static bool getInterrupts()
static void initialise2(const BootstrapStruct_t &Info) INITIALISATION_ONLY
second/last stage in the initialisation of the processor-specific interface
static void setTlsBase(uintptr_t newBase)
static void initialise1(const BootstrapStruct_t &Info) INITIALISATION_ONLY
first stage in the initialisation of the processor-specific interface
static ProcessorInformation & information()
static void identify(HugeStaticString &str)
static size_t m_Initialised
static void switchAddressSpace(VirtualAddressSpace &AddressSpace)
static ProcessorInformation m_SafeBspProcessorInformation
static void setInterrupts(bool bEnable)
static void deinitialise()
static X64GdtManager & instance()
void initialise(size_t processorCount) INITIALISATION_ONLY
static void initialiseProcessor() INITIALISATION_ONLY
static void initialiseProcessor() INITIALISATION_ONLY
static void initialiseProcessor() INITIALISATION_ONLY
physical_uintptr_t m_PhysicalPML4
Atomic< uint64_t > m_ResidentProcessors
Implementation of the PhysicalMemoryManager for common x86.
static X86CommonPhysicalMemoryManager & instance()
void initialise64(const BootstrapStruct_t &Info) INITIALISATION_ONLY
void initialise(const BootstrapStruct_t &Info) INITIALISATION_ONLY
static void cpuid(uint32_t inEax, uint32_t inEcx, uint32_t &eax, uint32_t &ebx, uint32_t &ecx, uint32_t &edx)