PatchworkOS  966e257
A non-POSIX operating system.
Loading...
Searching...
No Matches
apic.c
Go to the documentation of this file.
4
5#include <kernel/cpu/cpu.h>
6#include <kernel/log/log.h>
8
9#include <kernel/defs.h>
10
11/**
12 * @brief Advanced Programmable Interrupt Controller.
13 * @defgroup modules_drivers_apic APIC
14 * @ingroup modules_drivers
15 *
16 * This module implements the Advanced Programmable Interrupt Controller (APIC) driver, which includes the per-CPU
17 * local APICs, the IO APICs and the APIC timer.
18 *
19 * @see [ACPI Specification Version 6.6](https://uefi.org/sites/default/files/resources/ACPI_Spec_6.6.pdf)
20 */
21
22static void apic_cpu_handler(cpu_t* cpu, const cpu_event_t* event)
23{
24 (void)cpu;
25
26 switch (event->type)
27 {
28 case CPU_ONLINE:
29 {
30 lapic_init(cpu);
31 }
32 break;
33 default:
34 break;
35 }
36}
37
39{
40 switch (event->type)
41 {
43 if (lapic_global_init() == ERR)
44 {
45 LOG_ERR("failed to initialize lapic\n");
46 return ERR;
47 }
48 if (apic_timer_init() == ERR)
49 {
50 LOG_ERR("failed to initialize apic timer\n");
51 return ERR;
52 }
53 if (ioapic_all_init() == ERR)
54 {
55 LOG_ERR("failed to initialize ioapics\n");
56 return ERR;
57 }
59 {
60 LOG_ERR("failed to register apic cpu event handler\n");
61 return ERR;
62 }
63 break;
64 default:
65 break;
66 }
67
68 return 0;
69}
70
71MODULE_INFO("APIC Driver", "Kai Norberg", "A driver for the APIC, local APIC and IOAPIC", OS_VERSION, "MIT", "PNP0003");
static void apic_cpu_handler(cpu_t *cpu, const cpu_event_t *event)
Definition apic.c:22
uint64_t _module_procedure(const module_event_t *event)
Definition apic.c:38
uint64_t cpu_handler_register(cpu_func_t func)
Registers a CPU event handler for all CPUs.
Definition cpu.c:100
@ CPU_ONLINE
Definition cpu.h:82
#define LOG_ERR(format,...)
Definition log.h:108
#define MODULE_INFO(_name, _author, _description, _version, _licence, _deviceTypes)
Macro to define module information.
Definition module.h:200
@ MODULE_EVENT_DEVICE_ATTACH
Definition module.h:251
#define ERR
Integer error value.
Definition ERR.h:17
uint64_t ioapic_all_init(void)
Initialize all IO APICs found in the MADT.
Definition ioapic.c:91
void lapic_init(cpu_t *cpu)
Initialize the local APIC for a CPU.
Definition lapic.c:28
uint64_t lapic_global_init(void)
Initialize the local APIC subsystem.
Definition lapic.c:76
uint64_t apic_timer_init(void)
Initialize the APIC timer subsystem.
Definition apic_timer.c:86
__UINT64_TYPE__ uint64_t
Definition stdint.h:17
CPU event structure.
Definition cpu.h:90
cpu_event_type_t type
Definition cpu.h:91
CPU structure.
Definition cpu.h:122
module_event_type_t type
Definition module.h:268