From 57e6722453c27d35a3b02309ce21263d225a23e3 Mon Sep 17 00:00:00 2001 From: Aleksa Vuckovic Date: Wed, 22 Feb 2023 17:31:52 +0100 Subject: curr_cpu_apic_id() now works on old amd cpus --- kernel/src/apic/apic.c | 12 +++++++----- kernel/src/apic/ioapic.c | 7 +++++++ kernel/src/apic/madt.c | 4 ++++ 3 files changed, 18 insertions(+), 5 deletions(-) (limited to 'kernel/src/apic') 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 #include #include +#include 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 #include #include +#include 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)); -- cgit v1.2.3