sigp.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:3k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  *  include/asm-s390/sigp.h
  3.  *
  4.  *  S390 version
  5.  *    Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation
  6.  *    Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com),
  7.  *               Martin Schwidefsky (schwidefsky@de.ibm.com)
  8.  *
  9.  *  sigp.h by D.J. Barrow (c) IBM 1999
  10.  *  contains routines / structures for signalling other S/390 processors in an
  11.  *  SMP configuration.
  12.  */
  13. #ifndef __SIGP__
  14. #define __SIGP__
  15. #include <asm/ptrace.h>
  16. #include <asm/atomic.h>
  17. /* get real cpu address from logical cpu number */
  18. extern volatile int __cpu_logical_map[];
  19. typedef enum
  20. {
  21. sigp_unassigned=0x0,
  22. sigp_sense,
  23. sigp_external_call,
  24. sigp_emergency_signal,
  25. sigp_start,
  26. sigp_stop,
  27. sigp_restart,
  28. sigp_unassigned1,
  29. sigp_unassigned2,
  30. sigp_stop_and_store_status,
  31. sigp_unassigned3,
  32. sigp_initial_cpu_reset,
  33. sigp_cpu_reset,
  34. sigp_set_prefix,
  35. sigp_store_status_at_address,
  36. sigp_store_extended_status_at_address
  37. } sigp_order_code;
  38. typedef __u32 sigp_status_word;
  39. typedef enum
  40. {
  41.         sigp_order_code_accepted=0,
  42. sigp_status_stored,
  43. sigp_busy,
  44. sigp_not_operational
  45. } sigp_ccode;
  46. /*
  47.  * Definitions for the external call
  48.  */
  49. /* 'Bit' signals, asynchronous */
  50. typedef enum
  51. {
  52. ec_schedule=0,
  53. ec_call_function,
  54. ec_bit_last
  55. } ec_bit_sig;
  56. /*
  57.  * Signal processor
  58.  */
  59. extern __inline__ sigp_ccode
  60. signal_processor(__u16 cpu_addr, sigp_order_code order_code)
  61. {
  62. sigp_ccode ccode;
  63. __asm__ __volatile__(
  64. "    sgr    1,1n"        /* parameter=0 in gpr 1 */
  65. "    sigp   1,%1,0(%2)n"
  66. "    ipm    %0n"
  67. "    srl    %0,28"
  68. : "=d" (ccode)
  69. : "d" (__cpu_logical_map[cpu_addr]), "a" (order_code)
  70. : "cc" , "memory", "1" );
  71. return ccode;
  72. }
  73. /*
  74.  * Signal processor with parameter
  75.  */
  76. extern __inline__ sigp_ccode
  77. signal_processor_p(__u64 parameter,__u16 cpu_addr,sigp_order_code order_code)
  78. {
  79. sigp_ccode ccode;
  80. __asm__ __volatile__(
  81. "    lgr    1,%1n"       /* parameter in gpr 1 */
  82. "    sigp   1,%2,0(%3)n"
  83. "    ipm    %0n"
  84. "    srl    %0,28n"
  85. : "=d" (ccode)
  86. : "d" (parameter), "d" (__cpu_logical_map[cpu_addr]),
  87.                   "a" (order_code)
  88. : "cc" , "memory", "1" );
  89. return ccode;
  90. }
  91. /*
  92.  * Signal processor with parameter and return status
  93.  */
  94. extern __inline__ sigp_ccode
  95. signal_processor_ps(__u32 *statusptr, __u64 parameter,
  96.     __u16 cpu_addr, sigp_order_code order_code)
  97. {
  98. sigp_ccode ccode;
  99. __asm__ __volatile__(
  100. "    sgr    2,2n"        /* clear status so it doesn't contain rubbish if not saved. */
  101. "    lgr    3,%2n"       /* parameter in gpr 3 */
  102. "    sigp   2,%3,0(%4)n"
  103. "    stg    2,%1n"
  104. "    ipm    %0n"
  105. "    srl    %0,28n"
  106. : "=d" (ccode), "=m" (*statusptr)
  107. : "d" (parameter), "d" (__cpu_logical_map[cpu_addr]),
  108.                   "a" (order_code)
  109. : "cc" , "memory", "2" , "3"
  110. );
  111.    return ccode;
  112. }
  113. #endif /* __SIGP__ */