ReactOS  0.4.15-dev-2700-g4b4ffa9
apictimer.c File Reference
#include <hal.h>
#include <apic.h>
#include <debug.h>
Include dependency graph for apictimer.c:

Go to the source code of this file.

Macros

#define NDEBUG
 

Functions

VOID NTAPI ApicSetTimerInterval (ULONG MicroSeconds)
 
VOID NTAPI ApicInitializeTimer (ULONG Cpu)
 
VOID NTAPI HalInitializeProfiling (VOID)
 
VOID NTAPI HalStartProfileInterrupt (IN KPROFILE_SOURCE ProfileSource)
 
VOID NTAPI HalStopProfileInterrupt (IN KPROFILE_SOURCE ProfileSource)
 
ULONG_PTR NTAPI HalSetProfileInterval (IN ULONG_PTR Interval)
 

Variables

LARGE_INTEGER HalpCpuClockFrequency
 
BOOLEAN HalIsProfiling = FALSE
 
ULONGLONG HalCurProfileInterval = 10000000
 
ULONGLONG HalMinProfileInterval = 1000
 
ULONGLONG HalMaxProfileInterval = 10000000
 

Macro Definition Documentation

◆ NDEBUG

#define NDEBUG

Definition at line 13 of file apictimer.c.

Function Documentation

◆ ApicInitializeTimer()

VOID NTAPI ApicInitializeTimer ( ULONG  Cpu)

Definition at line 50 of file apictimer.c.

51 {
52 
53  /* Initialize the TSC */
54  //HalpInitializeTsc();
55 
56  /* Set clock multiplier to 1 */
58 
60 
61 // KeSetTimeIncrement
62 }
VOID NTAPI ApicSetTimerInterval(ULONG MicroSeconds)
Definition: apictimer.c:28
#define APIC_TDCR
Definition: apic.h:33
FORCEINLINE VOID ApicWrite(ULONG Offset, ULONG Value)
Definition: apic.h:292

◆ ApicSetTimerInterval()

VOID NTAPI ApicSetTimerInterval ( ULONG  MicroSeconds)

Definition at line 28 of file apictimer.c.

29 {
30  LVT_REGISTER LvtEntry;
31  ULONGLONG TimerInterval;
32 
33  /* Calculate the Timer interval */
34  TimerInterval = HalpCpuClockFrequency.QuadPart * MicroSeconds / 1000000;
35 
36  /* Set the count interval */
37  ApicWrite(APIC_TICR, (ULONG)TimerInterval);
38 
39  /* Set to periodic */
40  LvtEntry.Long = 0;
41  LvtEntry.TimerMode = 1;
42  LvtEntry.Vector = APIC_PROFILE_VECTOR;
43  LvtEntry.Mask = 0;
44  ApicWrite(APIC_TMRLVTR, LvtEntry.Long);
45 
46 }
UINT32 Vector
Definition: apic.h:230
LARGE_INTEGER HalpCpuClockFrequency
Definition: tsc.c:16
#define APIC_TMRLVTR
Definition: apic.h:71
UINT32 Long
Definition: apic.h:227
UINT32 TimerMode
Definition: apic.h:238
UINT32 Mask
Definition: apic.h:237
#define APIC_TICR
Definition: apic.h:77
uint64_t ULONGLONG
Definition: typedefs.h:67
#define APIC_PROFILE_VECTOR
Definition: apic.h:50
FORCEINLINE VOID ApicWrite(ULONG Offset, ULONG Value)
Definition: apic.h:292
unsigned int ULONG
Definition: retypes.h:1
LONGLONG QuadPart
Definition: typedefs.h:114

Referenced by ApicInitializeTimer().

◆ HalInitializeProfiling()

VOID NTAPI HalInitializeProfiling ( VOID  )

Definition at line 69 of file apictimer.c.

70 {
72  KeGetPcr()->HalReserved[HAL_PROFILING_MULTIPLIER] = 1; /* TODO: HACK */
73 }
#define KeGetPcr()
Definition: ke.h:26
ULONGLONG HalCurProfileInterval
Definition: apictimer.c:20
#define HAL_PROFILING_MULTIPLIER
Definition: halp.h:47
#define HAL_PROFILING_INTERVAL
Definition: halp.h:46

Referenced by HalpInitProcessor().

◆ HalSetProfileInterval()

ULONG_PTR NTAPI HalSetProfileInterval ( IN ULONG_PTR  Interval)

Definition at line 122 of file apictimer.c.

