diff options
Diffstat (limited to 'kernel/src')
| -rw-r--r-- | kernel/src/apic/apic.c | 12 | ||||
| -rw-r--r-- | kernel/src/apic/ioapic.c | 7 | ||||
| -rw-r--r-- | kernel/src/apic/madt.c | 4 | ||||
| -rw-r--r-- | kernel/src/cpu/irq.c | 3 | ||||
| -rw-r--r-- | kernel/src/cpu/kcpuid.c | 7 | ||||
| -rw-r--r-- | kernel/src/cpu/msr.c | 21 | ||||
| -rw-r--r-- | kernel/src/mem/paging.c | 8 | ||||
| -rw-r--r-- | kernel/src/scheduler/ap_startup.c | 9 |
8 files changed, 61 insertions, 10 deletions
diff --git a/kernel/src/apic/apic.c b/kernel/src/apic/apic.c index b947317..ba9138d 100644 --- a/kernel/src/apic/apic.c +++ b/kernel/src/apic/apic.c @@ -15,9 +15,12 @@ uint8_t cpu_apic_ids[256]; uint8_t curr_cpu_apic_id() { - uint8_t apic_id = 0; - __asm__ __volatile__ ("movl $1, %%eax; cpuid; shrl $24, %%ebx;": "=b"(apic_id)); - return apic_id; +// Initial APIC ID +// CPUIDinfo info; +// CpuId(1, 0, &info); +// return (uint8_t)(info.EBX >> 24); + + return (uint8_t)(((*((volatile uint32_t*)((uint64_t)lapic_addr + 0x20))) >> 24) & 0xFF); } void init_ap_cpus() @@ -36,7 +39,6 @@ void init_ap_cpus() if(cpu_apic_ids[i] == bspid) continue; - printf("initializing cpu with apic id 0x%x\n", cpu_apic_ids[i]); // send INIT IPI // clear APIC errors @@ -73,7 +75,7 @@ void init_ap_cpus() } *bspdone = 1; - wait(100); + wait(1000); printf("aprunning: %d\n", *aprunning); printf("cnt: %d\n", cnt); } diff --git a/kernel/src/apic/ioapic.c b/kernel/src/apic/ioapic.c index a8c3452..73c58d0 100644 --- a/kernel/src/apic/ioapic.c +++ b/kernel/src/apic/ioapic.c @@ -2,6 +2,7 @@ #include <apic.h> #include <paging.h> #include <libk/stdio.h> +#include <msr.h> void ioapic_eoi() { @@ -53,6 +54,8 @@ void ioapic_set_irq(uint8_t irq, uint64_t apic_id, uint8_t vector) ioapic_write((uint8_t)low_index, low); } +#define APIC_BASE_MSR 0x0000001B + void apic_remap_interrupts() { uint8_t bspid = curr_cpu_apic_id(); @@ -63,5 +66,9 @@ void apic_remap_interrupts() // irq is 2 because of gsi remap 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 ); + __asm__ volatile ("sti;"); } diff --git a/kernel/src/apic/madt.c b/kernel/src/apic/madt.c index f69887d..ad0720e 100644 --- a/kernel/src/apic/madt.c +++ b/kernel/src/apic/madt.c @@ -3,6 +3,7 @@ #include <heap.h> #include <libk/string.h> #include <libk/stdio.h> +#include <apic.h> void parse_madt() { @@ -17,6 +18,9 @@ void parse_madt() memcpy(madt, madt_addr, sizeof(struct MADT)); lapic_addr = madt->lapic_addr; + printf("curr_cpu_apic_id: 0x%x\n", curr_cpu_apic_id()); + printf("lapic_addr: 0x%x\n", 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)); diff --git a/kernel/src/cpu/irq.c b/kernel/src/cpu/irq.c index 6975fec..e5f811c 100644 --- a/kernel/src/cpu/irq.c +++ b/kernel/src/cpu/irq.c @@ -84,6 +84,9 @@ void irq_def_handler(uint64_t number) case 1: keyboard_handler(); break; + default: + printf("spurious interrupt\n"); + break; } eoi(number); } diff --git a/kernel/src/cpu/kcpuid.c b/kernel/src/cpu/kcpuid.c new file mode 100644 index 0000000..30a4d3e --- /dev/null +++ b/kernel/src/cpu/kcpuid.c @@ -0,0 +1,7 @@ +#include <types.h> +#include <kcpuid.h> + +void kcpuid(uint32_t func, uint32_t subfunc, CPUIDinfo* info) +{ + __asm__ __volatile__ ( "cpuid" : "=a"(info->EAX), "=b"(info->EBX), "=c"(info->ECX), "=d"(info->EDX) : "a"(func), "c"(subfunc) : ); +} diff --git a/kernel/src/cpu/msr.c b/kernel/src/cpu/msr.c new file mode 100644 index 0000000..75fc602 --- /dev/null +++ b/kernel/src/cpu/msr.c @@ -0,0 +1,21 @@ +#include <msr.h> + +uint64_t read_msr(uint32_t addr) +{ + uint64_t eax; + uint64_t edx; + uint64_t ecx = addr; + + __asm__ volatile ("rdmsr;" : "=a"(eax), "=d"(edx) : "c"(ecx) :); + + return (edx << 32) | eax; +} + +void write_msr(uint32_t addr, uint64_t value) +{ + uint64_t eax = value & 0xFFFFFFFF; + uint64_t edx = value >> 32; + uint64_t ecx = addr; + + __asm__ volatile ("wrmsr;" : : "a"(eax), "d"(edx), "c"(ecx) :); +} diff --git a/kernel/src/mem/paging.c b/kernel/src/mem/paging.c index 3a29771..c3195de 100644 --- a/kernel/src/mem/paging.c +++ b/kernel/src/mem/paging.c @@ -8,11 +8,9 @@ #include <libk/string.h> #include <kernel_vma.h> -void load_pt_lvl4(uint64_t*); - -__attribute__((aligned(4096))) uint64_t page_table_lvl4[512]; -__attribute__((aligned(4096))) uint64_t page_table_lvl3[512]; -__attribute__((aligned(4096))) uint64_t page_table_lvl2[512]; +uint64_t __attribute__((aligned(4096))) page_table_lvl4[512]; +uint64_t __attribute__((aligned(4096))) page_table_lvl3[512]; +uint64_t __attribute__((aligned(4096))) page_table_lvl2[512]; void map_addr(uint64_t virt, uint64_t phys, uint32_t flags) { diff --git a/kernel/src/scheduler/ap_startup.c b/kernel/src/scheduler/ap_startup.c index cbde44e..0d37a6c 100644 --- a/kernel/src/scheduler/ap_startup.c +++ b/kernel/src/scheduler/ap_startup.c @@ -1,8 +1,17 @@ #include <atomic.h> #include <apic.h> +#include <libk/stdio.h> +#include <idt.h> +#include <gdt.h> +#include <paging.h> void ap_startup(void) { + load_idt(&idt_pointer); + load_gdt(&gdt_pointer); + load_pt_lvl4(page_table_lvl4); + lock(cnt_lock); + printf("curr_cpu_apic_id: 0x%x\n", curr_cpu_apic_id()); cnt++; unlock(cnt_lock); |
