2012-06-26 16:06:37 +02:00
# ifndef __S390_ASM_SIGP_H
# define __S390_ASM_SIGP_H
/* SIGP order codes */
# define SIGP_SENSE 1
# define SIGP_EXTERNAL_CALL 2
# define SIGP_EMERGENCY_SIGNAL 3
2013-12-03 12:54:55 +01:00
# define SIGP_START 4
2012-06-26 16:06:37 +02:00
# define SIGP_STOP 5
# define SIGP_RESTART 6
# define SIGP_STOP_AND_STORE_STATUS 9
# define SIGP_INITIAL_CPU_RESET 11
2014-05-23 12:22:56 +02:00
# define SIGP_CPU_RESET 12
2012-06-26 16:06:37 +02:00
# define SIGP_SET_PREFIX 13
# define SIGP_STORE_STATUS_AT_ADDRESS 14
# define SIGP_SET_ARCHITECTURE 18
2013-11-21 16:01:48 +01:00
# define SIGP_COND_EMERGENCY_SIGNAL 19
2012-06-26 16:06:37 +02:00
# define SIGP_SENSE_RUNNING 21
2015-01-14 17:52:10 +01:00
# define SIGP_SET_MULTI_THREADING 22
2014-10-06 17:57:43 +02:00
# define SIGP_STORE_ADDITIONAL_STATUS 23
2012-06-26 16:06:37 +02:00
/* SIGP condition codes */
# define SIGP_CC_ORDER_CODE_ACCEPTED 0
# define SIGP_CC_STATUS_STORED 1
# define SIGP_CC_BUSY 2
# define SIGP_CC_NOT_OPERATIONAL 3
/* SIGP cpu status bits */
2016-03-04 12:23:55 +01:00
# define SIGP_STATUS_INVALID_ORDER 0x00000002UL
2012-06-26 16:06:37 +02:00
# define SIGP_STATUS_CHECK_STOP 0x00000010UL
# define SIGP_STATUS_STOPPED 0x00000040UL
2012-06-26 16:06:41 +02:00
# define SIGP_STATUS_EXT_CALL_PENDING 0x00000080UL
2012-06-26 16:06:37 +02:00
# define SIGP_STATUS_INVALID_PARAMETER 0x00000100UL
# define SIGP_STATUS_INCORRECT_STATE 0x00000200UL
# define SIGP_STATUS_NOT_RUNNING 0x00000400UL
2014-04-04 11:23:03 +02:00
# ifndef __ASSEMBLY__
2016-06-20 14:04:17 +02:00
static inline int ____pcpu_sigp ( u16 addr , u8 order , unsigned long parm ,
u32 * status )
2014-04-04 11:23:03 +02:00
{
2014-10-06 17:57:43 +02:00
register unsigned long reg1 asm ( " 1 " ) = parm ;
2014-04-04 11:23:03 +02:00
int cc ;
asm volatile (
" sigp %1,%2,0(%3) \n "
" ipm %0 \n "
" srl %0,28 \n "
: " =d " ( cc ) , " +d " ( reg1 ) : " d " ( addr ) , " a " ( order ) : " cc " ) ;
2016-06-20 14:04:17 +02:00
* status = reg1 ;
return cc ;
}
static inline int __pcpu_sigp ( u16 addr , u8 order , unsigned long parm ,
u32 * status )
{
u32 _status ;
int cc ;
cc = ____pcpu_sigp ( addr , order , parm , & _status ) ;
2017-05-19 09:07:23 +02:00
if ( status & & cc = = SIGP_CC_STATUS_STORED )
2016-06-20 14:04:17 +02:00
* status = _status ;
2014-04-04 11:23:03 +02:00
return cc ;
}
# endif /* __ASSEMBLY__ */
2012-06-26 16:06:37 +02:00
# endif /* __S390_ASM_SIGP_H */