InterruptDisabler.h 712 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /*
  2. * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Types.h>
  8. #include <Kernel/IO.h>
  9. #include <Kernel/Arch/x86/ASM_wrapper.h>
  10. namespace Kernel {
  11. class InterruptDisabler {
  12. public:
  13. InterruptDisabler()
  14. {
  15. m_flags = cpu_flags();
  16. cli();
  17. }
  18. ~InterruptDisabler()
  19. {
  20. if (m_flags & 0x200)
  21. sti();
  22. }
  23. private:
  24. u32 m_flags;
  25. };
  26. class NonMaskableInterruptDisabler {
  27. public:
  28. NonMaskableInterruptDisabler()
  29. {
  30. IO::out8(0x70, IO::in8(0x70) | 0x80);
  31. }
  32. ~NonMaskableInterruptDisabler()
  33. {
  34. IO::out8(0x70, IO::in8(0x70) & 0x7F);
  35. }
  36. };
  37. }