diff --git a/headers/private/kernel/arch/int.h b/headers/private/kernel/arch/int.h index ecbe5c8554..a2d9d0ffa7 100644 --- a/headers/private/kernel/arch/int.h +++ b/headers/private/kernel/arch/int.h @@ -8,7 +8,6 @@ #ifndef KERNEL_ARCH_INT_H #define KERNEL_ARCH_INT_H -#include // config flags for arch_int_configure_io_interrupt() #define B_EDGE_TRIGGERED 1 @@ -38,4 +37,8 @@ bool arch_int_are_interrupts_enabled(void); } #endif + +#include + + #endif /* KERNEL_ARCH_INT_H */ diff --git a/headers/private/kernel/arch/x86/arch_int.h b/headers/private/kernel/arch/x86/arch_int.h index a4d613ea97..d1eeee4b97 100644 --- a/headers/private/kernel/arch/x86/arch_int.h +++ b/headers/private/kernel/arch/x86/arch_int.h @@ -10,4 +10,58 @@ #define NUM_IO_VECTORS (256 - ARCH_INTERRUPT_BASE) +static inline void +arch_int_enable_interrupts_inline(void) +{ + asm volatile("sti"); +} + + +static inline int +arch_int_disable_interrupts_inline(void) +{ + int flags; + + asm volatile("pushfl;\n" + "popl %0;\n" + "cli" : "=g" (flags)); + return flags & 0x200 ? 1 : 0; +} + + +static inline void +arch_int_restore_interrupts_inline(int oldstate) +{ + int flags = oldstate ? 0x200 : 0; + + asm volatile("pushfl;\n" + "popl %1;\n" + "andl $0xfffffdff,%1;\n" + "orl %0,%1;\n" + "pushl %1;\n" + "popfl\n" + : : "r" (flags), "r" (0)); +} + + +static inline bool +arch_int_are_interrupts_enabled_inline(void) +{ + int flags; + + asm volatile("pushfl;\n" + "popl %0;\n" : "=g" (flags)); + return flags & 0x200 ? 1 : 0; +} + + +// map the functions to the inline versions +#define arch_int_enable_interrupts() arch_int_enable_interrupts_inline() +#define arch_int_disable_interrupts() arch_int_disable_interrupts_inline() +#define arch_int_restore_interrupts(status) \ + arch_int_restore_interrupts_inline(status) +#define arch_int_are_interrupts_enabled() \ + arch_int_are_interrupts_enabled_inline() + + #endif /* _KERNEL_ARCH_x86_INT_H */ diff --git a/headers/private/kernel/int.h b/headers/private/kernel/int.h index 5d19166cf0..d26bb51db4 100644 --- a/headers/private/kernel/int.h +++ b/headers/private/kernel/int.h @@ -42,4 +42,10 @@ are_interrupts_enabled(void) } #endif + +// map those directly to the arch versions, so they can be inlined +#define disable_interrupts() arch_int_disable_interrupts() +#define restore_interrupts(status) arch_int_restore_interrupts(status) + + #endif /* _KERNEL_INT_H */ diff --git a/src/system/kernel/arch/x86/arch_int.c b/src/system/kernel/arch/x86/arch_int.c index 69e3475c57..6453c0f579 100644 --- a/src/system/kernel/arch/x86/arch_int.c +++ b/src/system/kernel/arch/x86/arch_int.c @@ -645,48 +645,37 @@ arch_int_configure_io_interrupt(int irq, uint32 config) } +#undef arch_int_enable_interrupts +#undef arch_int_disable_interrupts +#undef arch_int_restore_interrupts +#undef arch_int_are_interrupts_enabled + + void arch_int_enable_interrupts(void) { - asm("sti"); + arch_int_enable_interrupts_inline(); } int arch_int_disable_interrupts(void) { - int flags; - - asm("pushfl;\n" - "popl %0;\n" - "cli" : "=g" (flags)); - return flags & 0x200 ? 1 : 0; + return arch_int_disable_interrupts_inline(); } void arch_int_restore_interrupts(int oldstate) { - int flags = oldstate ? 0x200 : 0; - - asm("pushfl;\n" - "popl %1;\n" - "andl $0xfffffdff,%1;\n" - "orl %0,%1;\n" - "pushl %1;\n" - "popfl\n" - : : "r" (flags), "r" (0)); + arch_int_restore_interrupts_inline(oldstate); } bool arch_int_are_interrupts_enabled(void) { - int flags; - - asm("pushfl;\n" - "popl %0;\n" : "=g" (flags)); - return flags & 0x200 ? 1 : 0; + return arch_int_are_interrupts_enabled_inline(); } diff --git a/src/system/kernel/arch/x86/arch_vm_translation_map.cpp b/src/system/kernel/arch/x86/arch_vm_translation_map.cpp index f8d2e8f2d6..7f3cc4f6b0 100644 --- a/src/system/kernel/arch/x86/arch_vm_translation_map.cpp +++ b/src/system/kernel/arch/x86/arch_vm_translation_map.cpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include diff --git a/src/system/kernel/int.c b/src/system/kernel/int.c index b40ab4ddf0..0f97dbdfff 100644 --- a/src/system/kernel/int.c +++ b/src/system/kernel/int.c @@ -248,6 +248,10 @@ int_io_interrupt_handler(int vector, bool levelTriggered) // #pragma mark - public API +#undef disable_interrupts +#undef restore_interrupts + + cpu_status disable_interrupts(void) {