1/*
2 * Copyright 2003-2010, Axel Dörfler, axeld@pinc-software.de.
3 * Distributed under the terms of the MIT License.
4 *
5 * Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
6 * Distributed under the terms of the NewOS License.
7 */
8#ifndef _KERNEL_INT_H
9#define _KERNEL_INT_H
10
11
12#include <KernelExport.h>
13#include <arch/int.h>
14
15#include <util/list.h>
16
17// private install_io_interrupt_handler() flags
18#define B_NO_LOCK_VECTOR	0x100
19#define B_NO_HANDLED_INFO	0x200
20
21struct kernel_args;
22
23
24enum interrupt_type {
25	INTERRUPT_TYPE_EXCEPTION,
26	INTERRUPT_TYPE_IRQ,
27	INTERRUPT_TYPE_LOCAL_IRQ,
28	INTERRUPT_TYPE_SYSCALL,
29	INTERRUPT_TYPE_ICI,
30	INTERRUPT_TYPE_UNKNOWN
31};
32
33struct irq_assignment {
34	list_link	link;
35
36	uint32		irq;
37	uint32		count;
38
39	int32		handlers_count;
40
41	int32		load;
42	int32		cpu;
43};
44
45
46#ifdef __cplusplus
47extern "C" {
48#endif
49
50status_t int_init(struct kernel_args* args);
51status_t int_init_post_vm(struct kernel_args* args);
52status_t int_init_io(struct kernel_args* args);
53status_t int_init_post_device_manager(struct kernel_args* args);
54int int_io_interrupt_handler(int vector, bool levelTriggered);
55
56bool interrupts_enabled(void);
57
58static inline void
59enable_interrupts(void)
60{
61	arch_int_enable_interrupts();
62}
63
64static inline bool
65are_interrupts_enabled(void)
66{
67	return arch_int_are_interrupts_enabled();
68}
69
70#ifdef __cplusplus
71}
72#endif
73
74
75// map those directly to the arch versions, so they can be inlined
76#define disable_interrupts()		arch_int_disable_interrupts()
77#define restore_interrupts(status)	arch_int_restore_interrupts(status)
78
79
80status_t reserve_io_interrupt_vectors(long count, long startVector,
81	enum interrupt_type type);
82status_t allocate_io_interrupt_vectors(long count, long *startVector,
83	enum interrupt_type type);
84void free_io_interrupt_vectors(long count, long startVector);
85
86void assign_io_interrupt_to_cpu(long vector, int32 cpu);
87
88#endif /* _KERNEL_INT_H */
89