acpi: add APIC irq ack and legacy vector remapping
This commit is contained in:
@@ -11,6 +11,7 @@ extern "C" {
|
||||
|
||||
#define ACPI_MADT_LAPIC 0x00
|
||||
#define ACPI_MADT_IOAPIC 0x01
|
||||
#define ACPI_MADT_IRQSRC_OVERRIDE 0x02
|
||||
#define ACPI_MADT_LAPIC_OVERRIDE 0x05
|
||||
|
||||
#define ACPI_SIG_RSDP 0x2052545020445352ULL
|
||||
@@ -79,6 +80,22 @@ struct acpi_madt_record {
|
||||
uint8_t r_length;
|
||||
} __packed;
|
||||
|
||||
struct acpi_madt_ioapic {
|
||||
uint8_t io_apic_id;
|
||||
uint8_t io_reserved;
|
||||
uint32_t io_address;
|
||||
uint32_t io_intbase;
|
||||
} __packed;
|
||||
|
||||
struct acpi_madt_irqsrc_override {
|
||||
uint8_t irq_bus;
|
||||
/* the irq vector as delivered from the APIC to the CPU */
|
||||
uint8_t irq_destvec;
|
||||
/* the irq vector as delivered from the hardware to the APIC */
|
||||
uint32_t irq_srcvec;
|
||||
uint16_t irq_flags;
|
||||
} __packed;
|
||||
|
||||
struct lapic_record {
|
||||
uint8_t l_cpu_id;
|
||||
uint8_t l_apic_id;
|
||||
@@ -99,6 +116,8 @@ extern kern_status_t smp_init(void);
|
||||
|
||||
extern struct acpi_sdt *acpi_find_sdt(uint32_t sig);
|
||||
|
||||
extern void irq_ack(unsigned int vec);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
39
arch/x86_64/include/arch/acpi/io_apic.hpp
Normal file
39
arch/x86_64/include/arch/acpi/io_apic.hpp
Normal file
@@ -0,0 +1,39 @@
|
||||
#ifndef ARCH_ACPI_IOAPIC_HPP_
|
||||
#define ARCH_ACPI_IOAPIC_HPP_
|
||||
|
||||
#include <stdint.h>
|
||||
#include <socks/status.h>
|
||||
#include <socks/queue.h>
|
||||
|
||||
namespace arch::acpi {
|
||||
struct io_apic {
|
||||
uint32_t *io_base = nullptr;
|
||||
unsigned int io_first_irq = 0;
|
||||
unsigned int io_nr_irq = 0;
|
||||
queue_entry_t io_entry;
|
||||
|
||||
struct irq_entry {
|
||||
uint64_t irq_vec : 8;
|
||||
uint64_t irq_delivery : 3;
|
||||
uint64_t irq_destmode : 1;
|
||||
uint64_t irq_status : 1;
|
||||
uint64_t irq_polarity : 1;
|
||||
uint64_t irq_irr : 1;
|
||||
uint64_t irq_triggermode : 1;
|
||||
uint64_t irq_mask : 1;
|
||||
uint64_t irq_resv : 39;
|
||||
uint64_t irq_dest : 8;
|
||||
};
|
||||
|
||||
io_apic(uint32_t *base, unsigned int first_irq);
|
||||
|
||||
uint32_t read(uint32_t reg);
|
||||
void write(uint32_t reg, uint32_t val);
|
||||
|
||||
kern_status_t read_irq(unsigned int index, irq_entry &entry);
|
||||
void write_irq(unsigned int index, const irq_entry &entry);
|
||||
void map_irq(unsigned int src, unsigned int dest);
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
||||
19
arch/x86_64/include/arch/acpi/local_apic.hpp
Normal file
19
arch/x86_64/include/arch/acpi/local_apic.hpp
Normal file
@@ -0,0 +1,19 @@
|
||||
#ifndef ARCH_ACPI_LOCAL_APIC_HPP_
|
||||
#define ARCH_ACPI_LOCAL_APIC_HPP_
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
namespace arch::acpi {
|
||||
class local_apic {
|
||||
uint32_t *base_ = nullptr;
|
||||
|
||||
public:
|
||||
local_apic(uint32_t *base);
|
||||
|
||||
uint32_t read(uint32_t reg);
|
||||
void write(uint32_t reg, uint32_t val);
|
||||
void ack();
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -20,8 +20,11 @@ typedef struct ml_cpu_block {
|
||||
unsigned int c_cpu_id;
|
||||
} ml_cpu_block;
|
||||
|
||||
#define ml_cpu_pause() asm volatile("hlt")
|
||||
#define ml_cpu_relax() asm volatile("pause")
|
||||
#define ml_cpu_pause() __asm__ __volatile__("hlt")
|
||||
#define ml_cpu_relax() __asm__ __volatile__("pause")
|
||||
|
||||
#define ml_int_disable() __asm__ __volatile__("cli")
|
||||
#define ml_int_enable() __asm__ __volatile__("sti")
|
||||
|
||||
extern int ml_init_bootcpu(void);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user