xref: /haiku/headers/os/kernel/OS.h (revision 97901ec593ec4dd50ac115c1c35a6d72f6e489a5)
1 /*
2  * Copyright 2004-2009, Haiku Inc. All Rights Reserved.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef _OS_H
6 #define _OS_H
7 
8 //! Kernel specific structures and functions
9 
10 #include <pthread.h>
11 #include <stdarg.h>
12 
13 #include <SupportDefs.h>
14 #include <StorageDefs.h>
15 
16 
17 #ifdef __cplusplus
18 extern "C" {
19 #endif
20 
21 /* System constants */
22 
23 #define B_OS_NAME_LENGTH	32
24 #define B_PAGE_SIZE			4096
25 #define B_INFINITE_TIMEOUT	(9223372036854775807LL)
26 
27 enum {
28 	B_TIMEOUT						= 0x8,	/* relative timeout */
29 	B_RELATIVE_TIMEOUT				= 0x8,	/* fails after a relative timeout
30 												with B_TIMED_OUT */
31 	B_ABSOLUTE_TIMEOUT				= 0x10,	/* fails after an absolute timeout
32 												with B_TIMED_OUT */
33 
34 	/* experimental Haiku only API */
35 	B_TIMEOUT_REAL_TIME_BASE		= 0x40,
36 	B_ABSOLUTE_REAL_TIME_TIMEOUT	= B_ABSOLUTE_TIMEOUT
37 										| B_TIMEOUT_REAL_TIME_BASE
38 };
39 
40 
41 /* Types */
42 
43 typedef int32 area_id;
44 typedef int32 port_id;
45 typedef int32 sem_id;
46 typedef int32 team_id;
47 typedef int32 thread_id;
48 
49 
50 /* Areas */
51 
52 typedef struct area_info {
53 	area_id		area;
54 	char		name[B_OS_NAME_LENGTH];
55 	size_t		size;
56 	uint32		lock;
57 	uint32		protection;
58 	team_id		team;
59 	uint32		ram_size;
60 	uint32		copy_count;
61 	uint32		in_count;
62 	uint32		out_count;
63 	void		*address;
64 } area_info;
65 
66 /* area locking */
67 #define B_NO_LOCK				0
68 #define B_LAZY_LOCK				1
69 #define B_FULL_LOCK				2
70 #define B_CONTIGUOUS			3
71 #define	B_LOMEM					4
72 
73 /* address spec for create_area(), and clone_area() */
74 #define B_ANY_ADDRESS			0
75 #define B_EXACT_ADDRESS			1
76 #define B_BASE_ADDRESS			2
77 #define B_CLONE_ADDRESS			3
78 #define	B_ANY_KERNEL_ADDRESS	4
79 
80 /* area protection */
81 #define B_READ_AREA				1
82 #define B_WRITE_AREA			2
83 
84 extern area_id		create_area(const char *name, void **startAddress,
85 						uint32 addressSpec, size_t size, uint32 lock,
86 						uint32 protection);
87 extern area_id		clone_area(const char *name, void **destAddress,
88 						uint32 addressSpec, uint32 protection, area_id source);
89 extern area_id		find_area(const char *name);
90 extern area_id		area_for(void *address);
91 extern status_t		delete_area(area_id id);
92 extern status_t		resize_area(area_id id, size_t newSize);
93 extern status_t		set_area_protection(area_id id, uint32 newProtection);
94 
95 /* system private, use macros instead */
96 extern status_t		_get_area_info(area_id id, area_info *areaInfo, size_t size);
97 extern status_t		_get_next_area_info(team_id team, int32 *cookie,
98 						area_info *areaInfo, size_t size);
99 
100 #define get_area_info(id, areaInfo) \
101 	_get_area_info((id), (areaInfo),sizeof(*(areaInfo)))
102 #define get_next_area_info(team, cookie, areaInfo) \
103 	_get_next_area_info((team), (cookie), (areaInfo), sizeof(*(areaInfo)))
104 
105 
106 /* Ports */
107 
108 typedef struct port_info {
109 	port_id		port;
110 	team_id		team;
111 	char		name[B_OS_NAME_LENGTH];
112 	int32		capacity;		/* queue depth */
113 	int32		queue_count;	/* # msgs waiting to be read */
114 	int32		total_count;	/* total # msgs read so far */
115 } port_info;
116 
117 extern port_id		create_port(int32 capacity, const char *name);
118 extern port_id		find_port(const char *name);
119 extern ssize_t		read_port(port_id port, int32 *code, void *buffer,
120 						size_t bufferSize);
121 extern ssize_t		read_port_etc(port_id port, int32 *code, void *buffer,
122 						size_t bufferSize, uint32 flags, bigtime_t timeout);
123 extern status_t		write_port(port_id port, int32 code, const void *buffer,
124 						size_t bufferSize);
125 extern status_t		write_port_etc(port_id port, int32 code, const void *buffer,
126 						size_t bufferSize, uint32 flags, bigtime_t timeout);
127 extern status_t		close_port(port_id port);
128 extern status_t		delete_port(port_id port);
129 
130 extern ssize_t		port_buffer_size(port_id port);
131 extern ssize_t		port_buffer_size_etc(port_id port, uint32 flags,
132 						bigtime_t timeout);
133 extern ssize_t		port_count(port_id port);
134 extern status_t		set_port_owner(port_id port, team_id team);
135 
136 /* system private, use the macros instead */
137 extern status_t		_get_port_info(port_id port, port_info *portInfo,
138 						size_t portInfoSize);
139 extern status_t		_get_next_port_info(team_id team, int32 *cookie,
140 						port_info *portInfo, size_t portInfoSize);
141 
142 #define get_port_info(port, info) \
143 	_get_port_info((port), (info), sizeof(*(info)))
144 #define get_next_port_info(team, cookie, info) \
145 	_get_next_port_info((team), (cookie), (info), sizeof(*(info)))
146 
147 
148 /* WARNING: The following is Haiku experimental API. It might be removed or
149    changed in the future. */
150 
151 typedef struct port_message_info {
152 	size_t		size;
153 	uid_t		sender;
154 	gid_t		sender_group;
155 	team_id		sender_team;
156 } port_message_info;
157 
158 /* similar to port_buffer_size_etc(), but returns (more) info */
159 extern status_t		_get_port_message_info_etc(port_id port,
160 						port_message_info *info, size_t infoSize, uint32 flags,
161 						bigtime_t timeout);
162 
163 #define get_port_message_info_etc(port, info, flags, timeout) \
164 	_get_port_message_info_etc((port), (info), sizeof(*(info)), flags, timeout)
165 
166 
167 /* Semaphores */
168 
169 typedef struct sem_info {
170 	sem_id		sem;
171 	team_id		team;
172 	char		name[B_OS_NAME_LENGTH];
173 	int32		count;
174 	thread_id	latest_holder;
175 } sem_info;
176 
177 /* semaphore flags */
178 enum {
179 	B_CAN_INTERRUPT				= 0x01,	/* acquisition of the semaphore can be
180 										   interrupted (system use only) */
181 	B_CHECK_PERMISSION			= 0x04,	/* ownership will be checked (system use
182 										   only) */
183 	B_KILL_CAN_INTERRUPT		= 0x20,	/* acquisition of the semaphore can be
184 										   interrupted by SIGKILL[THR], even
185 										   if not B_CAN_INTERRUPT (system use
186 										   only) */
187 
188 	/* release_sem_etc() only flags */
189 	B_DO_NOT_RESCHEDULE			= 0x02,	/* thread is not rescheduled */
190 	B_RELEASE_ALL				= 0x08,	/* all waiting threads will be woken up,
191 										   count will be zeroed */
192 	B_RELEASE_IF_WAITING_ONLY	= 0x10	/* release count only if there are any
193 										   threads waiting */
194 };
195 
196 extern sem_id		create_sem(int32 count, const char *name);
197 extern status_t		delete_sem(sem_id id);
198 extern status_t		acquire_sem(sem_id id);
199 extern status_t		acquire_sem_etc(sem_id id, int32 count, uint32 flags,
200 						bigtime_t timeout);
201 extern status_t		release_sem(sem_id id);
202 extern status_t		release_sem_etc(sem_id id, int32 count, uint32 flags);
203 /* TODO: the following two calls are not part of the BeOS API, and might be
204    changed or even removed for the final release of Haiku R1 */
205 extern status_t		switch_sem(sem_id semToBeReleased, sem_id id);
206 extern status_t		switch_sem_etc(sem_id semToBeReleased, sem_id id,
207 						int32 count, uint32 flags, bigtime_t timeout);
208 extern status_t		get_sem_count(sem_id id, int32 *threadCount);
209 extern status_t		set_sem_owner(sem_id id, team_id team);
210 
211 /* system private, use the macros instead */
212 extern status_t		_get_sem_info(sem_id id, struct sem_info *info,
213 						size_t infoSize);
214 extern status_t		_get_next_sem_info(team_id team, int32 *cookie,
215 						struct sem_info *info, size_t infoSize);
216 
217 #define get_sem_info(sem, info) \
218 	_get_sem_info((sem), (info), sizeof(*(info)))
219 
220 #define get_next_sem_info(team, cookie, info) \
221 	_get_next_sem_info((team), (cookie), (info), sizeof(*(info)))
222 
223 
224 /* Teams */
225 
226 typedef struct {
227 	team_id			team;
228 	int32			thread_count;
229 	int32			image_count;
230 	int32			area_count;
231 	thread_id		debugger_nub_thread;
232 	port_id			debugger_nub_port;
233 	int32			argc;
234 	char			args[64];
235 	uid_t			uid;
236 	gid_t			gid;
237 } team_info;
238 
239 #define B_CURRENT_TEAM	0
240 #define B_SYSTEM_TEAM	1
241 
242 extern status_t		kill_team(team_id team);
243 	/* see also: send_signal() */
244 
245 /* system private, use macros instead */
246 extern status_t		_get_team_info(team_id id, team_info *info, size_t size);
247 extern status_t		_get_next_team_info(int32 *cookie, team_info *info,
248 						size_t size);
249 
250 #define get_team_info(id, info) \
251 	_get_team_info((id), (info), sizeof(*(info)))
252 
253 #define get_next_team_info(cookie, info) \
254 	_get_next_team_info((cookie), (info), sizeof(*(info)))
255 
256 /* team usage info */
257 
258 typedef struct {
259 	bigtime_t		user_time;
260 	bigtime_t		kernel_time;
261 } team_usage_info;
262 
263 enum {
264 	/* compatible to sys/resource.h RUSAGE_SELF and RUSAGE_CHILDREN */
265 	B_TEAM_USAGE_SELF		= 0,
266 	B_TEAM_USAGE_CHILDREN	= -1
267 };
268 
269 /* system private, use macros instead */
270 extern status_t		_get_team_usage_info(team_id team, int32 who,
271 						team_usage_info *info, size_t size);
272 
273 #define get_team_usage_info(team, who, info) \
274 	_get_team_usage_info((team), (who), (info), sizeof(*(info)))
275 
276 
277 /* Threads */
278 
279 typedef enum {
280 	B_THREAD_RUNNING	= 1,
281 	B_THREAD_READY,
282 	B_THREAD_RECEIVING,
283 	B_THREAD_ASLEEP,
284 	B_THREAD_SUSPENDED,
285 	B_THREAD_WAITING
286 } thread_state;
287 
288 typedef struct {
289 	thread_id		thread;
290 	team_id			team;
291 	char			name[B_OS_NAME_LENGTH];
292 	thread_state	state;
293 	int32			priority;
294 	sem_id			sem;
295 	bigtime_t		user_time;
296 	bigtime_t		kernel_time;
297 	void			*stack_base;
298 	void			*stack_end;
299 } thread_info;
300 
301 #define B_IDLE_PRIORITY					0
302 #define B_LOWEST_ACTIVE_PRIORITY		1
303 #define B_LOW_PRIORITY					5
304 #define B_NORMAL_PRIORITY				10
305 #define B_DISPLAY_PRIORITY				15
306 #define	B_URGENT_DISPLAY_PRIORITY		20
307 #define	B_REAL_TIME_DISPLAY_PRIORITY	100
308 #define	B_URGENT_PRIORITY				110
309 #define B_REAL_TIME_PRIORITY			120
310 
311 #define B_SYSTEM_TIMEBASE				0
312 
313 #define B_FIRST_REAL_TIME_PRIORITY		B_REAL_TIME_DISPLAY_PRIORITY
314 
315 typedef status_t (*thread_func)(void *);
316 #define thread_entry thread_func
317 	/* thread_entry is for backward compatibility only! Use thread_func */
318 
319 extern thread_id	spawn_thread(thread_func, const char *name, int32 priority,
320 						void *data);
321 extern status_t		kill_thread(thread_id thread);
322 extern status_t		resume_thread(thread_id thread);
323 extern status_t		suspend_thread(thread_id thread);
324 
325 extern status_t		rename_thread(thread_id thread, const char *newName);
326 extern status_t		set_thread_priority(thread_id thread, int32 newPriority);
327 extern void			exit_thread(status_t status);
328 extern status_t		wait_for_thread(thread_id thread, status_t *returnValue);
329 extern status_t		on_exit_thread(void (*callback)(void *), void *data);
330 
331 extern thread_id 	find_thread(const char *name);
332 
333 extern status_t		send_data(thread_id thread, int32 code, const void *buffer,
334 						size_t bufferSize);
335 extern int32		receive_data(thread_id *sender, void *buffer,
336 						size_t bufferSize);
337 extern bool			has_data(thread_id thread);
338 
339 extern status_t		snooze(bigtime_t amount);
340 extern status_t		snooze_etc(bigtime_t amount, int timeBase, uint32 flags);
341 extern status_t		snooze_until(bigtime_t time, int timeBase);
342 
343 /* system private, use macros instead */
344 extern status_t		_get_thread_info(thread_id id, thread_info *info, size_t size);
345 extern status_t		_get_next_thread_info(team_id team, int32 *cookie,
346 						thread_info *info, size_t size);
347 
348 #define get_thread_info(id, info) \
349 	_get_thread_info((id), (info), sizeof(*(info)))
350 
351 #define get_next_thread_info(team, cookie, info) \
352 	_get_next_thread_info((team), (cookie), (info), sizeof(*(info)))
353 
354 /* bridge to the pthread API */
355 extern thread_id	get_pthread_thread_id(pthread_t thread);
356 /* TODO: Would be nice to have, but we use TLS to associate a thread with its
357    pthread object. So this is not trivial to implement.
358 extern status_t		convert_to_pthread(thread_id thread, pthread_t *_thread);
359 */
360 
361 
362 /* Time */
363 
364 extern uint32		real_time_clock(void);
365 extern void			set_real_time_clock(uint32 secsSinceJan1st1970);
366 extern bigtime_t	real_time_clock_usecs(void);
367 extern status_t		set_timezone(const char *timezone);
368 extern bigtime_t	system_time(void);
369 						/* time since booting in microseconds */
370 extern nanotime_t	system_time_nsecs();
371 						/* time since booting in nanoseconds */
372 
373 /* Alarm */
374 
375 enum {
376 	B_ONE_SHOT_ABSOLUTE_ALARM	= 1,
377 	B_ONE_SHOT_RELATIVE_ALARM,
378 	B_PERIODIC_ALARM			/* "when" specifies the period */
379 };
380 
381 extern bigtime_t	set_alarm(bigtime_t when, uint32 flags);
382 
383 
384 /* Debugger */
385 
386 extern void			debugger(const char *message);
387 
388 /*
389    calling this function with a non-zero value will cause your thread
390    to receive signals for any exceptional conditions that occur (i.e.
391    you'll get SIGSEGV for data access exceptions, SIGFPE for floating
392    point errors, SIGILL for illegal instructions, etc).
393 
394    to re-enable the default debugger pass a zero.
395 */
396 extern int			disable_debugger(int state);
397 
398 /* TODO: Remove. Temporary debug helper. */
399 extern void			debug_printf(const char *format, ...)
400 						__attribute__ ((format (__printf__, 1, 2)));
401 extern void			debug_vprintf(const char *format, va_list args);
402 extern void			ktrace_printf(const char *format, ...)
403 						__attribute__ ((format (__printf__, 1, 2)));
404 extern void			ktrace_vprintf(const char *format, va_list args);
405 
406 
407 /* System information */
408 
409 #if __INTEL__
410 #	define B_MAX_CPU_COUNT	8
411 #elif __POWERPC__
412 #	define B_MAX_CPU_COUNT	8
413 #elif __M68K__
414 #	define B_MAX_CPU_COUNT	1
415 #elif __ARM__
416 #	define B_MAX_CPU_COUNT	1
417 #elif __MIPSEL__
418 #	define B_MAX_CPU_COUNT	1
419 #else
420 #	warning Unknown cpu
421 #	define B_MAX_CPU_COUNT	1
422 #endif
423 
424 typedef enum cpu_types {
425 	/* TODO: add latest models */
426 
427 	/* Motorola/IBM */
428 	B_CPU_PPC_UNKNOWN					= 0,
429 	B_CPU_PPC_601						= 1,
430 	B_CPU_PPC_602						= 7,
431 	B_CPU_PPC_603						= 2,
432 	B_CPU_PPC_603e						= 3,
433 	B_CPU_PPC_603ev						= 8,
434 	B_CPU_PPC_604						= 4,
435 	B_CPU_PPC_604e						= 5,
436 	B_CPU_PPC_604ev						= 9,
437 	B_CPU_PPC_620						= 10,
438 	B_CPU_PPC_750   					= 6,
439 	B_CPU_PPC_686						= 13,
440 	B_CPU_PPC_860						= 25,
441 	B_CPU_PPC_7400						= 26,
442 	B_CPU_PPC_7410						= 27,
443 	B_CPU_PPC_7447A						= 28,
444 	B_CPU_PPC_7448						= 29,
445 	B_CPU_PPC_7450						= 30,
446 	B_CPU_PPC_7455						= 31,
447 	B_CPU_PPC_7457						= 32,
448 	B_CPU_PPC_8240						= 33,
449 	B_CPU_PPC_8245						= 34,
450 
451 	B_CPU_PPC_IBM_401A1					= 35,
452 	B_CPU_PPC_IBM_401B2					= 36,
453 	B_CPU_PPC_IBM_401C2					= 37,
454 	B_CPU_PPC_IBM_401D2					= 38,
455 	B_CPU_PPC_IBM_401E2					= 39,
456 	B_CPU_PPC_IBM_401F2					= 40,
457 	B_CPU_PPC_IBM_401G2					= 41,
458 	B_CPU_PPC_IBM_403					= 42,
459 	B_CPU_PPC_IBM_405GP					= 43,
460 	B_CPU_PPC_IBM_405L					= 44,
461 	B_CPU_PPC_IBM_750FX					= 45,
462 	B_CPU_PPC_IBM_POWER3				= 46,
463 
464 	/* Intel */
465 
466 	/* Updated according to Intel(R) Processor Identification and
467 	 * the  CPUID instruction (Table 4)
468 	 * AP-485 Intel - 24161832.pdf
469 	 */
470 	B_CPU_INTEL_x86						= 0x1000,
471 	B_CPU_INTEL_PENTIUM					= 0x1051,
472 	B_CPU_INTEL_PENTIUM75,
473 	B_CPU_INTEL_PENTIUM_486_OVERDRIVE,
474 	B_CPU_INTEL_PENTIUM_MMX,
475 	B_CPU_INTEL_PENTIUM_MMX_MODEL_4		= B_CPU_INTEL_PENTIUM_MMX,
476 	B_CPU_INTEL_PENTIUM_MMX_MODEL_8		= 0x1058,
477 	B_CPU_INTEL_PENTIUM75_486_OVERDRIVE,
478 	B_CPU_INTEL_PENTIUM_PRO				= 0x1061,
479 	B_CPU_INTEL_PENTIUM_II				= 0x1063,
480 	B_CPU_INTEL_PENTIUM_II_MODEL_3		= 0x1063,
481 	B_CPU_INTEL_PENTIUM_II_MODEL_5		= 0x1065,
482 	B_CPU_INTEL_CELERON					= 0x1066,
483 	B_CPU_INTEL_CELERON_MODEL_22		= 0x11066,
484 	B_CPU_INTEL_PENTIUM_III				= 0x1067,
485 	B_CPU_INTEL_PENTIUM_III_MODEL_8		= 0x1068,
486 	B_CPU_INTEL_PENTIUM_M				= 0x1069,
487 	B_CPU_INTEL_PENTIUM_III_XEON		= 0x106a,
488 	B_CPU_INTEL_PENTIUM_III_MODEL_11 	= 0x106b,
489 	B_CPU_INTEL_ATOM			= 0x1106c,
490 	B_CPU_INTEL_PENTIUM_M_MODEL_13		= 0x106d, /* Dothan */
491 	B_CPU_INTEL_PENTIUM_CORE,
492 	B_CPU_INTEL_PENTIUM_CORE_2,
493 	B_CPU_INTEL_PENTIUM_CORE_2_45_NM	= 0x11067, /* Core 2 on 45 nm
494 	                                                   (Core 2 Extreme,
495 	                                                   Xeon model 23 or
496 	                                                   Core 2 Duo/Quad) */
497 	B_CPU_INTEL_PENTIUM_CORE_I5_M430	= 0x21065, /* Core i5 M 430 @ 2.27 */
498 	B_CPU_INTEL_PENTIUM_CORE_I7			= 0x1106a, /* Core i7 920 @ 2.6(6) */
499 	B_CPU_INTEL_PENTIUM_CORE_I7_Q720	= 0x1106e, /* Core i7 Q720 @ 1.6 */
500 	B_CPU_INTEL_PENTIUM_IV				= 0x10f0,
501 	B_CPU_INTEL_PENTIUM_IV_MODEL_1,
502 	B_CPU_INTEL_PENTIUM_IV_MODEL_2,
503 	B_CPU_INTEL_PENTIUM_IV_MODEL_3,
504 	B_CPU_INTEL_PENTIUM_IV_MODEL_4,
505 
506 	/* AMD */
507 
508 	/* Checked with "AMD Processor Recognition Application Note"
509 	 * (Table 3)
510 	 * 20734.pdf
511 	 */
512 	B_CPU_AMD_x86						= 0x1100,
513 	B_CPU_AMD_K5_MODEL_0				= 0x1150,
514 	B_CPU_AMD_K5_MODEL_1,
515 	B_CPU_AMD_K5_MODEL_2,
516 	B_CPU_AMD_K5_MODEL_3,
517 	B_CPU_AMD_K6_MODEL_6				= 0x1156,
518 	B_CPU_AMD_K6_MODEL_7				= 0x1157,
519 	B_CPU_AMD_K6_MODEL_8				= 0x1158,
520 	B_CPU_AMD_K6_2						= 0x1158,
521 	B_CPU_AMD_K6_MODEL_9				= 0x1159,
522 	B_CPU_AMD_K6_III					= 0x1159,
523 	B_CPU_AMD_K6_III_MODEL_13			= 0x115d,
524 
525 	B_CPU_AMD_ATHLON_MODEL_1			= 0x1161,
526 	B_CPU_AMD_ATHLON_MODEL_2			= 0x1162,
527 
528 	B_CPU_AMD_DURON 					= 0x1163,
529 
530 	B_CPU_AMD_ATHLON_THUNDERBIRD		= 0x1164,
531 	B_CPU_AMD_ATHLON_XP 				= 0x1166,
532 	B_CPU_AMD_ATHLON_XP_MODEL_7,
533 	B_CPU_AMD_ATHLON_XP_MODEL_8,
534 	B_CPU_AMD_ATHLON_XP_MODEL_10		= 0x116a, /* Barton */
535 
536 	B_CPU_AMD_SEMPRON_MODEL_8			= B_CPU_AMD_ATHLON_XP_MODEL_8,
537 	B_CPU_AMD_SEMPRON_MODEL_10			= B_CPU_AMD_ATHLON_XP_MODEL_10,
538 
539 	/* According to "Revision Guide for AMD Family 10h
540 	 * Processors" (41322.pdf)
541 	 */
542 	B_CPU_AMD_PHENOM					= 0x11f2,
543 
544 	/* According to "Revision guide for AMD Athlon 64
545 	 * and AMD Opteron Processors" (25759.pdf)
546 	 */
547 	B_CPU_AMD_ATHLON_64_MODEL_3			= 0x11f3,
548 	B_CPU_AMD_ATHLON_64_MODEL_4,
549 	B_CPU_AMD_ATHLON_64_MODEL_5,
550 	B_CPU_AMD_OPTERON					= B_CPU_AMD_ATHLON_64_MODEL_5,
551 	B_CPU_AMD_ATHLON_64_FX				= B_CPU_AMD_ATHLON_64_MODEL_5,
552 	B_CPU_AMD_ATHLON_64_MODEL_7			= 0x11f7,
553 	B_CPU_AMD_ATHLON_64_MODEL_8,
554 	B_CPU_AMD_ATHLON_64_MODEL_11		= 0x11fb,
555 	B_CPU_AMD_ATHLON_64_MODEL_12,
556 	B_CPU_AMD_ATHLON_64_MODEL_14		= 0x11fe,
557 	B_CPU_AMD_ATHLON_64_MODEL_15,
558 
559 	B_CPU_AMD_GEODE_LX					= 0x115a,
560 
561 	/* VIA/Cyrix */
562 	B_CPU_CYRIX_x86						= 0x1200,
563 	B_CPU_VIA_CYRIX_x86					= 0x1200,
564 	B_CPU_CYRIX_GXm						= 0x1254,
565 	B_CPU_CYRIX_6x86MX					= 0x1260,
566 
567 	/* VIA/IDT */
568 	B_CPU_IDT_x86						= 0x1300,
569 	B_CPU_VIA_IDT_x86					= 0x1300,
570 	B_CPU_IDT_WINCHIP_C6				= 0x1354,
571 	B_CPU_IDT_WINCHIP_2					= 0x1358,
572 	B_CPU_IDT_WINCHIP_3,
573 	B_CPU_VIA_C3_SAMUEL					= 0x1366,
574 	B_CPU_VIA_C3_SAMUEL_2				= 0x1367,
575 	B_CPU_VIA_C3_EZRA_T					= 0x1368,
576 	B_CPU_VIA_C3_NEHEMIAH				= 0x1369,
577 	B_CPU_VIA_C7_ESTHER					= 0x136a,
578 	B_CPU_VIA_C7_ESTHER_2				= 0x136d,
579 	B_CPU_VIA_NANO_ISAIAH				= 0x136f,
580 
581 	/* Transmeta */
582 	B_CPU_TRANSMETA_x86					= 0x1600,
583 	B_CPU_TRANSMETA_CRUSOE				= 0x1654,
584 	B_CPU_TRANSMETA_EFFICEON			= 0x16f2,
585 	B_CPU_TRANSMETA_EFFICEON_2			= 0x16f3,
586 
587 	/* Rise */
588 	B_CPU_RISE_x86						= 0x1400,
589 	B_CPU_RISE_mP6						= 0x1450,
590 
591 	/* National Semiconductor */
592 	B_CPU_NATIONAL_x86					= 0x1500,
593 	B_CPU_NATIONAL_GEODE_GX1			= 0x1554,
594 	B_CPU_NATIONAL_GEODE_GX2,
595 
596 	/* For compatibility */
597 	B_CPU_AMD_29K						= 14,
598 	B_CPU_x86,
599 	B_CPU_MC6502,
600 	B_CPU_Z80,
601 	B_CPU_ALPHA,
602 	B_CPU_MIPS,
603 	B_CPU_HPPA,
604 	B_CPU_M68K,
605 	B_CPU_ARM,
606 	B_CPU_SH,
607 	B_CPU_SPARC
608 } cpu_type;
609 
610 #define B_CPU_x86_VENDOR_MASK	0xff00
611 
612 #ifdef __INTEL__
613 typedef union {
614 	struct {
615 		uint32	max_eax;
616 		char	vendor_id[12];
617 	} eax_0;
618 
619 	struct {
620 		uint32	stepping		: 4;
621 		uint32	model			: 4;
622 		uint32	family			: 4;
623 		uint32	type			: 2;
624 		uint32	reserved_0		: 2;
625 		uint32	extended_model	: 4;
626 		uint32	extended_family	: 8;
627 		uint32	reserved_1		: 4;
628 
629 		uint32	brand_index		: 8;
630 		uint32	clflush			: 8;
631 		uint32	logical_cpus	: 8;
632 		uint32	apic_id			: 8;
633 
634 		uint32	features;
635 		uint32	extended_features;
636 	} eax_1;
637 
638 	struct {
639 		uint8	call_num;
640 		uint8	cache_descriptors[15];
641 	} eax_2;
642 
643 	struct {
644 		uint32	reserved[2];
645 		uint32	serial_number_high;
646 		uint32	serial_number_low;
647 	} eax_3;
648 
649 	char		as_chars[16];
650 
651 	struct {
652 		uint32	eax;
653 		uint32	ebx;
654 		uint32	edx;
655 		uint32	ecx;
656 	} regs;
657 } cpuid_info;
658 
659 extern status_t		get_cpuid(cpuid_info *info, uint32 eaxRegister,
660 						uint32 cpuNum);
661 #endif
662 
663 
664 typedef enum platform_types {
665 	B_BEBOX_PLATFORM = 0,
666 	B_MAC_PLATFORM,
667 	B_AT_CLONE_PLATFORM,
668 	B_ENIAC_PLATFORM,
669 	B_APPLE_II_PLATFORM,
670 	B_CRAY_PLATFORM,
671 	B_LISA_PLATFORM,
672 	B_TI_994A_PLATFORM,
673 	B_TIMEX_SINCLAIR_PLATFORM,
674 	B_ORAC_1_PLATFORM,
675 	B_HAL_PLATFORM,
676 	B_BESM_6_PLATFORM,
677 	B_MK_61_PLATFORM,
678 	B_NINTENDO_64_PLATFORM,
679 	B_AMIGA_PLATFORM,
680 	B_ATARI_PLATFORM
681 } platform_type;
682 
683 typedef struct {
684 	bigtime_t	active_time;	/* usec of doing useful work since boot */
685 } cpu_info;
686 
687 
688 typedef int32 machine_id[2];	/* unique machine ID */
689 
690 typedef struct {
691 	machine_id		id;					/* unique machine ID */
692 	bigtime_t		boot_time;			/* time of boot (usecs since 1/1/1970) */
693 
694 	int32			cpu_count;			/* number of cpus */
695 	enum cpu_types	cpu_type;			/* type of cpu */
696 	int32			cpu_revision;		/* revision # of cpu */
697 	cpu_info		cpu_infos[B_MAX_CPU_COUNT];	/* info about individual cpus */
698 	int64			cpu_clock_speed;	/* processor clock speed (Hz) */
699 	int64			bus_clock_speed;	/* bus clock speed (Hz) */
700 	enum platform_types platform_type;	/* type of machine we're on */
701 
702 	int32			max_pages;			/* total # physical pages */
703 	int32			used_pages;			/* # physical pages in use */
704 	int32			page_faults;		/* # of page faults */
705 	int32			max_sems;
706 	int32			used_sems;
707 	int32			max_ports;
708 	int32			used_ports;
709 	int32			max_threads;
710 	int32			used_threads;
711 	int32			max_teams;
712 	int32			used_teams;
713 
714 	char			kernel_name[B_FILE_NAME_LENGTH];
715 	char			kernel_build_date[B_OS_NAME_LENGTH];
716 	char			kernel_build_time[B_OS_NAME_LENGTH];
717 	int64			kernel_version;
718 
719 	bigtime_t		_busy_wait_time;	/* reserved for whatever */
720 	int32			cached_pages;
721 
722 	uint32			abi;				/* the system API */
723 
724 	int32			pad[2];
725 } system_info;
726 
727 /* system private, use macro instead */
728 extern status_t		_get_system_info(system_info *info, size_t size);
729 
730 #define get_system_info(info) \
731 	_get_system_info((info), sizeof(*(info)))
732 
733 extern int32		is_computer_on(void);
734 extern double		is_computer_on_fire(void);
735 
736 
737 /* WARNING: Experimental API! */
738 
739 enum {
740 	B_OBJECT_TYPE_FD		= 0,
741 	B_OBJECT_TYPE_SEMAPHORE	= 1,
742 	B_OBJECT_TYPE_PORT		= 2,
743 	B_OBJECT_TYPE_THREAD	= 3
744 };
745 
746 enum {
747 	B_EVENT_READ				= 0x0001,	/* FD/port readable */
748 	B_EVENT_WRITE				= 0x0002,	/* FD/port writable */
749 	B_EVENT_ERROR				= 0x0004,	/* FD error */
750 	B_EVENT_PRIORITY_READ		= 0x0008,	/* FD priority readable */
751 	B_EVENT_PRIORITY_WRITE		= 0x0010,	/* FD priority writable */
752 	B_EVENT_HIGH_PRIORITY_READ	= 0x0020,	/* FD high priority readable */
753 	B_EVENT_HIGH_PRIORITY_WRITE	= 0x0040,	/* FD high priority writable */
754 	B_EVENT_DISCONNECTED		= 0x0080,	/* FD disconnected */
755 
756 	B_EVENT_ACQUIRE_SEMAPHORE	= 0x0001,	/* semaphore can be acquired */
757 
758 	B_EVENT_INVALID				= 0x1000	/* FD/port/sem/thread ID not or
759 											   no longer valid (e.g. has been
760 											   close/deleted) */
761 };
762 
763 typedef struct object_wait_info {
764 	int32		object;						/* ID of the object */
765 	uint16		type;						/* type of the object */
766 	uint16		events;						/* events mask */
767 } object_wait_info;
768 
769 /* wait_for_objects[_etc]() waits until at least one of the specified events or,
770    if given, the timeout occurred. When entering the function the
771    object_wait_info::events field specifies the events for each object the
772    caller is interested in. When the function returns the fields reflect the
773    events that actually occurred. The events B_EVENT_INVALID, B_EVENT_ERROR,
774    and B_EVENT_DISCONNECTED don't need to be specified. They will always be
775    reported, when they occur. */
776 
777 extern ssize_t		wait_for_objects(object_wait_info* infos, int numInfos);
778 extern ssize_t		wait_for_objects_etc(object_wait_info* infos, int numInfos,
779 						uint32 flags, bigtime_t timeout);
780 
781 
782 #ifdef __cplusplus
783 }
784 #endif
785 
786 #endif /* _OS_H */
787