janwas
836cd08d5e
also: - renamed wdll to delay_load, and wdll_ver to dll_ver - removed empty wcpu This was SVN commit r3751.
92 lines
2.4 KiB
C
Executable File
92 lines
2.4 KiB
C
Executable File
/**
|
|
* =========================================================================
|
|
* File : cpu.h
|
|
* Project : 0 A.D.
|
|
* Description : CPU and memory detection.
|
|
*
|
|
* @author Jan.Wassenberg@stud.uni-karlsruhe.de
|
|
* =========================================================================
|
|
*/
|
|
|
|
/*
|
|
* Copyright (c) 2003-2005 Jan Wassenberg
|
|
*
|
|
* Redistribution and/or modification are also permitted under the
|
|
* terms of the GNU General Public License as published by the
|
|
* Free Software Foundation (version 2 or later, at your option).
|
|
*
|
|
* This program is distributed in the hope that it will be useful, but
|
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
*/
|
|
|
|
#ifndef CPU_H__
|
|
#define CPU_H__
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
const size_t CPU_TYPE_LEN = 49; // IA32 processor brand string is <= 48 chars
|
|
extern char cpu_type[CPU_TYPE_LEN];
|
|
|
|
extern double cpu_freq;
|
|
|
|
|
|
// -1 if detect not yet called, or cannot be determined:
|
|
|
|
extern int cpus; // # packages (i.e. sockets; > 1 => SMP system)
|
|
extern int cpu_ht_units; // degree of hyperthreading, typically 2
|
|
extern int cpu_cores; // cores per package, typically 2
|
|
|
|
extern int cpu_speedstep;
|
|
|
|
|
|
extern void cpu_init(void);
|
|
|
|
|
|
extern size_t tot_mem;
|
|
extern size_t avl_mem;
|
|
|
|
// updates *_mem above
|
|
extern void get_mem_status(void);
|
|
|
|
|
|
// 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);
|
|
|
|
// this is often used for pointers, so the macro coerces parameters to
|
|
// uinptr_t. invalid usage unfortunately also goes through without warnings.
|
|
// to catch cases where the caller has passed <expected> as <location> or
|
|
// similar mishaps, the implementation verifies <location> is a valid pointer.
|
|
#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();
|
|
|
|
|
|
// Win32 CONTEXT field abstraction
|
|
// (there's no harm also defining this for other platforms)
|
|
#if CPU_AMD64
|
|
# define PC_ Rip
|
|
# define FP_ Rbp
|
|
# define SP_ Rsp
|
|
#elif CPU_IA32
|
|
# define PC_ Eip
|
|
# define FP_ Ebp
|
|
# define SP_ Esp
|
|
#endif
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif // #ifndef CPU_H__
|