Files
MentOS/mentos/inc/klib/irqflags.h
T
Enrico Fraccaroli (Galfurian) 1b2bc49d41 Update license and remove unused files.
2022-01-27 15:12:36 -05:00

52 lines
1.4 KiB
C

/// @file irqflags.h
/// @brief
/// @copyright (c) 2014-2022 This file is distributed under the MIT License.
/// See LICENSE.md for details.
#pragma once
#include "proc_access.h"
#include "stddef.h"
#include "stdint.h"
/// @brief Enable IRQs (nested).
/// @details If called after calling irq_nested_disable, this function will
/// not activate IRQs if they were not active before.
inline static void irq_nested_enable(uint8_t flags)
{
if (flags) {
sti();
}
}
/// @brief Disable IRQs (nested).
/// @details Disable IRQs when unsure if IRQs were enabled at all.
/// This function together with irq_nested_enable can be used in
/// situations when interrupts shouldn't be activated if they were not
/// activated before calling this function.
inline static uint8_t irq_nested_disable()
{
size_t flags;
__asm__ __volatile__("pushf; cli; pop %0"
: "=r"(flags)
:
: "memory");
if (flags & (1 << 9))
return 1;
return 0;
}
/// @brief Determines, if the interrupt flags (IF) is set.
inline static uint8_t is_irq_enabled()
{
size_t flags;
__asm__ __volatile__("pushf; pop %0"
: "=r"(flags)
:
: "memory");
if (flags & (1 << 9)) {
return 1;
}
return 0;
}