mirror of
https://github.com/hermitcore/libhermit.git
synced 2025-03-09 00:00:03 +01:00
asm/irqflags: fix documentation and simplify
This commit is contained in:
parent
047dbfd56f
commit
321d86b466
1 changed files with 44 additions and 43 deletions
|
@ -41,54 +41,12 @@
|
|||
extern "C" {
|
||||
#endif
|
||||
|
||||
/** @brief Disable IRQs
|
||||
*
|
||||
* This inline function just clears out the interrupt bit
|
||||
*/
|
||||
inline static void irq_disable(void) {
|
||||
asm volatile("cli" ::: "memory");
|
||||
}
|
||||
|
||||
/** @brief Disable IRQs (nested)
|
||||
*
|
||||
* Disable IRQs when unsure if IRQs were enabled at all.\n
|
||||
* 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.
|
||||
*
|
||||
* @return The set of flags which have been set until now
|
||||
*/
|
||||
inline static uint8_t irq_nested_disable(void) {
|
||||
size_t flags;
|
||||
asm volatile("pushf; cli; pop %0": "=r"(flags) : : "memory");
|
||||
if (flags & (1 << 9))
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** @brief Enable IRQs */
|
||||
inline static void irq_enable(void) {
|
||||
asm volatile("sti" ::: "memory");
|
||||
}
|
||||
|
||||
/** @brief Enable IRQs (nested)
|
||||
*
|
||||
* If called after calling irq_nested_disable, this function will
|
||||
* not activate IRQs if they were not active before.
|
||||
*
|
||||
* @param flags Flags to set. Could be the old ones you got from irq_nested_disable.
|
||||
*/
|
||||
inline static void irq_nested_enable(uint8_t flags) {
|
||||
if (flags)
|
||||
irq_enable();
|
||||
}
|
||||
|
||||
/** @brief Determines, if the interrupt flags (IF) is set
|
||||
*
|
||||
* @return
|
||||
* - 1 interrupt flag is set
|
||||
* - 0 interrupt flag is cleared
|
||||
*/
|
||||
*/
|
||||
inline static uint8_t is_irq_enabled(void)
|
||||
{
|
||||
size_t flags;
|
||||
|
@ -98,6 +56,49 @@ inline static uint8_t is_irq_enabled(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/** @brief Disable IRQs
|
||||
*
|
||||
* This inline function just clears out the interrupt bit
|
||||
*/
|
||||
inline static void irq_disable(void) {
|
||||
asm volatile("cli" ::: "memory");
|
||||
}
|
||||
|
||||
/** @brief Enable IRQs
|
||||
*
|
||||
* This inline function just sets the interrupt bit
|
||||
*/
|
||||
inline static void irq_enable(void) {
|
||||
asm volatile("sti" ::: "memory");
|
||||
}
|
||||
|
||||
/** @brief Disable IRQs (nested)
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* @return Whether IRQs had been enabled or not before disabling
|
||||
*/
|
||||
inline static uint8_t irq_nested_disable(void) {
|
||||
uint8_t was_enabled = is_irq_enabled();
|
||||
irq_disable();
|
||||
return was_enabled;
|
||||
}
|
||||
|
||||
/** @brief Enable IRQs (nested)
|
||||
*
|
||||
* Can be used in conjunction with irq_nested_disable() to only enable
|
||||
* interrupts again if they were enabled before.
|
||||
*
|
||||
* @param was_enabled Whether IRQs should be enabled or not
|
||||
*/
|
||||
inline static void irq_nested_enable(uint8_t was_enabled) {
|
||||
if (was_enabled)
|
||||
irq_enable();
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Add table
Reference in a new issue