summaryrefslogtreecommitdiff
path: root/kernel/src/apic/apic.c
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/apic.c
parentaaa23fffd02fb49cdbc56a480dbb5a8fa95bff38 (diff)
clang-format
Diffstat (limited to 'kernel/src/apic/apic.c')
-rw-r--r--kernel/src/apic/apic.c65
1 files changed, 50 insertions, 15 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));
}
}