mirror of https://github.com/acidanthera/audk.git
63 lines
1.3 KiB
C
63 lines
1.3 KiB
C
|
/** @file
|
||
|
Force interrupt handler to return with interrupts still disabled.
|
||
|
|
||
|
Copyright (C) 2022, Fen Systems Ltd.
|
||
|
|
||
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||
|
**/
|
||
|
|
||
|
#include <Library/BaseLib.h>
|
||
|
#include <Library/DebugLib.h>
|
||
|
|
||
|
#include "Iret.h"
|
||
|
|
||
|
/**
|
||
|
Force interrupt handler to return with interrupts still disabled.
|
||
|
|
||
|
@param SystemContext A pointer to the system context when the
|
||
|
interrupt occurred.
|
||
|
**/
|
||
|
VOID
|
||
|
DisableInterruptsOnIret (
|
||
|
IN OUT EFI_SYSTEM_CONTEXT SystemContext
|
||
|
)
|
||
|
{
|
||
|
#if defined (MDE_CPU_X64)
|
||
|
|
||
|
IA32_EFLAGS32 Rflags;
|
||
|
|
||
|
//
|
||
|
// Get flags from system context.
|
||
|
//
|
||
|
Rflags.UintN = SystemContext.SystemContextX64->Rflags;
|
||
|
ASSERT (Rflags.Bits.IF);
|
||
|
|
||
|
//
|
||
|
// Clear interrupts-enabled flag.
|
||
|
//
|
||
|
Rflags.Bits.IF = 0;
|
||
|
SystemContext.SystemContextX64->Rflags = Rflags.UintN;
|
||
|
|
||
|
#elif defined (MDE_CPU_IA32)
|
||
|
|
||
|
IA32_EFLAGS32 Eflags;
|
||
|
|
||
|
//
|
||
|
// Get flags from system context.
|
||
|
//
|
||
|
Eflags.UintN = SystemContext.SystemContextIa32->Eflags;
|
||
|
ASSERT (Eflags.Bits.IF);
|
||
|
|
||
|
//
|
||
|
// Clear interrupts-enabled flag.
|
||
|
//
|
||
|
Eflags.Bits.IF = 0;
|
||
|
SystemContext.SystemContextIa32->Eflags = Eflags.UintN;
|
||
|
|
||
|
#else
|
||
|
|
||
|
#error "Unsupported CPU"
|
||
|
|
||
|
#endif
|
||
|
}
|