Author: tfaber
Date: Sat Aug 29 16:45:00 2015
New Revision: 68863
URL:
http://svn.reactos.org/svn/reactos?rev=68863&view=rev
Log:
[HAL]
- Implement HalStartProfileInterrupt, HalSetProfileInterval, and
HalpProfileInterruptHandler
Now kernrate works!
CORE-10066 #resolve
Modified:
trunk/reactos/hal/halx86/generic/profil.c
trunk/reactos/hal/halx86/generic/timer.c
trunk/reactos/hal/halx86/include/halp.h
Modified: trunk/reactos/hal/halx86/generic/profil.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/generic/profil.…
==============================================================================
--- trunk/reactos/hal/halx86/generic/profil.c [iso-8859-1] (original)
+++ trunk/reactos/hal/halx86/generic/profil.c [iso-8859-1] Sat Aug 29 16:45:00 2015
@@ -13,6 +13,11 @@
#define NDEBUG
#include <debug.h>
+/* GLOBALS *******************************************************************/
+
+BOOLEAN HalpProfilingStopped = TRUE;
+UCHAR HalpProfileRate = 8;
+
/* FUNCTIONS *****************************************************************/
/*
@@ -23,6 +28,8 @@
HalStopProfileInterrupt(IN KPROFILE_SOURCE ProfileSource)
{
UCHAR StatusB;
+
+ UNREFERENCED_PARAMETER(ProfileSource);
/* Acquire the CMOS lock */
HalpAcquireCmosSpinLock();
@@ -36,6 +43,8 @@
/* Write new value into Status Register B */
HalpWriteCmos(RTC_REGISTER_B, StatusB);
+ HalpProfilingStopped = TRUE;
+
/* Release the CMOS lock */
HalpReleaseCmosSpinLock();
}
@@ -47,8 +56,27 @@
NTAPI
HalStartProfileInterrupt(IN KPROFILE_SOURCE ProfileSource)
{
- UNIMPLEMENTED;
- return;
+ UCHAR StatusA, StatusB;
+
+ UNREFERENCED_PARAMETER(ProfileSource);
+
+ HalpProfilingStopped = FALSE;
+
+ /* Acquire the CMOS lock */
+ HalpAcquireCmosSpinLock();
+
+ /* Set the interval in Status Register A */
+ StatusA = HalpReadCmos(RTC_REGISTER_A);
+ StatusA = (StatusA & 0xF0) | HalpProfileRate;
+ HalpWriteCmos(RTC_REGISTER_A, StatusA);
+
+ /* Enable periodic interrupts in Status Register B */
+ StatusB = HalpReadCmos(RTC_REGISTER_B);
+ StatusB = StatusB | RTC_REG_B_PI;
+ HalpWriteCmos(RTC_REGISTER_B, StatusB);
+
+ /* Release the CMOS lock */
+ HalpReleaseCmosSpinLock();
}
/*
@@ -58,6 +86,32 @@
NTAPI
HalSetProfileInterval(IN ULONG_PTR Interval)
{
- UNIMPLEMENTED;
- return Interval;
+ ULONG_PTR CurrentValue, NextValue;
+ UCHAR i;
+
+ /* Normalize interval. 122100 ns is the smallest supported */
+ Interval &= ~(1 << 31);
+ if (Interval < 1221)
+ Interval = 1221;
+
+ /* Highest rate value of 15 means 500 ms */
+ CurrentValue = 5000000;
+ for (i = 15; ; i--)
+ {
+ NextValue = (CurrentValue + 1) / 2;
+ if (Interval > CurrentValue - NextValue / 2)
+ break;
+ CurrentValue = NextValue;
+ }
+
+ /* Interval as needed by RTC */
+ HalpProfileRate = i;
+
+ /* Reset the */
+ if (!HalpProfilingStopped)
+ {
+ HalStartProfileInterrupt(0);
+ }
+
+ return CurrentValue;
}
Modified: trunk/reactos/hal/halx86/generic/timer.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/generic/timer.c…
==============================================================================
--- trunk/reactos/hal/halx86/generic/timer.c [iso-8859-1] (original)
+++ trunk/reactos/hal/halx86/generic/timer.c [iso-8859-1] Sat Aug 29 16:45:00 2015
@@ -188,9 +188,21 @@
/* Start the interrupt */
if (HalBeginSystemInterrupt(PROFILE_LEVEL, PRIMARY_VECTOR_BASE + 8, &Irql))
{
- /* Profiling isn't yet enabled */
- UNIMPLEMENTED;
- ASSERT(FALSE);
+ /* Spin until the interrupt pending bit is clear */
+ HalpAcquireCmosSpinLock();
+ while (HalpReadCmos(RTC_REGISTER_C) & RTC_REG_C_IRQ)
+ ;
+ HalpReleaseCmosSpinLock();
+
+ /* If profiling is enabled, call the kernel function */
+ if (!HalpProfilingStopped)
+ {
+ KeProfileInterrupt(TrapFrame);
+ }
+
+ /* Finish the interrupt */
+ _disable();
+ HalEndSystemInterrupt(Irql, TrapFrame);
}
/* Spurious, just end the interrupt */
Modified: trunk/reactos/hal/halx86/include/halp.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/hal/halx86/include/halp.h?…
==============================================================================
--- trunk/reactos/hal/halx86/include/halp.h [iso-8859-1] (original)
+++ trunk/reactos/hal/halx86/include/halp.h [iso-8859-1] Sat Aug 29 16:45:00 2015
@@ -68,6 +68,7 @@
#define RTC_REGISTER_B 0x0B
#define RTC_REG_B_PI 0x40
#define RTC_REGISTER_C 0x0C
+#define RTC_REG_C_IRQ 0x80
#define RTC_REGISTER_D 0x0D
#define RTC_REGISTER_CENTURY 0x32
@@ -585,6 +586,9 @@
DECLSPEC_NORETURN VOID FASTCALL HalpApcInterrupt2ndEntry(IN PKTRAP_FRAME TrapFrame);
DECLSPEC_NORETURN VOID FASTCALL HalpDispatchInterrupt2ndEntry(IN PKTRAP_FRAME
TrapFrame);
+/* profil.c */
+extern BOOLEAN HalpProfilingStopped;
+
/* timer.c */
VOID NTAPI HalpInitializeClock(VOID);
VOID HalpClockInterrupt(VOID);