mirror of https://github.com/acidanthera/audk.git
91 lines
2.5 KiB
C
91 lines
2.5 KiB
C
/** @file
|
|
Code for debug timer to support debug agent library implementation.
|
|
|
|
Copyright (c) 2010 - 2013, Intel Corporation. All rights reserved.<BR>
|
|
This program and the accompanying materials
|
|
are licensed and made available under the terms and conditions of the BSD License
|
|
which accompanies this distribution. The full text of the license may be found at
|
|
http://opensource.org/licenses/bsd-license.php.
|
|
|
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
|
|
**/
|
|
|
|
#include "DebugAgent.h"
|
|
|
|
/**
|
|
Initialize CPU local APIC timer.
|
|
|
|
**/
|
|
VOID
|
|
InitializeDebugTimer (
|
|
VOID
|
|
)
|
|
{
|
|
UINTN ApicTimerDivisor;
|
|
UINT32 InitialCount;
|
|
|
|
GetApicTimerState (&ApicTimerDivisor, NULL, NULL);
|
|
|
|
//
|
|
// Cpu Local Apic timer interrupt frequency, it is set to 0.1s
|
|
//
|
|
InitialCount = (UINT32)DivU64x32 (
|
|
MultU64x64 (
|
|
PcdGet32(PcdFSBClock) / (UINT32)ApicTimerDivisor,
|
|
100
|
|
),
|
|
1000
|
|
);
|
|
|
|
InitializeApicTimer (ApicTimerDivisor, InitialCount, TRUE, DEBUG_TIMER_VECTOR);
|
|
|
|
if (MultiProcessorDebugSupport()) {
|
|
mDebugMpContext.DebugTimerInitCount = InitialCount;
|
|
}
|
|
}
|
|
|
|
/**
|
|
Enable/Disable the interrupt of debug timer and return the interrupt state
|
|
prior to the operation.
|
|
|
|
If EnableStatus is TRUE, enable the interrupt of debug timer.
|
|
If EnableStatus is FALSE, disable the interrupt of debug timer.
|
|
|
|
@param[in] EnableStatus Enable/Disable.
|
|
|
|
@retval TRUE Debug timer interrupt were enabled on entry to this call.
|
|
@retval FALSE Debug timer interrupt were disabled on entry to this call.
|
|
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
SaveAndSetDebugTimerInterrupt (
|
|
IN BOOLEAN EnableStatus
|
|
)
|
|
{
|
|
BOOLEAN OldDebugTimerInterruptState;
|
|
|
|
OldDebugTimerInterruptState = GetApicTimerInterruptState ();
|
|
|
|
if (OldDebugTimerInterruptState != EnableStatus) {
|
|
if (EnableStatus) {
|
|
EnableApicTimerInterrupt ();
|
|
} else {
|
|
DisableApicTimerInterrupt ();
|
|
}
|
|
//
|
|
// Validate the Debug Timer interrupt state
|
|
// This will make additional delay after Local Apic Timer interrupt state is changed.
|
|
// Thus, CPU could handle the potential pending interrupt of Local Apic timer.
|
|
//
|
|
while (GetApicTimerInterruptState () != EnableStatus) {
|
|
CpuPause ();
|
|
}
|
|
}
|
|
|
|
return OldDebugTimerInterruptState;
|
|
}
|
|
|