11static inline uint64_t build_seg(uint32_t base, uint32_t limit, uint8_t access, uint8_t gran) {
13 desc = (limit & 0xFFFFull);
14 desc |= (uint64_t)(base & 0xFFFFull) << 16;
15 desc |= (uint64_t)((base >> 16) & 0xFFull) << 32;
16 desc |= (uint64_t)access << 40;
17 uint8_t gran_byte = (uint8_t)(((limit >> 16) & 0x0Fu) | (gran & 0xF0u));
18 desc |= (uint64_t)gran_byte << 48;
19 desc |= (uint64_t)((base >> 24) & 0xFFull) << 56;
23static inline uint8_t get_initial_apic_id(
void) {
24 uint32_t eax, ebx, ecx, edx;
28 __asm__
volatile(
"cpuid"
29 :
"=a"(eax),
"=b"(ebx),
"=c"(ecx),
"=d"(edx)
32 return (uint8_t)(ebx >> 24);
39 uint8_t
id = get_initial_apic_id();
42 if (
cpus[i].lapic_ID ==
id) { idx = i;
break; }
46 assert(
false,
"All APs must be initialized fully and successfully.");
void APMain(void)
---------------— FUNCTIONS ---------------—
int init_lapic_timer(uint32_t hz)
void lapic_init_cpu(void)
FORCEINLINE uint64_t InterlockedAndU64(volatile uint64_t *target, uint64_t value)
FORCEINLINE uint64_t InterlockedOrU64(volatile uint64_t *target, uint64_t value)
struct _PROCESSOR PROCESSOR
void gop_printf(uint32_t color, const char *fmt,...)
FORCEINLINE void __writemsr(uint32_t msr, uint64_t value)
FORCEINLINE void __hlt(void)
FORCEINLINE void __sti(void)
FORCEINLINE void __write_cr3(uint64_t val)
FORCEINLINE void __lidt(void *idt_ptr)
FORCEINLINE uint64_t __read_cr3(void)
FORCEINLINE PPROCESSOR MeGetCurrentProcessor(void)
void MeInitializeProcessor(IN PPROCESSOR CPU, IN bool InitializeStandardRoutine, IN bool AreYouAP)
#define COLOR_RED
Colors definitions for easier access.
struct _SMP_BOOTINFO SMP_BOOTINFO
@ SYSTEM_PHASE_INITIALIZE_PAT_ONLY
bool MmInitSystem(IN uint8_t Phase, IN PBOOT_INFO BootInformation)
NORETURN void Schedule(void)