2004-06-19 16:45:04 +02:00
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
2005-04-19 19:07:05 +02:00
|
|
|
const size_t CPU_TYPE_LEN = 49; // processor brand string is <= 48 chars
|
|
|
|
extern char cpu_type[CPU_TYPE_LEN];
|
|
|
|
|
2004-06-19 16:45:04 +02:00
|
|
|
extern double cpu_freq;
|
|
|
|
|
|
|
|
// -1 if detect not yet called, or cannot be determined
|
|
|
|
extern int cpus;
|
|
|
|
extern int cpu_speedstep;
|
|
|
|
extern int cpu_smp;
|
2004-06-21 18:29:47 +02:00
|
|
|
// are there actually multiple physical processors,
|
|
|
|
// not only logical hyperthreaded CPUs? relevant for wtime.
|
2004-06-19 16:45:04 +02:00
|
|
|
|
2004-06-22 19:20:38 +02:00
|
|
|
|
2004-06-23 15:45:50 +02:00
|
|
|
// not possible with POSIX calls.
|
|
|
|
// called from ia32.cpp check_smp
|
|
|
|
extern int on_each_cpu(void(*cb)());
|
2004-06-22 19:20:38 +02:00
|
|
|
|
2005-04-19 19:07:05 +02:00
|
|
|
extern void get_cpu_info(void);
|
|
|
|
|
2004-06-22 19:20:38 +02:00
|
|
|
|
2005-05-03 07:05:16 +02:00
|
|
|
// atomic "compare and swap". compare the machine word at <location> against
|
|
|
|
// <expected>; if not equal, return false; otherwise, overwrite it with
|
|
|
|
// <new_value> and return true.
|
|
|
|
extern bool CAS_(uintptr_t* location, uintptr_t expected, uintptr_t new_value);
|
|
|
|
|
|
|
|
#define CAS(l,o,n) CAS_((uintptr_t*)l, (uintptr_t)o, (uintptr_t)n)
|
|
|
|
|
|
|
|
extern void atomic_add(intptr_t* location, intptr_t increment);
|
|
|
|
|
|
|
|
// enforce strong memory ordering.
|
|
|
|
extern void mfence();
|
|
|
|
|
|
|
|
extern void serialize();
|
|
|
|
|
2004-06-19 16:45:04 +02:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
2004-06-22 15:22:46 +02:00
|
|
|
#endif
|