mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-03 13:13:30 +01:00
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
|
|
}
|