ReactOS 0.4.16-dev-297-gc569aee
apictimer.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS HAL
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: hal/halx86/apic/apictimer.c
5 * PURPOSE: System Profiling
6 * PROGRAMMERS: Timo Kreuzer (timo.kreuzer@reactos.org)
7 */
8
9/* INCLUDES ******************************************************************/
10
11#include <hal.h>
12#include "apicp.h"
13#define NDEBUG
14#include <debug.h>
15
17
18/* HAL profiling variables */
23
24/* TIMER FUNCTIONS ************************************************************/
25
26VOID
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}
47
48VOID
51{
52
53 /* Initialize the TSC */
54 //HalpInitializeTsc();
55
56 /* Set clock multiplier to 1 */
58
60
61// KeSetTimeIncrement
62}
63
64VOID
67{
69}
70
71
72/* PUBLIC FUNCTIONS ***********************************************************/
73
74VOID
77{
79 KeGetPcr()->HalReserved[HAL_PROFILING_MULTIPLIER] = 1; /* TODO: HACK */
80}
81
82VOID
85{
86 LVT_REGISTER LvtEntry;
87
88 /* Only handle ProfileTime */
89 if (ProfileSource == ProfileTime)
90 {
91 /* OK, we are profiling now */
93
94 /* Set interrupt interval */
96
97 /* Unmask it */
98 LvtEntry.Long = 0;
99 LvtEntry.TimerMode = 1;
100 LvtEntry.Vector = APIC_PROFILE_VECTOR;
101 LvtEntry.Mask = 0;
102 ApicWrite(APIC_TMRLVTR, LvtEntry.Long);
103 }
104}
105
106VOID
107NTAPI
109{
110 LVT_REGISTER LvtEntry;
111
112 /* Only handle ProfileTime */
113 if (ProfileSource == ProfileTime)
114 {
115 /* We are not profiling */
117
118 /* Mask interrupt */
119 LvtEntry.Long = 0;
120 LvtEntry.TimerMode = 1;
121 LvtEntry.Vector = APIC_PROFILE_VECTOR;
122 LvtEntry.Mask = 1;
123 ApicWrite(APIC_TMRLVTR, LvtEntry.Long);
124 }
125}
126
128NTAPI
130{
131 ULONGLONG TimerInterval;
132 ULONGLONG FixedInterval;
133
134 FixedInterval = (ULONGLONG)Interval;
135
136 /* Check bounds */
137 if (FixedInterval < HalMinProfileInterval)
138 {
139 FixedInterval = HalMinProfileInterval;
140 }
141 else if (FixedInterval > HalMaxProfileInterval)
142 {
143 FixedInterval = HalMaxProfileInterval;
144 }
145
146 /* Remember interval */
147 HalCurProfileInterval = FixedInterval;
148
149 /* Recalculate interval for APIC */
150 TimerInterval = FixedInterval * KeGetPcr()->HalReserved[HAL_PROFILING_MULTIPLIER] / HalMaxProfileInterval;
151
152 /* Remember recalculated interval in PCR */
153 KeGetPcr()->HalReserved[HAL_PROFILING_INTERVAL] = (ULONG)TimerInterval;
154
155 /* And set it */
156 ApicWrite(APIC_TICR, (ULONG)TimerInterval);
157
158 return Interval;
159}
unsigned char BOOLEAN
#define APIC_PROFILE_VECTOR
Definition: apicp.h:50
FORCEINLINE VOID ApicWrite(APIC_REGISTER Register, ULONG Value)
Definition: apicp.h:323
@ TIMER_DV_DivideBy1
Definition: apicp.h:183
@ APIC_TICR
Definition: apicp.h:102
@ APIC_TDCR
Definition: apicp.h:104
@ APIC_TMRLVTR
Definition: apicp.h:96
VOID NTAPI HalInitializeProfiling(VOID)
Definition: apictimer.c:76
LARGE_INTEGER HalpCpuClockFrequency
Definition: tsc.c:17
VOID NTAPI HalStartProfileInterrupt(IN KPROFILE_SOURCE ProfileSource)
Definition: apictimer.c:84
VOID NTAPI HalStopProfileInterrupt(IN KPROFILE_SOURCE ProfileSource)
Definition: apictimer.c:108
VOID NTAPI ApicSetTimerInterval(ULONG MicroSeconds)
Definition: apictimer.c:28
VOID NTAPI ApicInitializeTimer(ULONG Cpu)
Definition: apictimer.c:50
BOOLEAN HalIsProfiling
Definition: apictimer.c:19
ULONG_PTR NTAPI HalSetProfileInterval(IN ULONG_PTR Interval)
Definition: apictimer.c:129
VOID FASTCALL HalpProfileInterruptHandler(_In_ PKTRAP_FRAME TrapFrame)
Definition: apictimer.c:66
ULONGLONG HalMaxProfileInterval
Definition: apictimer.c:22
ULONGLONG HalCurProfileInterval
Definition: apictimer.c:20
ULONGLONG HalMinProfileInterval
Definition: apictimer.c:21
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define HAL_PROFILING_MULTIPLIER
Definition: halp.h:55
#define HAL_PROFILING_INTERVAL
Definition: halp.h:54
enum _KPROFILE_SOURCE KPROFILE_SOURCE
@ ProfileTime
Definition: winternl.h:2123
#define KeGetPcr()
Definition: ketypes.h:81
DWORD Interval
Definition: netstat.c:30
#define _In_
Definition: no_sal2.h:158
#define FASTCALL
Definition: nt_native.h:50
VOID NTAPI KeProfileInterruptWithSource(IN PKTRAP_FRAME TrapFrame, IN KPROFILE_SOURCE Source)
Definition: profobj.c:354
#define NTAPI
Definition: typedefs.h:36
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
uint64_t ULONGLONG
Definition: typedefs.h:67
LONGLONG QuadPart
Definition: typedefs.h:114
UINT32 TimerMode
Definition: apicp.h:275
UINT32 Long
Definition: apicp.h:264
UINT32 Vector
Definition: apicp.h:267
UINT32 Mask
Definition: apicp.h:274