diff options
Diffstat (limited to 'include/asm-s390/s390mach.h')
-rw-r--r-- | include/asm-s390/s390mach.h | 75 |
1 files changed, 58 insertions, 17 deletions
diff --git a/include/asm-s390/s390mach.h b/include/asm-s390/s390mach.h index 56349777a..961e17ecf 100644 --- a/include/asm-s390/s390mach.h +++ b/include/asm-s390/s390mach.h @@ -12,14 +12,21 @@ #include <asm/types.h> -// -// machine-check-interruption code -// -typedef struct _mcic { +typedef struct _mci { __u32 to_be_defined_1 : 9; __u32 cp : 1; /* channel-report pending */ __u32 to_be_defined_2 : 22; __u32 to_be_defined_3; + } mci_t; + +// +// machine-check-interruption code +// +typedef struct _mcic { + union _mcc { + __u64 mcl; /* machine check int. code - long info */ + mci_t mcd; /* machine check int. code - details */ + } mcc; } __attribute__ ((packed)) mcic_t; // @@ -37,29 +44,63 @@ typedef struct _crw { __u32 rsid : 16; /* reporting-source ID */ } __attribute__ ((packed)) crw_t; +#define CRW_RSC_MONITOR 0x2 /* monitoring facility */ +#define CRW_RSC_SCH 0x3 /* subchannel */ +#define CRW_RSC_CPATH 0x4 /* channel path */ +#define CRW_RSC_CONFIG 0x9 /* configuration-alert facility */ +#define CRW_RSC_CSS 0xB /* channel subsystem */ + +#define CRW_ERC_EVENT 0x00 /* event information pending */ +#define CRW_ERC_AVAIL 0x01 /* available */ +#define CRW_ERC_INIT 0x02 /* initialized */ +#define CRW_ERC_TERROR 0x03 /* temporary error */ +#define CRW_ERC_IPARM 0x04 /* installed parm initialized */ +#define CRW_ERC_TERM 0x05 /* terminal */ +#define CRW_ERC_PERRN 0x06 /* perm. error, fac. not init */ +#define CRW_ERC_PERRI 0x07 /* perm. error, facility init */ +#define CRW_ERC_PMOD 0x08 /* installed parameters modified */ + +#define MAX_CRW_PENDING 1024 +#define MAX_MACH_PENDING 1024 + // // CRW Entry // typedef struct _crwe { - crw_t crw; - crw_t *crw_next; + crw_t crw; + struct _crwe *crwe_next; } __attribute__ ((packed)) crwe_t; -typedef struct _mchchk_queue_element { - spinlock_t lock; - unsigned int status; - mcic_t mcic; - crwe_t *crwe; /* CRW if applicable */ - struct mchchk_queue_element *next; - struct mchchk_queue_element *prev; -} mchchk_queue_element_t; +typedef struct _mache { + spinlock_t lock; + unsigned int status; + mcic_t mcic; + union _mc { + crwe_t *crwe; /* CRW if applicable */ + } mc; + struct _mache *next; + struct _mache *prev; +} mache_t; #define MCHCHK_STATUS_TO_PROCESS 0x00000001 #define MCHCHK_STATUS_IN_PROGRESS 0x00000002 #define MCHCHK_STATUS_WAITING 0x00000004 -void s390_init_machine_check ( void ); -void __init s390_do_machine_check ( void ); -void __init s390_machine_check_handler( struct semaphore * ); +void s390_init_machine_check( void ); +void s390_do_machine_check ( void ); +void s390_do_crw_pending ( crwe_t *pcrwe ); + +extern __inline__ int stcrw( __u32 *pcrw ) +{ + int ccode; + + __asm__ __volatile__( + "STCRW 0(%1)\n\t" + "IPM %0\n\t" + "SRL %0,28\n\t" + : "=d" (ccode) : "a" (pcrw) + : "cc", "1" ); + return ccode; +} #endif /* __s390mach */ |