forked from 0ad/0ad
janwas
c45ef68a88
cpu: accessor functions ensure what they return is valid. no longer needs to call wtime_reset_impl (ugh). uses ModuleInitState. ia32: add APIC ID accessor and prevent redundant init This was SVN commit r5093.
103 lines
2.6 KiB
C
103 lines
2.6 KiB
C
/**
|
|
* =========================================================================
|
|
* File : ia32_asm.h
|
|
* Project : 0 A.D.
|
|
* Description : interface to various IA-32 functions (written in asm)
|
|
* =========================================================================
|
|
*/
|
|
|
|
// license: GPL; see lib/license.txt
|
|
|
|
#ifndef INCLUDED_IA32_ASM
|
|
#define INCLUDED_IA32_ASM
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/**
|
|
* prepare ia32_asm_cpuid for use (detects which CPUID functions are
|
|
* available). called by ia32_Init.
|
|
**/
|
|
extern void ia32_asm_cpuid_init();
|
|
|
|
/**
|
|
* order in which ia32_asm_cpuid stores register values
|
|
**/
|
|
enum IA32Regs
|
|
{
|
|
EAX,
|
|
EBX,
|
|
ECX,
|
|
EDX
|
|
};
|
|
|
|
/**
|
|
* try to call the specified CPUID sub-function.
|
|
* (note: ECX is set to 0 beforehand as required by sub-function 4)
|
|
* fills register array according to IA32Regs.
|
|
* @return true on success or false if the sub-function isn't supported.
|
|
**/
|
|
extern bool ia32_asm_cpuid(u32 func, u32* regs);
|
|
|
|
/**
|
|
* for all 1-bits in mask, update the corresponding FPU control word bits
|
|
* with the bit values in new_val.
|
|
* @return 0 to indicate success.
|
|
**/
|
|
extern uint ia32_asm_control87(uint new_val, uint mask);
|
|
|
|
/**
|
|
* @return the current value of the TimeStampCounter in edx:eax
|
|
* (interpretable as a u64 when using the standard Win32 calling convention)
|
|
**/
|
|
extern u64 ia32_asm_rdtsc_edx_eax(void);
|
|
|
|
/**
|
|
* write the current execution state (e.g. all register values) into
|
|
* (Win32::CONTEXT*)pcontext (defined as void* to avoid dependency).
|
|
**/
|
|
extern void ia32_asm_GetCurrentContext(void* pcontext);
|
|
|
|
|
|
// implementations of the cpu.h interface
|
|
|
|
/// see cpu_AtomicAdd
|
|
extern void ia32_asm_AtomicAdd(volatile intptr_t* location, intptr_t increment);
|
|
|
|
/// see cpu_CAS
|
|
extern bool ia32_asm_CAS(volatile uintptr_t* location, uintptr_t expected, uintptr_t new_value);
|
|
|
|
/// see cpu_i32FromFloat
|
|
extern i32 ia32_asm_i32FromFloat(float f);
|
|
extern i32 ia32_asm_i32FromDouble(double d);
|
|
extern i64 ia32_asm_i64FromDouble(double d);
|
|
|
|
|
|
// backends for POSIX/SUS functions
|
|
|
|
/// see fpclassify
|
|
extern uint ia32_asm_fpclassifyd(double d);
|
|
extern uint ia32_asm_fpclassifyf(float f);
|
|
|
|
/// see rintf
|
|
extern float ia32_asm_rintf(float);
|
|
extern double ia32_asm_rint(double);
|
|
extern float ia32_asm_fminf(float, float);
|
|
extern float ia32_asm_fmaxf(float, float);
|
|
|
|
|
|
// misc
|
|
|
|
/**
|
|
* @return the (integral) base 2 logarithm, or -1 if the number
|
|
* is not a power-of-two.
|
|
**/
|
|
extern int ia32_asm_log2_of_pow2(uint n);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif // #ifndef INCLUDED_IA32_ASM
|