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 14#ifndef __SIGP__ 15#define __SIGP__ 16 17#include <asm/ptrace.h> 18#include <asm/atomic.h> 19 20/* get real cpu address from logical cpu number */ 21extern volatile int __cpu_logical_map[]; 22 23typedef enum 24{ 25 sigp_unassigned=0x0, 26 sigp_sense, 27 sigp_external_call, 28 sigp_emergency_signal, 29 sigp_start, 30 sigp_stop, 31 sigp_restart, 32 sigp_unassigned1, 33 sigp_unassigned2, 34 sigp_stop_and_store_status, 35 sigp_unassigned3, 36 sigp_initial_cpu_reset, 37 sigp_cpu_reset, 38 sigp_set_prefix, 39 sigp_store_status_at_address, 40 sigp_store_extended_status_at_address 41} sigp_order_code; 42 43typedef __u32 sigp_status_word; 44 45typedef enum 46{ 47 sigp_order_code_accepted=0, 48 sigp_status_stored, 49 sigp_busy, 50 sigp_not_operational 51} sigp_ccode; 52 53 54/* 55 * Definitions for the external call 56 */ 57 58/* 'Bit' signals, asynchronous */ 59typedef enum 60{ 61 ec_schedule=0, 62 ec_call_function, 63 ec_bit_last 64} ec_bit_sig; 65 66 67/* 68 * Signal processor 69 */ 70extern __inline__ sigp_ccode 71signal_processor(__u16 cpu_addr, sigp_order_code order_code) 72{ 73 sigp_ccode ccode; 74 75 __asm__ __volatile__( 76 " sgr 1,1\n" /* parameter=0 in gpr 1 */ 77 " sigp 1,%1,0(%2)\n" 78 " ipm %0\n" 79 " srl %0,28" 80 : "=d" (ccode) 81 : "d" (__cpu_logical_map[cpu_addr]), "a" (order_code) 82 : "cc" , "memory", "1" ); 83 return ccode; 84} 85 86/* 87 * Signal processor with parameter 88 */ 89extern __inline__ sigp_ccode 90signal_processor_p(__u64 parameter,__u16 cpu_addr,sigp_order_code order_code) 91{ 92 sigp_ccode ccode; 93 94 __asm__ __volatile__( 95 " lgr 1,%1\n" /* parameter in gpr 1 */ 96 " sigp 1,%2,0(%3)\n" 97 " ipm %0\n" 98 " srl %0,28\n" 99 : "=d" (ccode) 100 : "d" (parameter), "d" (__cpu_logical_map[cpu_addr]), 101 "a" (order_code) 102 : "cc" , "memory", "1" ); 103 return ccode; 104} 105 106/* 107 * Signal processor with parameter and return status 108 */ 109extern __inline__ sigp_ccode 110signal_processor_ps(__u32 *statusptr, __u64 parameter, 111 __u16 cpu_addr, sigp_order_code order_code) 112{ 113 sigp_ccode ccode; 114 115 __asm__ __volatile__( 116 " sgr 2,2\n" /* clear status so it doesn't contain rubbish if not saved. */ 117 " lgr 3,%2\n" /* parameter in gpr 3 */ 118 " sigp 2,%3,0(%4)\n" 119 " stg 2,%1\n" 120 " ipm %0\n" 121 " srl %0,28\n" 122 : "=d" (ccode), "=m" (*statusptr) 123 : "d" (parameter), "d" (__cpu_logical_map[cpu_addr]), 124 "a" (order_code) 125 : "cc" , "memory", "2" , "3" 126 ); 127 return ccode; 128} 129 130#endif /* __SIGP__ */ 131 132 133