ctl_reg.h 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /*
  2. * Copyright IBM Corp. 1999, 2009
  3. *
  4. * Author(s): Martin Schwidefsky <schwidefsky@de.ibm.com>
  5. */
  6. #ifndef __ASM_CTL_REG_H
  7. #define __ASM_CTL_REG_H
  8. #ifdef CONFIG_64BIT
  9. # define __CTL_LOAD "lctlg"
  10. # define __CTL_STORE "stctg"
  11. #else
  12. # define __CTL_LOAD "lctl"
  13. # define __CTL_STORE "stctl"
  14. #endif
  15. #define __ctl_load(array, low, high) { \
  16. typedef struct { char _[sizeof(array)]; } addrtype; \
  17. \
  18. BUILD_BUG_ON(sizeof(addrtype) != (high - low + 1) * sizeof(long));\
  19. asm volatile( \
  20. __CTL_LOAD " %1,%2,%0\n" \
  21. : : "Q" (*(addrtype *)(&array)), "i" (low), "i" (high));\
  22. }
  23. #define __ctl_store(array, low, high) { \
  24. typedef struct { char _[sizeof(array)]; } addrtype; \
  25. \
  26. BUILD_BUG_ON(sizeof(addrtype) != (high - low + 1) * sizeof(long));\
  27. asm volatile( \
  28. __CTL_STORE " %1,%2,%0\n" \
  29. : "=Q" (*(addrtype *)(&array)) \
  30. : "i" (low), "i" (high)); \
  31. }
  32. static inline void __ctl_set_bit(unsigned int cr, unsigned int bit)
  33. {
  34. unsigned long reg;
  35. __ctl_store(reg, cr, cr);
  36. reg |= 1UL << bit;
  37. __ctl_load(reg, cr, cr);
  38. }
  39. static inline void __ctl_clear_bit(unsigned int cr, unsigned int bit)
  40. {
  41. unsigned long reg;
  42. __ctl_store(reg, cr, cr);
  43. reg &= ~(1UL << bit);
  44. __ctl_load(reg, cr, cr);
  45. }
  46. void smp_ctl_set_bit(int cr, int bit);
  47. void smp_ctl_clear_bit(int cr, int bit);
  48. #ifdef CONFIG_SMP
  49. # define ctl_set_bit(cr, bit) smp_ctl_set_bit(cr, bit)
  50. # define ctl_clear_bit(cr, bit) smp_ctl_clear_bit(cr, bit)
  51. #else
  52. # define ctl_set_bit(cr, bit) __ctl_set_bit(cr, bit)
  53. # define ctl_clear_bit(cr, bit) __ctl_clear_bit(cr, bit)
  54. #endif
  55. #endif /* __ASM_CTL_REG_H */