summaryrefslogtreecommitdiff
path: root/kernel/src/apic
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksa@vuckovic.cc>2023-02-25 06:56:01 +0100
committerAleksa Vuckovic <aleksa@vuckovic.cc>2023-02-25 08:45:09 +0100
commit239900af293f192931391dc5579afab39a43e6c6 (patch)
tree72d7f87ee6adf5aa84b78436197e03e61fba8d97 /kernel/src/apic
parentaaa23fffd02fb49cdbc56a480dbb5a8fa95bff38 (diff)
clang-format
Diffstat (limited to 'kernel/src/apic')
-rw-r--r--kernel/src/apic/apic.c65
-rw-r--r--kernel/src/apic/ioapic.c31
-rw-r--r--kernel/src/apic/madt.c58
-rw-r--r--kernel/src/apic/rsdp.c62
4 files changed, 147 insertions, 69 deletions
diff --git a/kernel/src/apic/apic.c b/kernel/src/apic/apic.c
index 06c0661..2b650b0 100644
--- a/kernel/src/apic/apic.c
+++ b/kernel/src/apic/apic.c
@@ -16,7 +16,10 @@ uint8_t cpu_apic_ids[256];
uint8_t curr_cpu_apic_id()
{
- return (uint8_t)(((*((__volatile__ uint32_t*)((uint64_t)lapic_addr + 0x20))) >> 24) & 0xFF);
+ return (uint8_t)(((*((__volatile__ uint32_t *)((uint64_t)lapic_addr +
+ 0x20))) >>
+ 24) &
+ 0xFF);
}
void init_ap_cpus()
@@ -26,43 +29,75 @@ void init_ap_cpus()
init_mutex(&cnt_lock);
map_addr(lapic_addr, lapic_addr, FLAG_PRESENT);
- for(size_t i = 0; i < numcores; i++) {
+ for (size_t i = 0; i < numcores; i++) {
// do not start BSP, that's already running this code
- if(cpu_apic_ids[i] == bspid)
+ if (cpu_apic_ids[i] == bspid)
continue;
// send INIT IPI
// clear APIC errors
- *((__volatile__ uint32_t*)(lapic_addr + 0x280)) = 0;
+ *((__volatile__ uint32_t *)(lapic_addr + 0x280)) = 0;
// select AP
- *((__volatile__ uint32_t*)(lapic_addr + 0x310)) = (*((__volatile__ uint32_t*)(lapic_addr + 0x310)) & 0x00ffffff) | ((uint32_t)cpu_apic_ids[i] << 24);
+ *((__volatile__ uint32_t *)(lapic_addr + 0x310)) =
+ (*((__volatile__ uint32_t *)(lapic_addr + 0x310)) &
+ 0x00ffffff) |
+ ((uint32_t)cpu_apic_ids[i] << 24);
// trigger INIT IPI
- *((__volatile__ uint32_t*)(lapic_addr + 0x300)) = (*((__volatile__ uint32_t*)(lapic_addr + 0x300)) & 0xfff00000) | 0x00C500;
+ *((__volatile__ uint32_t *)(lapic_addr + 0x300)) =
+ (*((__volatile__ uint32_t *)(lapic_addr + 0x300)) &
+ 0xfff00000) |
+ 0x00C500;
// wait for delivery
- do { __asm__ __volatile__ ("pause" : : : "memory"); }while(*((__volatile__ uint32_t*)(uint64_t)(lapic_addr + 0x300)) & (1 << 12));
+ do {
+ __asm__ __volatile__("pause" : : : "memory");
+ } while (*((__volatile__ uint32_t *)(uint64_t)(lapic_addr +
+ 0x300)) &
+ (1 << 12));
// select AP
- *((__volatile__ uint32_t*)(lapic_addr + 0x310)) = (*((__volatile__ uint32_t*)(lapic_addr + 0x310)) & 0x00ffffff) | ((uint32_t)cpu_apic_ids[i] << 24);
+ *((__volatile__ uint32_t *)(lapic_addr + 0x310)) =
+ (*((__volatile__ uint32_t *)(lapic_addr + 0x310)) &
+ 0x00ffffff) |
+ ((uint32_t)cpu_apic_ids[i] << 24);
// deassert
- *((__volatile__ uint32_t*)(lapic_addr + 0x300)) = (*((__volatile__ uint32_t*)(lapic_addr + 0x300)) & 0xfff00000) | 0x008500;
+ *((__volatile__ uint32_t *)(lapic_addr + 0x300)) =
+ (*((__volatile__ uint32_t *)(lapic_addr + 0x300)) &
+ 0xfff00000) |
+ 0x008500;
// wait for delivery
- do { __asm__ __volatile__ ("pause" : : : "memory"); }while(*((__volatile__ uint32_t*)(uint64_t)(lapic_addr + 0x300)) & (1 << 12));
+ do {
+ __asm__ __volatile__("pause" : : : "memory");
+ } while (*((__volatile__ uint32_t *)(uint64_t)(lapic_addr +
+ 0x300)) &
+ (1 << 12));
// wait 10 msec
wait(10);
// send STARTUP IPI (twice)
- for(size_t j = 0; j < 2; j++) {
+ for (size_t j = 0; j < 2; j++) {
// clear APIC errors
- *((__volatile__ uint32_t*)(lapic_addr + 0x280)) = 0;
+ *((__volatile__ uint32_t *)(lapic_addr + 0x280)) = 0;
// select AP
- *((__volatile__ uint32_t*)(lapic_addr + 0x310)) = (*((__volatile__ uint32_t*)(lapic_addr + 0x310)) & 0x00ffffff) | ((uint32_t)cpu_apic_ids[i] << 24);
+ *((__volatile__ uint32_t *)(lapic_addr + 0x310)) =
+ (*((__volatile__ uint32_t *)(lapic_addr +
+ 0x310)) &
+ 0x00ffffff) |
+ ((uint32_t)cpu_apic_ids[i] << 24);
// trigger STARTUP IPI for 0800:0000
- *((__volatile__ uint32_t*)(lapic_addr + 0x300)) = (*((__volatile__ uint32_t*)(lapic_addr + 0x300)) & 0xfff0f800) | 0x000608;
+ *((__volatile__ uint32_t *)(lapic_addr + 0x300)) =
+ (*((__volatile__ uint32_t *)(lapic_addr +
+ 0x300)) &
+ 0xfff0f800) |
+ 0x000608;
// wait 200 usec
wait(1);
// wait for delivery
- do { __asm__ __volatile__ ("pause" : : : "memory"); }while(*((__volatile__ uint32_t*)(uint64_t)(lapic_addr + 0x300)) & (1 << 12));
+ do {
+ __asm__ __volatile__("pause" : : : "memory");
+ } while (*((__volatile__ uint32_t
+ *)(uint64_t)(lapic_addr + 0x300)) &
+ (1 << 12));
}
}
diff --git a/kernel/src/apic/ioapic.c b/kernel/src/apic/ioapic.c
index bcd5a4d..cfda8be 100644
--- a/kernel/src/apic/ioapic.c
+++ b/kernel/src/apic/ioapic.c
@@ -7,29 +7,29 @@
void ioapic_eoi()
{
- *((__volatile__ uint32_t*)((uint64_t)lapic_addr + 0xB0)) = 0;
+ *((__volatile__ uint32_t *)((uint64_t)lapic_addr + 0xB0)) = 0;
}
uint32_t ioapic_read(const uint8_t offset)
{
- /* tell IOREGSEL where we want to read from */
- *(__volatile__ uint32_t*)(uint64_t)ioapic_addr = offset;
- /* return the data from IOWIN */
- return *(__volatile__ uint32_t*)((uint64_t)ioapic_addr + 0x10);
+ /* tell IOREGSEL where we want to read from */
+ *(__volatile__ uint32_t *)(uint64_t)ioapic_addr = offset;
+ /* return the data from IOWIN */
+ return *(__volatile__ uint32_t *)((uint64_t)ioapic_addr + 0x10);
}
void ioapic_write(const uint8_t offset, const uint32_t val)
{
- /* tell IOREGSEL where we want to write to */
- *(__volatile__ uint32_t*)(uint64_t)ioapic_addr = offset;
- /* write the value to IOWIN */
- *(__volatile__ uint32_t*)((uint64_t)ioapic_addr + 0x10) = val;
+ /* tell IOREGSEL where we want to write to */
+ *(__volatile__ uint32_t *)(uint64_t)ioapic_addr = offset;
+ /* write the value to IOWIN */
+ *(__volatile__ uint32_t *)((uint64_t)ioapic_addr + 0x10) = val;
}
void ioapic_set_irq(uint8_t irq, uint64_t apic_id, uint8_t vector)
{
- const uint32_t low_index = (uint32_t)0x10 + irq*2;
- const uint32_t high_index = (uint32_t)0x10 + irq*2 + 1;
+ const uint32_t low_index = (uint32_t)0x10 + irq * 2;
+ const uint32_t high_index = (uint32_t)0x10 + irq * 2 + 1;
uint32_t high = ioapic_read((uint8_t)high_index);
// set APIC ID
@@ -40,10 +40,10 @@ void ioapic_set_irq(uint8_t irq, uint64_t apic_id, uint8_t vector)
uint32_t low = ioapic_read((uint8_t)low_index);
// unmask the IRQ
- low &= (uint32_t)~(1<<16);
+ low &= (uint32_t) ~(1 << 16);
// set to physical delivery mode
- low &= (uint32_t)~(1<<11);
+ low &= (uint32_t) ~(1 << 11);
// set to fixed delivery mode
low &= (uint32_t)~0x700;
@@ -66,6 +66,7 @@ void apic_remap_interrupts()
ioapic_set_irq(0x2, bspid, 0x20); // timer
ioapic_set_irq(0x1, bspid, 0x21); // keyboard
- write_msr(APIC_BASE_MSR, read_msr(APIC_BASE_MSR) | (1<<11));
- *((__volatile__ uint32_t*)(lapic_addr + 0xF0)) = (*(__volatile__ uint32_t*)(lapic_addr + 0xF0) | 0x1FF );
+ write_msr(APIC_BASE_MSR, read_msr(APIC_BASE_MSR) | (1 << 11));
+ *((__volatile__ uint32_t *)(lapic_addr + 0xF0)) =
+ (*(__volatile__ uint32_t *)(lapic_addr + 0xF0) | 0x1FF);
}
diff --git a/kernel/src/apic/madt.c b/kernel/src/apic/madt.c
index f69887d..5a6e914 100644
--- a/kernel/src/apic/madt.c
+++ b/kernel/src/apic/madt.c
@@ -6,28 +6,37 @@
void parse_madt()
{
- uint64_t* madt_addr = find_sys_table_addr("APIC");
+ uint64_t *madt_addr = find_sys_table_addr("APIC");
if (madt_addr == NULL) {
printf("MADT NOT FOUND\n");
return;
}
- struct MADT* madt = (struct MADT*)kalloc(sizeof(struct MADT));
+ struct MADT *madt = (struct MADT *)kalloc(sizeof(struct MADT));
memcpy(madt, madt_addr, sizeof(struct MADT));
lapic_addr = madt->lapic_addr;
- for (size_t curr_size = sizeof(struct MADT); curr_size < madt->h.Length;) {
- struct MADT_type_header* m = (struct MADT_type_header*)kalloc(sizeof(struct MADT_type_header));
- memcpy(m, (uint64_t*)((uint64_t)madt_addr + (uint64_t)curr_size), sizeof(struct MADT_type_header));
+ for (size_t curr_size = sizeof(struct MADT);
+ curr_size < madt->h.Length;) {
+ struct MADT_type_header *m = (struct MADT_type_header *)kalloc(
+ sizeof(struct MADT_type_header));
+ memcpy(m,
+ (uint64_t *)((uint64_t)madt_addr + (uint64_t)curr_size),
+ sizeof(struct MADT_type_header));
uint8_t type = m->type;
uint8_t len = m->len;
kfree(m);
if (type == 0) {
// Processor Local APIC
- struct MADT_cpu_local_apic* cpu = (struct MADT_cpu_local_apic*)kalloc(sizeof(struct MADT_cpu_local_apic));
- memcpy(cpu, (uint64_t*)((uint64_t)madt_addr + (uint64_t)curr_size), sizeof(struct MADT_cpu_local_apic));
+ struct MADT_cpu_local_apic *cpu =
+ (struct MADT_cpu_local_apic *)kalloc(
+ sizeof(struct MADT_cpu_local_apic));
+ memcpy(cpu,
+ (uint64_t *)((uint64_t)madt_addr +
+ (uint64_t)curr_size),
+ sizeof(struct MADT_cpu_local_apic));
if (cpu->flags & 0x1) {
cpu_apic_ids[numcores] = cpu->apic_id;
@@ -38,8 +47,12 @@ void parse_madt()
kfree(cpu);
} else if (type == 1) {
// I/O APIC
- struct MADT_io_apic* io = (struct MADT_io_apic*)kalloc(sizeof(struct MADT_io_apic));
- memcpy(io, (uint64_t*)((uint64_t)madt_addr + (uint64_t)curr_size), sizeof(struct MADT_io_apic));
+ struct MADT_io_apic *io = (struct MADT_io_apic *)kalloc(
+ sizeof(struct MADT_io_apic));
+ memcpy(io,
+ (uint64_t *)((uint64_t)madt_addr +
+ (uint64_t)curr_size),
+ sizeof(struct MADT_io_apic));
ioapic_addr = io->io_apic_addr;
@@ -47,8 +60,13 @@ void parse_madt()
kfree(io);
} else if (type == 2) {
// IO/APIC Interrupt Source Override
- struct MADT_io_apic_int* io_apic_int = (struct MADT_io_apic_int*)kalloc(sizeof(struct MADT_io_apic_int));
- memcpy(io_apic_int, (uint64_t*)((uint64_t)madt_addr + (uint64_t)curr_size), sizeof(struct MADT_io_apic_int));
+ struct MADT_io_apic_int *io_apic_int =
+ (struct MADT_io_apic_int *)kalloc(
+ sizeof(struct MADT_io_apic_int));
+ memcpy(io_apic_int,
+ (uint64_t *)((uint64_t)madt_addr +
+ (uint64_t)curr_size),
+ sizeof(struct MADT_io_apic_int));
// printf("found io_apic_int: bus: 0x%x, irq_source: 0x%x, global_sys_int: 0x%x, flags: 0x%x\n", io_apic_int->bus_source, io_apic_int->irq_source, io_apic_int->global_sys_int, io_apic_int->flags);
kfree(io_apic_int);
@@ -57,15 +75,25 @@ void parse_madt()
printf("MADT entry of type %d\n", type);
} else if (type == 4) {
// Local APIC Non-maskable interrupts
- struct MADT_lapic_nmi* lapic_nmi = (struct MADT_lapic_nmi*)kalloc(sizeof(struct MADT_lapic_nmi));
- memcpy(lapic_nmi, (uint64_t*)((uint64_t)madt_addr + (uint64_t)curr_size), sizeof(struct MADT_lapic_nmi));
+ struct MADT_lapic_nmi *lapic_nmi =
+ (struct MADT_lapic_nmi *)kalloc(
+ sizeof(struct MADT_lapic_nmi));
+ memcpy(lapic_nmi,
+ (uint64_t *)((uint64_t)madt_addr +
+ (uint64_t)curr_size),
+ sizeof(struct MADT_lapic_nmi));
// printf("found lapic_nmi: acpi_cpu_id: 0x%x, flags: 0x%x, lint: 0x%x\n", lapic_nmi->acpi_cpu_id, lapic_nmi->flags, lapic_nmi->lint);
kfree(lapic_nmi);
} else if (type == 5) {
// Local APIC Address Override
- struct MADT_lapic_addr* lapic_addr_ovr = (struct MADT_lapic_addr*)kalloc(sizeof(struct MADT_lapic_addr));
- memcpy(lapic_addr_ovr, (uint64_t*)((uint64_t)madt_addr + (uint64_t)curr_size), sizeof(struct MADT_lapic_addr));
+ struct MADT_lapic_addr *lapic_addr_ovr =
+ (struct MADT_lapic_addr *)kalloc(
+ sizeof(struct MADT_lapic_addr));
+ memcpy(lapic_addr_ovr,
+ (uint64_t *)((uint64_t)madt_addr +
+ (uint64_t)curr_size),
+ sizeof(struct MADT_lapic_addr));
// printf("found lapic: addr: 0x%x\n", lapic_addr_ovr->phys_addr);
kfree(lapic_addr_ovr);
diff --git a/kernel/src/apic/rsdp.c b/kernel/src/apic/rsdp.c
index e0127aa..c12b63f 100644
--- a/kernel/src/apic/rsdp.c
+++ b/kernel/src/apic/rsdp.c
@@ -4,12 +4,12 @@
#include <libk/string.h>
#include <libk/stdio.h>
-uint64_t* find_rsdp()
+uint64_t *find_rsdp()
{
map_addr(0x0, 0x0, FLAG_PRESENT);
- const char* rsdp_cs = "RSD PTR ";
+ const char *rsdp_cs = "RSD PTR ";
for (uint64_t i = 0x10; i < 0x100000; i += 0x10) {
- char *x = (char*)i;
+ char *x = (char *)i;
uint8_t ind = 1;
for (size_t j = 0; j < strlen(rsdp_cs); j++) {
if (rsdp_cs[j] != x[j]) {
@@ -18,7 +18,7 @@ uint64_t* find_rsdp()
}
}
if (ind) {
- return (uint64_t*)i;
+ return (uint64_t *)i;
}
}
return NULL;
@@ -26,28 +26,35 @@ uint64_t* find_rsdp()
void list_sys_tables(void)
{
- uint64_t* rsdp = find_rsdp();
+ uint64_t *rsdp = find_rsdp();
if (rsdp == NULL) {
printf("RSDP NOT FOUND\n");
return;
}
- struct RSDP_descriptor* rsdp_desc = (struct RSDP_descriptor*)rsdp;
+ struct RSDP_descriptor *rsdp_desc = (struct RSDP_descriptor *)rsdp;
map_addr(rsdp_desc->RsdtAddress, rsdp_desc->RsdtAddress, FLAG_PRESENT);
- struct ACPI_header* rsdt = (struct ACPI_header*)kalloc(sizeof(struct ACPI_header));
- memcpy(rsdt, (uint64_t*)(uint64_t)rsdp_desc->RsdtAddress, sizeof(struct ACPI_header));
+ struct ACPI_header *rsdt =
+ (struct ACPI_header *)kalloc(sizeof(struct ACPI_header));
+ memcpy(rsdt, (uint64_t *)(uint64_t)rsdp_desc->RsdtAddress,
+ sizeof(struct ACPI_header));
- uint32_t entries = (rsdt->Length - (uint32_t)sizeof(struct ACPI_header)) / 4;
+ uint32_t entries =
+ (rsdt->Length - (uint32_t)sizeof(struct ACPI_header)) / 4;
for (size_t i = 0; i < entries; i++) {
- uint32_t na_addr = (uint32_t)rsdp_desc->RsdtAddress + (uint32_t)sizeof(struct ACPI_header) + (uint32_t)i * 4;
+ uint32_t na_addr = (uint32_t)rsdp_desc->RsdtAddress +
+ (uint32_t)sizeof(struct ACPI_header) +
+ (uint32_t)i * 4;
uint32_t addr;
- memcpy(&addr, (uint64_t*)(uint64_t)na_addr, 4);
+ memcpy(&addr, (uint64_t *)(uint64_t)na_addr, 4);
- struct ACPI_header* t = (struct ACPI_header*)kalloc(sizeof(struct ACPI_header));
- memcpy(t, (uint64_t*)(uint64_t)addr, sizeof(struct ACPI_header));
+ struct ACPI_header *t = (struct ACPI_header *)kalloc(
+ sizeof(struct ACPI_header));
+ memcpy(t, (uint64_t *)(uint64_t)addr,
+ sizeof(struct ACPI_header));
for (size_t j = 0; j < 4; j++) {
printf("%c", t->Signature[j]);
@@ -61,30 +68,37 @@ void list_sys_tables(void)
kfree(rsdt);
}
-uint64_t* find_sys_table_addr(const char* signature)
+uint64_t *find_sys_table_addr(const char *signature)
{
- uint64_t* rsdp = find_rsdp();
+ uint64_t *rsdp = find_rsdp();
if (rsdp == NULL) {
printf("RSDP NOT FOUND\n");
return NULL;
}
- struct RSDP_descriptor* rsdp_desc = (struct RSDP_descriptor*)rsdp;
+ struct RSDP_descriptor *rsdp_desc = (struct RSDP_descriptor *)rsdp;
map_addr(rsdp_desc->RsdtAddress, rsdp_desc->RsdtAddress, FLAG_PRESENT);
- struct ACPI_header* rsdt = (struct ACPI_header*)kalloc(sizeof(struct ACPI_header));
- memcpy(rsdt, (uint64_t*)(uint64_t)rsdp_desc->RsdtAddress, sizeof(struct ACPI_header));
+ struct ACPI_header *rsdt =
+ (struct ACPI_header *)kalloc(sizeof(struct ACPI_header));
+ memcpy(rsdt, (uint64_t *)(uint64_t)rsdp_desc->RsdtAddress,
+ sizeof(struct ACPI_header));
- uint32_t entries = (rsdt->Length - (uint32_t)sizeof(struct ACPI_header)) / 4;
+ uint32_t entries =
+ (rsdt->Length - (uint32_t)sizeof(struct ACPI_header)) / 4;
for (size_t i = 0; i < entries; i++) {
- uint32_t na_addr = (uint32_t)rsdp_desc->RsdtAddress + (uint32_t)sizeof(struct ACPI_header) + (uint32_t)i * 4;
+ uint32_t na_addr = (uint32_t)rsdp_desc->RsdtAddress +
+ (uint32_t)sizeof(struct ACPI_header) +
+ (uint32_t)i * 4;
uint32_t addr;
- memcpy(&addr, (uint64_t*)(uint64_t)na_addr, 4);
+ memcpy(&addr, (uint64_t *)(uint64_t)na_addr, 4);
- struct ACPI_header* t = (struct ACPI_header*)kalloc(sizeof(struct ACPI_header));
- memcpy(t, (uint64_t*)(uint64_t)addr, sizeof(struct ACPI_header));
+ struct ACPI_header *t = (struct ACPI_header *)kalloc(
+ sizeof(struct ACPI_header));
+ memcpy(t, (uint64_t *)(uint64_t)addr,
+ sizeof(struct ACPI_header));
int ind = 1;
for (size_t j = 0; j < 4; j++) {
@@ -94,7 +108,7 @@ uint64_t* find_sys_table_addr(const char* signature)
if (ind) {
kfree(t);
kfree(rsdt);
- return (uint64_t*)(uint64_t)addr;
+ return (uint64_t *)(uint64_t)addr;
}
kfree(t);