xref: /haiku/headers/os/drivers/KernelExport.h (revision aa4b5749d64af0c0573513c27296af16f4680367)
1 /*
2  * Copyright 2005-2008, Haiku Inc. All Rights Reserved.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef _KERNEL_EXPORT_H
6 #define _KERNEL_EXPORT_H
7 
8 
9 #include <SupportDefs.h>
10 #include <OS.h>
11 
12 
13 /* interrupts and spinlocks */
14 
15 typedef ulong cpu_status;
16 
17 // WARNING: For Haiku debugging only! This changes the spinlock type in a
18 // binary incompatible way!
19 //#define B_DEBUG_SPINLOCK_CONTENTION	1
20 
21 #if B_DEBUG_SPINLOCK_CONTENTION
22 	typedef struct {
23 		vint32	lock;
24 		vint32	count_low;
25 		vint32	count_high;
26 	} spinlock;
27 
28 #	define B_SPINLOCK_INITIALIZER { 0, 0, 0 }
29 #	define B_INITIALIZE_SPINLOCK(spinlock)	do {	\
30 			(spinlock)->lock = 0;					\
31 			(spinlock)->count_low = 0;				\
32 			(spinlock)->count_high = 0;				\
33 		} while (false)
34 #	define B_SPINLOCK_IS_LOCKED(spinlock)	((spinlock)->lock > 0)
35 #else
36 	typedef vint32 spinlock;
37 
38 #	define B_SPINLOCK_INITIALIZER 0
39 #	define B_INITIALIZE_SPINLOCK(lock)	do { *(lock) = 0; } while (false)
40 #	define B_SPINLOCK_IS_LOCKED(lock)	(*(lock) > 0)
41 #endif
42 
43 /* interrupt handling support for device drivers */
44 
45 typedef int32 (*interrupt_handler)(void *data);
46 
47 /* Values returned by interrupt handlers */
48 #define B_UNHANDLED_INTERRUPT	0	/* pass to next handler */
49 #define B_HANDLED_INTERRUPT		1	/* don't pass on */
50 #define B_INVOKE_SCHEDULER		2	/* don't pass on; invoke the scheduler */
51 
52 /* Flags that can be passed to install_io_interrupt_handler() */
53 #define B_NO_ENABLE_COUNTER		1
54 
55 
56 /* timer interrupts services */
57 
58 typedef struct timer timer;
59 typedef	int32 (*timer_hook)(timer *);
60 
61 struct timer {
62 	struct timer *next;
63 	int64		schedule_time;
64 	void		*user_data;
65 	uint16		flags;
66 	uint16		cpu;
67 	timer_hook	hook;
68 	bigtime_t	period;
69 };
70 
71 #define B_ONE_SHOT_ABSOLUTE_TIMER	1
72 #define	B_ONE_SHOT_RELATIVE_TIMER	2
73 #define	B_PERIODIC_TIMER			3
74 
75 
76 /* virtual memory buffer functions */
77 
78 #define B_DMA_IO		0x00000001
79 #define B_READ_DEVICE	0x00000002
80 
81 typedef struct {
82 	phys_addr_t	address;	/* address in physical memory */
83 	phys_size_t	size;		/* size of block */
84 } physical_entry;
85 
86 /* address specifications for mapping physical memory */
87 #define	B_ANY_KERNEL_BLOCK_ADDRESS	(B_ANY_KERNEL_ADDRESS + 1)
88 
89 /* area protection flags for the kernel */
90 #define B_KERNEL_READ_AREA			16
91 #define B_KERNEL_WRITE_AREA			32
92 #define B_USER_CLONEABLE_AREA		256
93 
94 /* MTR attributes for mapping physical memory (Intel Architecture only) */
95 // TODO: rename those to something more meaningful
96 #define	B_MTR_UC	0x10000000
97 #define	B_MTR_WC	0x20000000
98 #define	B_MTR_WT	0x30000000
99 #define	B_MTR_WP	0x40000000
100 #define	B_MTR_WB	0x50000000
101 #define	B_MTR_MASK	0xf0000000
102 
103 
104 /* kernel daemon service */
105 
106 typedef void (*daemon_hook)(void *arg, int iteration);
107 
108 
109 /* kernel debugging facilities */
110 
111 /* special return codes for kernel debugger */
112 #define  B_KDEBUG_CONT   2
113 #define  B_KDEBUG_QUIT   3
114 
115 typedef int (*debugger_command_hook)(int argc, char **argv);
116 
117 
118 #ifdef __cplusplus
119 extern "C" {
120 #endif
121 
122 /* interrupts, spinlock, and timers */
123 extern cpu_status	disable_interrupts(void);
124 extern void			restore_interrupts(cpu_status status);
125 
126 extern void			acquire_spinlock(spinlock *lock);
127 extern void			release_spinlock(spinlock *lock);
128 
129 extern status_t		install_io_interrupt_handler(long interrupt_number,
130 						interrupt_handler handler, void *data, ulong flags);
131 extern status_t		remove_io_interrupt_handler(long interrupt_number,
132 						interrupt_handler handler, void	*data);
133 
134 extern status_t		add_timer(timer *t, timer_hook hook, bigtime_t period,
135 						int32 flags);
136 extern bool			cancel_timer(timer *t);
137 
138 /* kernel threads */
139 extern thread_id	spawn_kernel_thread(thread_func function,
140 						const char *name, int32 priority, void *arg);
141 
142 /* signal functions */
143 extern int			send_signal_etc(pid_t thread, uint signal, uint32 flags);
144 
145 /* virtual memory */
146 extern status_t		lock_memory_etc(team_id team, void *buffer, size_t numBytes,
147 						uint32 flags);
148 extern status_t		lock_memory(void *buffer, size_t numBytes, uint32 flags);
149 extern status_t		unlock_memory_etc(team_id team, void *address,
150 						size_t numBytes, uint32 flags);
151 extern status_t		unlock_memory(void *buffer, size_t numBytes, uint32 flags);
152 extern status_t		get_memory_map_etc(team_id team, const void *address,
153 						size_t numBytes, physical_entry *table,
154 						uint32* _numEntries);
155 extern int32		get_memory_map(const void *buffer, size_t size,
156 						physical_entry *table, int32 numEntries);
157 extern area_id		map_physical_memory(const char *areaName,
158 						phys_addr_t physicalAddress, size_t size, uint32 flags,
159 						uint32 protection, void **_mappedAddress);
160 
161 /* kernel debugging facilities */
162 extern void			dprintf(const char *format, ...) _PRINTFLIKE(1, 2);
163 extern void			dvprintf(const char *format, va_list args);
164 extern void			kprintf(const char *fmt, ...) _PRINTFLIKE(1, 2);
165 
166 extern void 		dump_block(const char *buffer, int size, const char *prefix);
167 						/* TODO: temporary API: hexdumps given buffer */
168 
169 extern bool			set_dprintf_enabled(bool new_state);
170 
171 extern void			panic(const char *format, ...) _PRINTFLIKE(1, 2);
172 
173 extern void			kernel_debugger(const char *message);
174 extern uint64		parse_expression(const char *string);
175 
176 extern int			add_debugger_command(const char *name,
177 						debugger_command_hook hook, const char *help);
178 extern int			remove_debugger_command(const char *name,
179 						debugger_command_hook hook);
180 
181 /* Miscellaneous */
182 extern void			spin(bigtime_t microseconds);
183 
184 extern status_t		register_kernel_daemon(daemon_hook hook, void *arg,
185 						int frequency);
186 extern status_t		unregister_kernel_daemon(daemon_hook hook, void *arg);
187 
188 extern void			call_all_cpus(void (*func)(void *, int), void *cookie);
189 extern void			call_all_cpus_sync(void (*func)(void *, int), void *cookie);
190 extern void			memory_read_barrier(void);
191 extern void			memory_write_barrier(void);
192 
193 /* safe methods to access user memory without having to lock it */
194 extern status_t		user_memcpy(void *to, const void *from, size_t size);
195 extern ssize_t		user_strlcpy(char *to, const char *from, size_t size);
196 extern status_t		user_memset(void *start, char c, size_t count);
197 
198 #ifdef __cplusplus
199 }
200 #endif
201 
202 #endif	/* _KERNEL_EXPORT_H */
203