irqflags.h 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #ifndef _H8300_IRQFLAGS_H
  2. #define _H8300_IRQFLAGS_H
  3. #ifdef CONFIG_CPU_H8300H
  4. typedef unsigned char h8300flags;
  5. static inline h8300flags arch_local_save_flags(void)
  6. {
  7. h8300flags flags;
  8. __asm__ volatile ("stc ccr,%w0" : "=r" (flags));
  9. return flags;
  10. }
  11. static inline void arch_local_irq_disable(void)
  12. {
  13. __asm__ volatile ("orc #0xc0,ccr");
  14. }
  15. static inline void arch_local_irq_enable(void)
  16. {
  17. __asm__ volatile ("andc #0x3f,ccr");
  18. }
  19. static inline h8300flags arch_local_irq_save(void)
  20. {
  21. h8300flags flags;
  22. __asm__ volatile ("stc ccr,%w0\n\t"
  23. "orc #0xc0,ccr" : "=r" (flags));
  24. return flags;
  25. }
  26. static inline void arch_local_irq_restore(h8300flags flags)
  27. {
  28. __asm__ volatile ("ldc %w0,ccr" : : "r" (flags) : "cc");
  29. }
  30. static inline int arch_irqs_disabled_flags(unsigned long flags)
  31. {
  32. return (flags & 0xc0) == 0xc0;
  33. }
  34. #endif
  35. #ifdef CONFIG_CPU_H8S
  36. typedef unsigned short h8300flags;
  37. static inline h8300flags arch_local_save_flags(void)
  38. {
  39. h8300flags flags;
  40. __asm__ volatile ("stc ccr,%w0\n\tstc exr,%x0" : "=r" (flags));
  41. return flags;
  42. }
  43. static inline void arch_local_irq_disable(void)
  44. {
  45. __asm__ volatile ("orc #0x80,ccr\n\t");
  46. }
  47. static inline void arch_local_irq_enable(void)
  48. {
  49. __asm__ volatile ("andc #0x7f,ccr\n\t"
  50. "andc #0xf0,exr\n\t");
  51. }
  52. static inline h8300flags arch_local_irq_save(void)
  53. {
  54. h8300flags flags;
  55. __asm__ volatile ("stc ccr,%w0\n\t"
  56. "stc exr,%x0\n\t"
  57. "orc #0x80,ccr\n\t"
  58. : "=r" (flags));
  59. return flags;
  60. }
  61. static inline void arch_local_irq_restore(h8300flags flags)
  62. {
  63. __asm__ volatile ("ldc %w0,ccr\n\t"
  64. "ldc %x0,exr"
  65. : : "r" (flags) : "cc");
  66. }
  67. static inline int arch_irqs_disabled_flags(h8300flags flags)
  68. {
  69. return (flags & 0x0080) == 0x0080;
  70. }
  71. #endif
  72. static inline int arch_irqs_disabled(void)
  73. {
  74. return arch_irqs_disabled_flags(arch_local_save_flags());
  75. }
  76. #endif /* _H8300_IRQFLAGS_H */