diff options
Diffstat (limited to 'include/asm-s390/sigp.h')
-rw-r--r-- | include/asm-s390/sigp.h | 254 |
1 files changed, 254 insertions, 0 deletions
diff --git a/include/asm-s390/sigp.h b/include/asm-s390/sigp.h new file mode 100644 index 000000000..5154a34a5 --- /dev/null +++ b/include/asm-s390/sigp.h @@ -0,0 +1,254 @@ +/* + * 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) + * + * 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/misc390.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; + +#if 0 +/* + * these definitions are not used at the moment, but we might need + * them in future. + */ +typedef struct +{ + __u64 cpu_timer; + psw_t current_psw; + __u32 prefix; + __u32 access_regs[16]; + __u64 float_regs[4]; + __u32 gpr_regs[16]; + __u32 control_regs[16]; +} sigp_status __attribute__((packed)); + +typedef struct +{ + __u8 unused1[216]; + __u64 cpu_timer; + psw_t current_psw; + __u32 prefix; + __u32 access_regs[16]; + __u64 float_regs[4]; + __u32 gpr_regs[16]; + __u32 control_regs[16]; +} sigp_status_512 __attribute__((packed)); + +typedef struct +{ + __u32 extended_save_area_address; + __u64 cpu_timer; + psw_t current_psw; + __u32 prefix; + __u32 access_regs[16]; + __u64 float_regs[4]; + __u32 gpr_regs[16]; + __u32 control_regs[16]; +} sigp_extended_status __attribute__((packed)); + +typedef struct +{ + __u8 unused1[212]; + __u32 extended_save_area_address; + __u64 cpu_timer; + psw_t current_psw; + __u32 prefix; + __u32 access_regs[16]; + __u64 float_regs[4]; + __u32 gpr_regs[16]; + __u32 control_regs[16]; +} sigp_extended_status_512 __attribute__((packed)); + +typedef struct +{ + __u64 bfp_float_regs[16]; + __u32 bfp_float_control_reg; + __u8 reserved[12]; +} sigp_extended_save_area __attribute__ ((packed)); + +typedef struct +{ + unsigned equipment_check:1; + unsigned unassigned1:20; + unsigned incorrect_state:1; + unsigned invalid_parameter:1; + unsigned external_call_pending:1; + unsigned stopped:1; + unsigned operator_intervening:1; + unsigned check_stop:1; + unsigned unassigned2:1; + unsigned inoperative:1; + unsigned invalid_order:1; + unsigned receiver_check:1; +} sigp_status_bits __attribute__((packed)); +#endif + +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_restart, + ec_halt, + ec_power_off, + ec_bit_last +} ec_bit_sig; + +/* Signals which come with a parameter area, synchronous */ +typedef enum +{ + ec_set_ctl, + ec_get_ctl, + ec_set_ctl_masked, + ec_cmd_last +} ec_cmd_sig; + +/* state information for synchronous signals */ +typedef enum +{ + ec_pending, + ec_executing, + ec_done +} ec_state; + +/* header for the queuing of signals with a parameter area */ +typedef struct ec_ext_call +{ + ec_cmd_sig cmd; + atomic_t status; + struct ec_ext_call *next; + void *parms; +} ec_ext_call; + +/* parameter area for the ec_set_ctl and ec_get_ctl signal */ +typedef struct +{ + __u16 start_ctl; + __u16 end_ctl; + __u32 cregs[16]; +} ec_creg_parms; + +/* parameter area for the ec_set_ctl_masked signal */ +typedef struct +{ + __u16 start_ctl; + __u16 end_ctl; + __u32 orvals[16]; + __u32 andvals[16]; +} ec_creg_mask_parms; + +/* + * Signal processor + */ +extern __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 + */ +extern __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 + */ +extern __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 so it doesn't contain rubbish if not saved. */ + " 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__ + + |