OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
MeasureTicks.c
Go to the documentation of this file.
1
15#include "../OcCpuInternals.h"
16
17#include <Library/BaseLib.h>
18#include <Library/IoLib.h>
19
20VOID
21EFIAPI
23 IN UINT32 AcpiTicksDuration,
24 IN UINT16 TimerAddr,
25 OUT UINT32 *AcpiTicksDelta,
26 OUT UINT64 *TscTicksDelta
27 )
28{
29 UINT32 AcpiTick0;
30 UINT32 AcpiTick1;
31 UINT32 AcpiCurrentDelta;
32 UINT64 Tsc0;
33 UINT64 Tsc1;
34
35 AcpiTick0 = IoRead32 (TimerAddr);
36 Tsc0 = AsmReadTsc ();
37
38 do {
39 CpuPause ();
40
41 //
42 // Check how many AcpiTicks have passed since we started.
43 //
44 AcpiTick1 = IoRead32 (TimerAddr);
45
46 if (AcpiTick0 <= AcpiTick1) {
47 //
48 // No overflow.
49 //
50 AcpiCurrentDelta = AcpiTick1 - AcpiTick0;
51 } else if (AcpiTick0 - AcpiTick1 <= 0x00FFFFFF) {
52 //
53 // Overflow, 24-bit timer.
54 //
55 AcpiCurrentDelta = 0x00FFFFFF - AcpiTick0 + AcpiTick1;
56 } else {
57 //
58 // Overflow, 32-bit timer.
59 //
60 AcpiCurrentDelta = MAX_UINT32 - AcpiTick0 + AcpiTick1;
61 }
62
63 //
64 // Keep checking AcpiTicks until target is reached.
65 //
66 } while (AcpiCurrentDelta < AcpiTicksDuration);
67
68 Tsc1 = AsmReadTsc ();
69
70 //
71 // On some systems we may end up waiting for notably longer than 100ms,
72 // despite disabling all events. Divide by actual time passed as suggested
73 // by asava's Clover patch r2668.
74 //
75 *TscTicksDelta = Tsc1 - Tsc0;
76 *AcpiTicksDelta = AcpiCurrentDelta;
77}
VOID EFIAPI AsmMeasureTicks(IN UINT32 AcpiTicksDuration, IN UINT16 TimerAddr, OUT UINT32 *AcpiTicksDelta, OUT UINT64 *TscTicksDelta)
UINT64 EFIAPI AsmReadTsc(VOID)
Definition UserMisc.c:232
VOID EFIAPI CpuPause(VOID)
Definition UserMisc.c:22
UINT32 EFIAPI IoRead32(IN UINTN Port)
Definition UserMisc.c:318