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
15typedef 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
45typedef 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
58typedef struct timer timer;
59typedef	int32 (*timer_hook)(timer *);
60
61struct 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
81typedef 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
106typedef 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
115typedef int (*debugger_command_hook)(int argc, char **argv);
116
117
118#ifdef __cplusplus
119extern "C" {
120#endif
121
122/* interrupts, spinlock, and timers */
123extern cpu_status	disable_interrupts(void);
124extern void			restore_interrupts(cpu_status status);
125
126extern void			acquire_spinlock(spinlock *lock);
127extern void			release_spinlock(spinlock *lock);
128
129extern status_t		install_io_interrupt_handler(long interrupt_number,
130						interrupt_handler handler, void *data, ulong flags);
131extern status_t		remove_io_interrupt_handler(long interrupt_number,
132						interrupt_handler handler, void	*data);
133
134extern status_t		add_timer(timer *t, timer_hook hook, bigtime_t period,
135						int32 flags);
136extern bool			cancel_timer(timer *t);
137
138/* kernel threads */
139extern thread_id	spawn_kernel_thread(thread_func function,
140						const char *name, int32 priority, void *arg);
141
142/* signal functions */
143extern int			send_signal_etc(pid_t thread, uint signal, uint32 flags);
144
145/* virtual memory */
146extern status_t		lock_memory_etc(team_id team, void *buffer, size_t numBytes,
147						uint32 flags);
148extern status_t		lock_memory(void *buffer, size_t numBytes, uint32 flags);
149extern status_t		unlock_memory_etc(team_id team, void *address,
150						size_t numBytes, uint32 flags);
151extern status_t		unlock_memory(void *buffer, size_t numBytes, uint32 flags);
152extern status_t		get_memory_map_etc(team_id team, const void *address,
153						size_t numBytes, physical_entry *table,
154						uint32* _numEntries);
155extern int32		get_memory_map(const void *buffer, size_t size,
156						physical_entry *table, int32 numEntries);
157extern 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 */
162extern void			dprintf(const char *format, ...) _PRINTFLIKE(1, 2);
163extern void			kprintf(const char *fmt, ...) _PRINTFLIKE(1, 2);
164
165extern void 		dump_block(const char *buffer, int size, const char *prefix);
166						/* TODO: temporary API: hexdumps given buffer */
167
168extern bool			set_dprintf_enabled(bool new_state);
169
170extern void			panic(const char *format, ...) _PRINTFLIKE(1, 2);
171
172extern void			kernel_debugger(const char *message);
173extern uint64		parse_expression(const char *string);
174
175extern int			add_debugger_command(const char *name,
176						debugger_command_hook hook, const char *help);
177extern int			remove_debugger_command(const char *name,
178						debugger_command_hook hook);
179
180/* Miscellaneous */
181extern void			spin(bigtime_t microseconds);
182
183extern status_t		register_kernel_daemon(daemon_hook hook, void *arg,
184						int frequency);
185extern status_t		unregister_kernel_daemon(daemon_hook hook, void *arg);
186
187extern void			call_all_cpus(void (*func)(void *, int), void *cookie);
188extern void			call_all_cpus_sync(void (*func)(void *, int), void *cookie);
189extern void			memory_read_barrier(void);
190extern void			memory_write_barrier(void);
191
192/* safe methods to access user memory without having to lock it */
193extern status_t		user_memcpy(void *to, const void *from, size_t size);
194extern ssize_t		user_strlcpy(char *to, const char *from, size_t size);
195extern status_t		user_memset(void *start, char c, size_t count);
196
197#ifdef __cplusplus
198}
199#endif
200
201#endif	/* _KERNEL_EXPORT_H */
202