/* * PROJECT: NEC PC-98 series HAL * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later) * PURPOSE: System Profiling * COPYRIGHT: Copyright 2020 Dmitry Borisov (di.sean@protonmail.com) */ /* INCLUDES ******************************************************************/ #include #define NDEBUG #include /* GLOBALS *******************************************************************/ BOOLEAN HalpProfilingStopped = TRUE; UCHAR HalpProfileRate = 3; /* FUNCTIONS *****************************************************************/ VOID NTAPI HalStopProfileInterrupt( _In_ KPROFILE_SOURCE ProfileSource) { UNREFERENCED_PARAMETER(ProfileSource); HalpAcquireCmosSpinLock(); /* Clear the interrupt flag */ (VOID)__inbyte(RTC_IO_i_INTERRUPT_RESET); HalpProfilingStopped = TRUE; HalpReleaseCmosSpinLock(); } VOID NTAPI HalStartProfileInterrupt( _In_ KPROFILE_SOURCE ProfileSource) { UNREFERENCED_PARAMETER(ProfileSource); HalpProfilingStopped = FALSE; HalpAcquireCmosSpinLock(); /* Configure the clock divisor for generating periodic interrupts */ __outbyte(RTC_IO_o_INT_CLOCK_DIVISOR, HalpProfileRate | 0x80); HalpReleaseCmosSpinLock(); } ULONG_PTR NTAPI HalSetProfileInterval( _In_ ULONG_PTR Interval) { /* * FIXME: * 1) What is the maximum and minimum interrupt frequency for the RTC? * 2) Find the maximum possible clock divisor value. */ UNIMPLEMENTED; /* Update interval */ if (!HalpProfilingStopped) HalStartProfileInterrupt(0); /* For now... */ return Interval; }