21 __asm__
volatile(
"rdtsc" :
"=a"(eax),
"=d"(edx));
37 cpuid(0x80000007, 0, &unused, &unused, &unused, &edx);
38 return edx & (1 << 8);
46 LOG2_DEBUG(
"APIC_TIMER",
"[APIC] calibrating core %d....",
77 if (elapsed_time_us > 0)
78 ticks_per_us = elapsed_test / elapsed_time_us;
85 LOG2_DEBUG(
"APIC_TIMER",
"[APIC] calibrated apic timer 1ms done.");
154 __asm__
volatile(
"pause");
158#define APIC_TIMER_MASKED (1 << 16)
160#define APIC_TIMER_MIN_VECTOR 0x20
173 if (interval_us == 0) {
174 LOG_ERROR(
"APIC_TIMER",
"Interval must be > 0");
179 LOG_ERROR(
"APIC_TIMER",
"APIC timer not calibrated");
187 if (
count > 0xFFFFFFFF) {
188 LOG_WARN(
"APIC_TIMER",
"Interval too long, truncated");
uint8_t x2_apic_supported
void apic_write(uint32_t reg, uint32_t value)
uint32_t apic_read(uint32_t reg)
#define APIC_TIMER_DEADLINE
#define APIC_TIMER_PERIOD
#define TIMER_DIVIDE_CONFIG
#define TIMER_INITIAL_COUNT
#define TIMER_CURRENT_COUNT
#define APIC_TIMER_ONE_SHOT
#define APIC_TIMER_MASKED
void vxAPICCreateTimer(uint32_t type, uint64_t interval_us, uint16_t vector)
void vxInitializeAPICTimer()
void vxAPICCreateDeadlineTimer(const uint8_t vector, const uint64_t freq_us)
static uint64_t calibrated_tsmc_freq_1ms
static void vxAPICTimerCalibrationUsingHPET()
bool vxTSChasInvariant(void)
static uint64_t vxAPICReadTSC()
static uint64_t calibrated_ticks_1ns
each_core_data * get_current_core_data(void)
void cpuid(uint32_t leaf, uint32_t subleaf, uint32_t *eax, uint32_t *ebx, uint32_t *ecx, uint32_t *edx)
uint8_t get_current_core_cpuid()
void vxWRSR(uint32_t msr, uint64_t value)
#define LOG_ERROR(mod, fmt,...)
#define LOG_WARN(mod, fmt,...)
#define LOG2_DEBUG(mod, fmt,...)
uint64_t get_timer_counter_count_ns(time_counter_t *counter)
void init_timer_counter(time_counter_t *counter)
uint64_t get_timer_counter_count(time_counter_t *counter)