ReactOS  0.4.15-dev-3733-g974a0f0
tsc.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define NUM_SAMPLES   4
 
#define MSR_RDTSC   0x10
 
#define KiGetIdtEntry(Pcr, Vector)   &((Pcr)->IDT[Vector])
 

Functions

void __cdecl TscCalibrationISR (void)
 
VOID NTAPI HalpInitializeTsc (void)
 

Variables

LARGE_INTEGER HalpCpuClockFrequency
 

Macro Definition Documentation

◆ KiGetIdtEntry

#define KiGetIdtEntry (   Pcr,
  Vector 
)    &((Pcr)->IDT[Vector])

Definition at line 17 of file tsc.h.

◆ MSR_RDTSC

#define MSR_RDTSC   0x10

Definition at line 6 of file tsc.h.

◆ NUM_SAMPLES

#define NUM_SAMPLES   4

Definition at line 5 of file tsc.h.

Function Documentation

◆ HalpInitializeTsc()

VOID NTAPI HalpInitializeTsc ( void  )

Definition at line 55 of file tsc.c.

56 {
58  PVOID PreviousHandler;
59  UCHAR RegisterA, RegisterB;
60 
61  /* Check if the CPU supports RDTSC */
62  if (!(KeGetCurrentPrcb()->FeatureBits & KF_RDTSC))
63  {
64  KeBugCheck(HAL_INITIALIZATION_FAILED);
65  }
66 
67  /* Save flags and disable interrupts */
68  Flags = __readeflags();
69  _disable();
70 
71  /* Enable the periodic interrupt in the CMOS */
72  RegisterB = HalpReadCmos(RTC_REGISTER_B);
74 
75  /* Modify register A to RTC_MODE to get SAMPLE_FREQUENCY */
76  RegisterA = HalpReadCmos(RTC_REGISTER_A);
77  RegisterA = (RegisterA & 0xF0) | RTC_MODE;
78  HalpWriteCmos(RTC_REGISTER_A, RegisterA);
79 
80  /* Save old IDT entry */
81  PreviousHandler = KeQueryInterruptHandler(APIC_CLOCK_VECTOR);
82 
83  /* Set the calibration ISR */
85 
86  /* Reset TSC value to 0 */
88 
89  /* Enable the timer interrupt */
91 
92  /* Read register C, so that the next interrupt can happen */
94 
95  /* Wait for completion */
96  _enable();
98  _disable();
99 
100  /* Disable the periodic interrupt in the CMOS */
102 
103  /* Disable the timer interrupt */
105 
106  /* Restore the previous handler */
108 
109  /* Calculate an average, using simplified linear regression */
112 
113  /* Restore flags */
115 
116 }
VOID NTAPI HalpWriteCmos(_In_ UCHAR Reg, _In_ UCHAR Value)
Definition: cmos.c:132
BOOLEAN NTAPI HalEnableSystemInterrupt(IN ULONG Vector, IN KIRQL Irql, IN KINTERRUPT_MODE InterruptMode)
Definition: pic.c:295
#define RTC_MODE
Definition: tsc.c:22
#define _ReadWriteBarrier()
Definition: intrin_arm.h:36
void __cdecl _enable(void)
Definition: intrin_arm.h:373
#define KF_RDTSC
Definition: ketypes.h:144
FORCEINLINE struct _KPRCB * KeGetCurrentPrcb(VOID)
Definition: ketypes.h:1079
#define MSR_RDTSC
Definition: tsc.h:6
FORCEINLINE PVOID KeQueryInterruptHandler(IN ULONG Vector)
Definition: ke.h:323
UCHAR TscCalibrationPhase
Definition: tsc.c:19
VOID NTAPI HalDisableSystemInterrupt(IN ULONG Vector, IN KIRQL Irql)
Definition: pic.c:309
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define CLOCK_LEVEL
#define RTC_REG_B_PI
Definition: halhw.h:16
__INTRIN_INLINE uintptr_t __readeflags(void)
Definition: intrin_x86.h:1675
DECLSPEC_NORETURN VOID NTAPI KeBugCheck(ULONG BugCheckCode)
Definition: bug.c:1427
#define NUM_SAMPLES
Definition: tsc.h:5
#define APIC_CLOCK_VECTOR
Definition: apicp.h:44
_Must_inspect_result_ _In_ ULONG Flags
Definition: wsk.h:170
void __cdecl TscCalibrationISR(void)
unsigned char UCHAR
Definition: xmlstorage.h:181
__INTRIN_INLINE void __writeeflags(uintptr_t Value)
Definition: intrin_x86.h:1670
#define RTC_REGISTER_C
Definition: halhw.h:17
PPC_QUAL void __writemsr(const unsigned long Value)
Definition: intrin_ppc.h:748
FORCEINLINE VOID KeRegisterInterruptHandler(IN ULONG Vector, IN PVOID Handler)
Definition: ke.h:297
#define RTC_REGISTER_B
Definition: halhw.h:15
ULONG64 TscCalibrationArray[NUM_SAMPLES]
Definition: tsc.c:20
UCHAR NTAPI HalpReadCmos(_In_ UCHAR Reg)
Definition: cmos.c:123
#define RTC_REGISTER_A
Definition: xboxrtc.c:21
void __cdecl _disable(void)
Definition: intrin_arm.h:365
LARGE_INTEGER HalpCpuClockFrequency
Definition: tsc.c:17
static ULONG64 DoLinearRegression(ULONG XMax, ULONG64 *ArrayY)
Definition: tsc.c:29
LONGLONG QuadPart
Definition: typedefs.h:114

Referenced by HalpCalibrateStallExecution().

◆ TscCalibrationISR()

void __cdecl TscCalibrationISR ( void  )

Referenced by HalpInitializeTsc().

Variable Documentation

◆ HalpCpuClockFrequency

LARGE_INTEGER HalpCpuClockFrequency

Definition at line 17 of file tsc.c.

Referenced by HalpCalibrateStallExecution(), HalpInitializeTsc(), and KeQueryPerformanceCounter().