| /** @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 | |
| } |