27 #include "precompiled.h"
31 #define HAVE_X64_MOVD ARCH_AMD64 && (ICC_VERSION || MSC_VERSION >= 1500)
35 # include <emmintrin.h>
54 virtual const wchar_t*
Name()
const
114 #pragma pack(push, 1)
166 const __m128i value128 = _mm_loadl_epi64((__m128i*)address);
168 return _mm_cvtsi128_si64x(value128);
171 _mm_store_si128((__m128i*)values, value128);
183 const __m128i value128 = _mm_cvtsi64x_si128(value);
185 const __m128i value128 = _mm_set_epi32(0, 0,
int(value >> 32),
int(value & 0xFFFFFFFF));
187 _mm_storel_epi64((__m128i*)address, value128);
202 for(
size_t reps = 0; reps < 1000; reps++)
204 if(caps_and_id != ~
u64(0))
209 const u8 revision = (
u8)
bits(caps_and_id, 0, 7);
211 counterBits = (caps_and_id & Bit<u64>(13))? 64 : 32;
212 const u16 vendorID = (
u16)
bits(caps_and_id, 16, 31);
213 const u32 period_fs = (
u32)
bits(caps_and_id, 32, 63);
215 frequency = 1e15 / period_fs;
216 debug_printf(L
"HPET: rev=%X vendor=%X bits=%d period=%08X freq=%g\n", revision, vendorID, counterBits, period_fs, frequency);
218 if(period_fs > 0x05F5E100)
size_t CounterBits() const
static __declspec(align(64)) TimerState timerStates[2]
const AcpiTable * acpi_GetTable(const char *signature)
ICounter * CreateCounterHPET(void *address, size_t size)
double Resolution() const
actual resolution [s].
u64 Read64(size_t offset) const
const Status NOT_SUPPORTED
#define ENSURE(expr)
ensure the expression <expr> evaluates to non-zero.
static size_t counterBits
void mahaf_UnmapPhysicalMemory(volatile void *virtualAddress)
void Write64(size_t offset, u64 value) const
i64 Status
Error handling system.
T bits(T num, size_t lo_idx, size_t hi_idx)
extract the value of bits hi_idx:lo_idx within num
volatile void * mahaf_MapPhysicalMemory(uintptr_t physicalAddress, size_t numBytes)
static Status MapRegisters(volatile void *®isters)
virtual const wchar_t * Name() const
bool mahaf_IsPhysicalMappingDangerous()
volatile void * m_hpetRegisters
u64 u64_from_u32(u32 hi, u32 lo)
return lower 16-bits
#define WARN_RETURN(status)
Status VerifyCapabilities(double &frequency, u32 &counterBits) const
double NominalFrequency() const
initial measurement of the tick rate.
AcpiGenericAddress baseAddress
void debug_printf(const wchar_t *fmt,...)
write a formatted string to the debug channel, subject to filtering (see below).
#define RETURN_STATUS_IF_ERR(expression)