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