daifflags.h 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /*
  2. * Copyright (C) 2017 ARM Ltd.
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License version 2 as
  6. * published by the Free Software Foundation.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #ifndef __ASM_DAIFFLAGS_H
  17. #define __ASM_DAIFFLAGS_H
  18. #include <linux/irqflags.h>
  19. #define DAIF_PROCCTX 0
  20. #define DAIF_PROCCTX_NOIRQ PSR_I_BIT
  21. /* mask/save/unmask/restore all exceptions, including interrupts. */
  22. static inline void local_daif_mask(void)
  23. {
  24. asm volatile(
  25. "msr daifset, #0xf // local_daif_mask\n"
  26. :
  27. :
  28. : "memory");
  29. trace_hardirqs_off();
  30. }
  31. static inline unsigned long local_daif_save(void)
  32. {
  33. unsigned long flags;
  34. flags = arch_local_save_flags();
  35. local_daif_mask();
  36. return flags;
  37. }
  38. static inline void local_daif_unmask(void)
  39. {
  40. trace_hardirqs_on();
  41. asm volatile(
  42. "msr daifclr, #0xf // local_daif_unmask"
  43. :
  44. :
  45. : "memory");
  46. }
  47. static inline void local_daif_restore(unsigned long flags)
  48. {
  49. if (!arch_irqs_disabled_flags(flags))
  50. trace_hardirqs_on();
  51. arch_local_irq_restore(flags);
  52. if (arch_irqs_disabled_flags(flags))
  53. trace_hardirqs_off();
  54. }
  55. #endif