Windows2000/private/ntos/ke/mips/xxmpipi.c
2020-09-30 17:12:32 +02:00

99 lines
3.2 KiB
C

/*++
Copyright (c) 1993 Microsoft Corporation
Module Name:
xxmpipi.c
Abstract:
This module implements MIPS specific MP routine.
Author:
David N. Cutler 24-Apr-1993
Environment:
Kernel mode only.
--*/
#include "ki.h"
VOID KiRestoreProcessorState (IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame)
/*++
Routine Description:
This function moves processor register state from the current processor context structure in the processor block to the specified trap and exception frames.
Arguments:
TrapFrame - Supplies a pointer to a trap frame.
ExceptionFrame - Supplies a pointer to an exception frame.
--*/
{
PKPRCB Prcb;
// Get the address of the current processor block and move the specified register state from the processor context structure to the specified trap and exception frames
Prcb = KeGetCurrentPrcb();
KeContextToKframes(TrapFrame, ExceptionFrame, &Prcb->ProcessorState.ContextFrame, CONTEXT_FULL, KernelMode);
}
VOID KiSaveProcessorState (IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame)
/*++
Routine Description:
This function moves processor register state from the specified trap and exception frames to the processor context structure in the current processor block.
Arguments:
TrapFrame - Supplies a pointer to a trap frame.
ExceptionFrame - Supplies a pointer to an exception frame.
--*/
{
PKPRCB Prcb;
// Get the address of the current processor block and move the specified register state from specified trap and exception frames to the current processor context structure.
Prcb = KeGetCurrentPrcb();
Prcb->ProcessorState.ContextFrame.ContextFlags = CONTEXT_FULL;
KeContextFromKframes(TrapFrame, ExceptionFrame, &Prcb->ProcessorState.ContextFrame);
// Save the current processor control state.
KiSaveProcessorControlState(&Prcb->ProcessorState);
}
VOID KiSaveProcessorControlState (IN PKPROCESSOR_STATE ProcessorState)
/*++
Routine Description:
This routine saves the processor's control state for debugger.
Arguments:
ProcessorState (a0) - Supplies a pointer to the processor state.
--*/
{
ULONG Index;
// Read Tb entries and store in the processor state structure.
for (Index = 0; Index < KeNumberTbEntries; Index += 1) {
KiReadEntryTb(Index, &ProcessorState->TbEntry[Index]);
}
}
BOOLEAN KiIpiServiceRoutine (IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame)
/*++
Routine Description:
This function is called at IPI_LEVEL to process any outstanding interprocess request for the current processor.
Arguments:
TrapFrame - Supplies a pointer to a trap frame.
ExceptionFrame - Supplies a pointer to an exception frame
Return Value:
A value of TRUE is returned, if one of more requests were service.
Otherwise, FALSE is returned.
--*/
{
ULONG RequestSummary;
// Process any outstanding interprocessor requests.
RequestSummary = KiIpiProcessRequests();
// If freeze is requested, then freeze target execution.
if ((RequestSummary & IPI_FREEZE) != 0) {
KiFreezeTargetExecution(TrapFrame, ExceptionFrame);
}
// Return whether any requests were processed.
return (RequestSummary & ~IPI_FREEZE) != 0;
}