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 * Signal processor 68 */ 69extern __inline__ sigp_ccode 70signal_processor(__u16 cpu_addr, sigp_order_code order_code) 71{ 72 sigp_ccode ccode; 73 74 __asm__ __volatile__( 75 " sr 1,1\n" /* parameter=0 in gpr 1 */ 76 " sigp 1,%1,0(%2)\n" 77 " ipm %0\n" 78 " srl %0,28\n" 79 : "=d" (ccode) 80 : "d" (__cpu_logical_map[cpu_addr]), "a" (order_code) 81 : "cc" , "memory", "1" ); 82 return ccode; 83} 84 85/* 86 * Signal processor with parameter 87 */ 88extern __inline__ sigp_ccode 89signal_processor_p(__u32 parameter,__u16 cpu_addr,sigp_order_code order_code) 90{ 91 sigp_ccode ccode; 92 93 __asm__ __volatile__( 94 " lr 1,%1\n" /* parameter in gpr 1 */ 95 " sigp 1,%2,0(%3)\n" 96 " ipm %0\n" 97 " srl %0,28\n" 98 : "=d" (ccode) 99 : "d" (parameter), "d" (__cpu_logical_map[cpu_addr]), 100 "a" (order_code) 101 : "cc" , "memory", "1" ); 102 return ccode; 103} 104 105/* 106 * Signal processor with parameter and return status 107 */ 108extern __inline__ sigp_ccode 109signal_processor_ps(__u32 *statusptr, __u32 parameter, 110 __u16 cpu_addr, sigp_order_code order_code) 111{ 112 sigp_ccode ccode; 113 114 __asm__ __volatile__( 115 " sr 2,2\n" /* clear status so it doesn't contain rubbish if not saved. */ 116 " lr 3,%2\n" /* parameter in gpr 3 */ 117 " sigp 2,%3,0(%4)\n" 118 " st 2,%1\n" 119 " ipm %0\n" 120 " srl %0,28\n" 121 : "=d" (ccode), "=m" (*statusptr) 122 : "d" (parameter), "d" (__cpu_logical_map[cpu_addr]), 123 "a" (order_code) 124 : "cc" , "memory", "2" , "3" 125 ); 126 return ccode; 127} 128 129#endif /* __SIGP__ */ 130 131 132