123 {
124  ULONGLONG TimerInterval;
125  ULONGLONG FixedInterval;
126 
127  FixedInterval = (ULONGLONG)Interval;
128 
129  /* Check bounds */
130  if (FixedInterval < HalMinProfileInterval)
131  {
132  FixedInterval = HalMinProfileInterval;
133  }
134  else if (FixedInterval > HalMaxProfileInterval)
135  {
136  FixedInterval = HalMaxProfileInterval;
137  }
138 
139  /* Remember interval */
140  HalCurProfileInterval = FixedInterval;
141 
142  /* Recalculate interval for APIC */
143  TimerInterval = FixedInterval * KeGetPcr()->HalReserved[HAL_PROFILING_MULTIPLIER] / HalMaxProfileInterval;
144 
145  /* Remember recalculated interval in PCR */
146  KeGetPcr()->HalReserved[HAL_PROFILING_INTERVAL] = (ULONG)TimerInterval;
147 
148  /* And set it */
149  ApicWrite(APIC_TICR, (ULONG)TimerInterval);
150 
151  return Interval;
152 }
ULONGLONG HalMaxProfileInterval
Definition: apictimer.c:22
#define KeGetPcr()
Definition: ke.h:26
ULONGLONG HalMinProfileInterval
Definition: apictimer.c:21
DWORD Interval
Definition: netstat.c:33
#define APIC_TICR
Definition: apic.h:77
uint64_t ULONGLONG
Definition: typedefs.h:67
ULONGLONG HalCurProfileInterval
Definition: apictimer.c:20
#define HAL_PROFILING_MULTIPLIER
Definition: halp.h:47
FORCEINLINE VOID ApicWrite(ULONG Offset, ULONG Value)
Definition: apic.h:292
unsigned int ULONG
Definition: retypes.h:1
#define HAL_PROFILING_INTERVAL
Definition: halp.h:46

◆ HalStartProfileInterrupt()

VOID NTAPI HalStartProfileInterrupt ( IN KPROFILE_SOURCE  ProfileSource)

Definition at line 77 of file apictimer.c.

78 {
79  LVT_REGISTER LvtEntry;
80 
81  /* Only handle ProfileTime */
82  if (ProfileSource == ProfileTime)
83  {
84  /* OK, we are profiling now */
86 
87  /* Set interrupt interval */
89 
90  /* Unmask it */
91  LvtEntry.Long = 0;
92  LvtEntry.TimerMode = 1;
93  LvtEntry.Vector = APIC_PROFILE_VECTOR;
94  LvtEntry.Mask = 0;
95  ApicWrite(APIC_TMRLVTR, LvtEntry.Long);
96  }
97 }
#define TRUE
Definition: types.h:120
UINT32 Vector
Definition: apic.h:230
#define KeGetPcr()
Definition: ke.h:26
#define APIC_TMRLVTR
Definition: apic.h:71
UINT32 Long
Definition: apic.h:227
UINT32 TimerMode
Definition: apic.h:238
UINT32 Mask
Definition: apic.h:237
#define APIC_TICR
Definition: apic.h:77
BOOLEAN HalIsProfiling
Definition: apictimer.c:19
#define APIC_PROFILE_VECTOR
Definition: apic.h:50
FORCEINLINE VOID ApicWrite(ULONG Offset, ULONG Value)
Definition: apic.h:292
#define HAL_PROFILING_INTERVAL
Definition: halp.h:46

◆ HalStopProfileInterrupt()

VOID NTAPI HalStopProfileInterrupt ( IN KPROFILE_SOURCE  ProfileSource)

Definition at line 101 of file apictimer.c.

102 {
103  LVT_REGISTER LvtEntry;
104 
105  /* Only handle ProfileTime */
106  if (ProfileSource == ProfileTime)
107  {
108  /* We are not profiling */
110 
111  /* Mask interrupt */
112  LvtEntry.Long = 0;
113  LvtEntry.TimerMode = 1;
114  LvtEntry.Vector = APIC_PROFILE_VECTOR;
115  LvtEntry.Mask = 1;
116  ApicWrite(APIC_TMRLVTR, LvtEntry.Long);
117  }
118 }
UINT32 Vector
Definition: apic.h:230
#define APIC_TMRLVTR
Definition: apic.h:71
UINT32 Long
Definition: apic.h:227
#define FALSE
Definition: types.h:117
UINT32 TimerMode
Definition: apic.h:238
UINT32 Mask
Definition: apic.h:237
BOOLEAN HalIsProfiling
Definition: apictimer.c:19
#define APIC_PROFILE_VECTOR
Definition: apic.h:50
FORCEINLINE VOID ApicWrite(ULONG Offset, ULONG Value)
Definition: apic.h:292

Variable Documentation

◆ HalCurProfileInterval

ULONGLONG HalCurProfileInterval = 10000000

Definition at line 20 of file apictimer.c.

Referenced by HalInitializeProfiling(), and HalSetProfileInterval().

◆ HalIsProfiling

BOOLEAN HalIsProfiling = FALSE

Definition at line 19 of file apictimer.c.

Referenced by HalStartProfileInterrupt(), and HalStopProfileInterrupt().

◆ HalMaxProfileInterval

ULONGLONG HalMaxProfileInterval = 10000000

Definition at line 22 of file apictimer.c.

Referenced by HalSetProfileInterval().

◆ HalMinProfileInterval

ULONGLONG HalMinProfileInterval = 1000

Definition at line 21 of file apictimer.c.

Referenced by HalSetProfileInterval().

◆ HalpCpuClockFrequency

LARGE_INTEGER HalpCpuClockFrequency

Definition at line 16 of file tsc.c.

Referenced by ApicSetTimerInterval().