1// SPDX-License-Identifier: GPL-3.0-or-later
2
3#include "mos/interrupt/interrupt.hpp"
4
5#include "mos/lib/structures/list.hpp"
6
7#include <mos/allocator.hpp>
8#include <mos_stdlib.hpp>
9
10struct interrupt_handler_t : mos::NamedType<"InterruptHandler">
11{
12 as_linked_list;
13 u32 irq;
14 irq_serve_t handler;
15 void *data;
16};
17
18static spinlock_t irq_handlers_lock;
19static list_head irq_handlers;
20
21void interrupt_entry(u32 irq)
22{
23 // spinlock_acquire(&irq_handlers_lock);
24
25 list_foreach(interrupt_handler_t, handler, irq_handlers)
26 {
27 if (handler->irq == irq)
28 if (handler->handler(irq, handler->data))
29 break; // interrupt was handled
30 }
31
32 // spinlock_release(&irq_handlers_lock);
33}
34
35void interrupt_handler_register(u32 irq, irq_serve_t handler, void *data)
36{
37 interrupt_handler_t *new_handler = mos::create<interrupt_handler_t>();
38 new_handler->irq = irq;
39 new_handler->handler = handler;
40 new_handler->data = data;
41
42 spinlock_acquire(&irq_handlers_lock);
43 list_node_append(head: &irq_handlers, item: &new_handler->list_node);
44 spinlock_release(&irq_handlers_lock);
45}
46