Interrupts.h 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /*
  2. * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  3. * Copyright (c) 2021, Leon Albrecht <leon2002.la@gmail.com>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #pragma once
  8. #include <AK/Types.h>
  9. #include <Kernel/Interrupts/GenericInterruptHandler.h>
  10. namespace Kernel {
  11. class GenericInterruptHandeler;
  12. extern "C" void interrupt_common_asm_entry();
  13. #if ARCH(I386)
  14. # define INTERRUPT_HANDLER_PUSH_PADDING
  15. #else
  16. # define INTERRUPT_HANDLER_PUSH_PADDING "pushw $0\npushw $0\n"
  17. #endif
  18. // clang-format off
  19. #define GENERATE_GENERIC_INTERRUPT_HANDLER_ASM_ENTRY(isr_number) \
  20. extern "C" void interrupt_##isr_number##_asm_entry(); \
  21. static void interrupt_##isr_number##_asm_entry_dummy() __attribute__((used)); \
  22. NEVER_INLINE void interrupt_##isr_number##_asm_entry_dummy() \
  23. { \
  24. asm(".globl interrupt_" #isr_number "_asm_entry\n" \
  25. "interrupt_" #isr_number "_asm_entry:\n" \
  26. INTERRUPT_HANDLER_PUSH_PADDING \
  27. " pushw $" #isr_number "\n" \
  28. " pushw $0\n" \
  29. " jmp interrupt_common_asm_entry\n"); \
  30. }
  31. // clang-format on
  32. void register_interrupt_handler(u8 number, void (*handler)());
  33. void register_user_callable_interrupt_handler(u8 number, void (*handler)());
  34. GenericInterruptHandler& get_interrupt_handler(u8 interrupt_number);
  35. void register_generic_interrupt_handler(u8 number, GenericInterruptHandler&);
  36. void unregister_generic_interrupt_handler(u8 number, GenericInterruptHandler&);
  37. void idt_init();
  38. }