Voxia OS v0.0.1
Hobby Project Operating System Targeting x86-64
Loading...
Searching...
No Matches
apic.c
Go to the documentation of this file.
1#include <hal/cpu/core.h>
2#include "hal/cpu/msr.h"
3#include "libk/io.h"
4#include "libk/serial.h"
5#include <hal/acpi/acpi.h>
6#include <hal/apic/apic.h>
7#include <hal/cpu/cpuid.h>
8
9#define APIC_BASE_ADDR 0x1B
10#define X2_APIC_ICR 0x830
11
12#define ENABLE_APIC_BIT 1 << 11
13#define ENABLE_X2_APIC_BIT 1 << 10
14
17
19
20static void enable_x2apic() {
21 uint64_t apic_base = vxRDMSR(0x1B);
22
23 // step 1: AE=1, EXTD=0
24 apic_base |= (1ULL << 11);
25 apic_base &= ~(1ULL << 10);
26 vxWRSR(0x1B, apic_base);
27
28 // step 2: re-read
29 apic_base = vxRDMSR(0x1B);
30
31 // step 3: enable x2APIC
32 apic_base |= (1ULL << 10);
33 vxWRSR(0x1B, apic_base);
34
36
37 LOG_INFO("APIC", "X2APIC enabled");
38}
39
42 uint32_t msr = 0x800 + (reg >> 4);
43 vxWRSR(msr, value);
44 } else {
46 }
47}
48
51 uint32_t msr = 0x800 + (reg >> 4);
52 return (uint32_t) vxRDMSR(msr);
53 } else {
55 }
56}
57
61
63 uint32_t lo, hi;
64 asm volatile("rdmsr" : "=a"(lo), "=d"(hi) : "c"(0x1B));
65 lo |= (1 << 11);
66 asm volatile("wrmsr" : : "a"(lo), "d"(hi), "c"(0x1B));
67
68 uint32_t eax, ebx, ecx, edx;
69 cpuid(1, 0, &eax, &ebx, &ecx, &edx);
70 if (ecx & (1 << 21))
72
73 uint32_t lapic_id;
75 lapic_id = (uint32_t) vxRDMSR(0x802); // x2APIC: ID full 32-bit
76 else
77 lapic_id = apic_read(0x20) >> 24;
78
79 apic_write(APIC_LVT_TMR, 0x10000);
80 apic_write(APIC_LVT_PERF, 0x10000);
81 apic_write(APIC_LVT_LINT0, 0x10000);
82 apic_write(APIC_LVT_LINT1, 0x10000);
83 apic_write(APIC_LVT_ERR, 0x10000);
84 apic_write(APIC_SVR, 0x1FF);
85 apic_write(APIC_ESR, 0x00);
86 apic_write(APIC_ESR, 0x00);
87 apic_write(APIC_TPR, 0x00);
89
91 apic_write(APIC_DFR, 0xFFFFFFFF);
92
93 LOG_DEBUG("lapic", "lapic id %d", lapic_id);
94 update_core_gs((uint8_t)lapic_id);
95}
96
98 apic_write(APIC_ICR_HIGH, (uint32_t) (dest << 24));
99 apic_write(APIC_ICR_LOW, (0b110 << 8) | vector);
100}
101
102void apic_eoi() {
104}
void apic_send_ipi(uint8_t vector, uint8_t dest)
Definition apic.c:97
uint8_t x2_apic_supported
Definition apic.c:16
void apicSetBaseAddr(uintptr_t addr)
Definition apic.c:58
uintptr_t lapic_base_addr
Definition apic.c:15
void apic_eoi()
Definition apic.c:102
void apicInitialize()
Definition apic.c:62
void apic_write(uint32_t reg, uint32_t value)
Definition apic.c:40
uint32_t apic_read(uint32_t reg)
Definition apic.c:49
static void enable_x2apic()
Definition apic.c:20
#define APIC_LVT_LINT0
Definition apic.h:27
#define APIC_LVT_LINT1
Definition apic.h:28
#define APIC_TPR
Definition apic.h:6
#define APIC_EOI
Definition apic.h:10
#define APIC_DFR
Definition apic.h:7
#define APIC_ICR_LOW
Definition apic.h:11
#define APIC_ESR
Definition apic.h:30
#define APIC_ICR_HIGH
Definition apic.h:12
#define APIC_LVT_PERF
Definition apic.h:26
#define APIC_LVT_ERR
Definition apic.h:29
#define APIC_LVT_TMR
Definition apic.h:25
#define APIC_SVR
Definition apic.h:9
void update_core_gs(uint8_t id)
Definition core.c:39
void cpuid(uint32_t leaf, uint32_t subleaf, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
Definition cpuid.c:4
volatile uint64_t addr
Definition e1000.hpp:0
cpu_register_t reg
Definition thread.h:14
static void mmio_outl(uintptr_t addr, uint32_t value)
Definition io.h:51
static uint32_t mmio_inl(uintptr_t addr)
Definition io.h:55
void vxWRSR(uint32_t msr, uint64_t value)
Definition msr.c:3
uint64_t vxRDMSR(uint32_t msr)
Definition msr.c:13
return value
Definition oct2bin.h:22
#define LOG_INFO(mod, fmt,...)
Definition serial.h:20
#define LOG_DEBUG(mod, fmt,...)
Definition serial.h:22
unsigned int uint32_t
Definition type.h:19
unsigned long uintptr_t
Definition type.h:73
unsigned long uint64_t
Definition type.h:25
unsigned char uint8_t
Definition type.h:7
#define vector(T)
Definition vector.h:11