Files
2020-02-04 12:45:15 +02:00

30 lines
805 B
C

#include "arch/amd64/hw/apic.h"
#include "arch/amd64/smp/smp.h"
#include "arch/amd64/smp/ipi.h"
#include "arch/amd64/cpu.h"
#include "sys/debug.h"
void amd64_ipi_send(int cpu, uint8_t vector) {
if (cpu < 0 || cpu >= (int) smp_ncpus) {
kerror("Invalid cpu number: %d\n", cpu);
}
LAPIC(LAPIC_REG_CMD1) = ((uint32_t) (cpus[cpu].apic_id & 0xFF)) << 24;
// Wait for delivery status bit to clear
while (LAPIC(LAPIC_REG_CMD0) & (1 << 12));
// Command: vector 0xF0,
LAPIC(LAPIC_REG_CMD0) = vector | (1 << 14);
}
void amd64_ipi_handle(void) {
kdebug("IPI received by cpu%u\n", get_cpu()->processor_id);
}
void amd64_ipi_panic(void) {
kfatal("cpu%u received panic IPI: halting\n", get_cpu()->processor_id);
while (1) {
asm volatile ("cli; hlt");
}
}