52 lines
1.4 KiB
C
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;
|
|
}
|