| /* |
| * include/asm-s390/sigp.h |
| * |
| * S390 version |
| * Copyright (C) 1999 IBM Deutschland Entwicklung GmbH, IBM Corporation |
| * Author(s): Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com), |
| * Martin Schwidefsky (schwidefsky@de.ibm.com) |
| * Heiko Carstens (heiko.carstens@de.ibm.com) |
| * |
| * sigp.h by D.J. Barrow (c) IBM 1999 |
| * contains routines / structures for signalling other S/390 processors in an |
| * SMP configuration. |
| */ |
| |
| #ifndef __SIGP__ |
| #define __SIGP__ |
| |
| #include <asm/ptrace.h> |
| #include <asm/atomic.h> |
| |
| /* get real cpu address from logical cpu number */ |
| extern volatile int __cpu_logical_map[]; |
| |
| typedef enum |
| { |
| sigp_unassigned=0x0, |
| sigp_sense, |
| sigp_external_call, |
| sigp_emergency_signal, |
| sigp_start, |
| sigp_stop, |
| sigp_restart, |
| sigp_unassigned1, |
| sigp_unassigned2, |
| sigp_stop_and_store_status, |
| sigp_unassigned3, |
| sigp_initial_cpu_reset, |
| sigp_cpu_reset, |
| sigp_set_prefix, |
| sigp_store_status_at_address, |
| sigp_store_extended_status_at_address |
| } sigp_order_code; |
| |
| typedef __u32 sigp_status_word; |
| |
| typedef enum |
| { |
| sigp_order_code_accepted=0, |
| sigp_status_stored, |
| sigp_busy, |
| sigp_not_operational |
| } sigp_ccode; |
| |
| |
| /* |
| * Definitions for the external call |
| */ |
| |
| /* 'Bit' signals, asynchronous */ |
| typedef enum |
| { |
| ec_schedule=0, |
| ec_call_function, |
| ec_bit_last |
| } ec_bit_sig; |
| |
| /* |
| * Signal processor |
| */ |
| static inline sigp_ccode |
| signal_processor(__u16 cpu_addr, sigp_order_code order_code) |
| { |
| sigp_ccode ccode; |
| |
| __asm__ __volatile__( |
| " sr 1,1\n" /* parameter=0 in gpr 1 */ |
| " sigp 1,%1,0(%2)\n" |
| " ipm %0\n" |
| " srl %0,28\n" |
| : "=d" (ccode) |
| : "d" (__cpu_logical_map[cpu_addr]), "a" (order_code) |
| : "cc" , "memory", "1" ); |
| return ccode; |
| } |
| |
| /* |
| * Signal processor with parameter |
| */ |
| static inline sigp_ccode |
| signal_processor_p(__u32 parameter, __u16 cpu_addr, |
| sigp_order_code order_code) |
| { |
| sigp_ccode ccode; |
| |
| __asm__ __volatile__( |
| " lr 1,%1\n" /* parameter in gpr 1 */ |
| " sigp 1,%2,0(%3)\n" |
| " ipm %0\n" |
| " srl %0,28\n" |
| : "=d" (ccode) |
| : "d" (parameter), "d" (__cpu_logical_map[cpu_addr]), |
| "a" (order_code) |
| : "cc" , "memory", "1" ); |
| return ccode; |
| } |
| |
| /* |
| * Signal processor with parameter and return status |
| */ |
| static inline sigp_ccode |
| signal_processor_ps(__u32 *statusptr, __u32 parameter, |
| __u16 cpu_addr, sigp_order_code order_code) |
| { |
| sigp_ccode ccode; |
| |
| __asm__ __volatile__( |
| " sr 2,2\n" /* clear status */ |
| " lr 3,%2\n" /* parameter in gpr 3 */ |
| " sigp 2,%3,0(%4)\n" |
| " st 2,%1\n" |
| " ipm %0\n" |
| " srl %0,28\n" |
| : "=d" (ccode), "=m" (*statusptr) |
| : "d" (parameter), "d" (__cpu_logical_map[cpu_addr]), |
| "a" (order_code) |
| : "cc" , "memory", "2" , "3" |
| ); |
| return ccode; |
| } |
| |
| #endif /* __SIGP__ */ |