^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Machine check handler definitions
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright IBM Corp. 2000, 2009
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Author(s): Ingo Adlung <adlung@de.ibm.com>,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Martin Schwidefsky <schwidefsky@de.ibm.com>,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Cornelia Huck <cornelia.huck@de.ibm.com>,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * Heiko Carstens <heiko.carstens@de.ibm.com>,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #ifndef _ASM_S390_NMI_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #define _ASM_S390_NMI_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/bits.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #define MCIC_SUBCLASS_MASK (1ULL<<63 | 1ULL<<62 | 1ULL<<61 | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) 1ULL<<59 | 1ULL<<58 | 1ULL<<56 | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) 1ULL<<55 | 1ULL<<54 | 1ULL<<53 | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) 1ULL<<52 | 1ULL<<47 | 1ULL<<46 | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) 1ULL<<45 | 1ULL<<44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define MCCK_CODE_SYSTEM_DAMAGE BIT(63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define MCCK_CODE_EXT_DAMAGE BIT(63 - 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define MCCK_CODE_CP BIT(63 - 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define MCCK_CODE_CPU_TIMER_VALID BIT(63 - 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define MCCK_CODE_PSW_MWP_VALID BIT(63 - 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define MCCK_CODE_PSW_IA_VALID BIT(63 - 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define MCCK_CODE_CR_VALID BIT(63 - 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define MCCK_CODE_GS_VALID BIT(63 - 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define MCCK_CODE_FC_VALID BIT(63 - 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #ifndef __ASSEMBLY__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) union mci {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) unsigned long val;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) struct {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) u64 sd : 1; /* 00 system damage */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) u64 pd : 1; /* 01 instruction-processing damage */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) u64 sr : 1; /* 02 system recovery */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) u64 : 1; /* 03 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) u64 cd : 1; /* 04 timing-facility damage */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) u64 ed : 1; /* 05 external damage */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) u64 : 1; /* 06 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) u64 dg : 1; /* 07 degradation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) u64 w : 1; /* 08 warning pending */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) u64 cp : 1; /* 09 channel-report pending */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) u64 sp : 1; /* 10 service-processor damage */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) u64 ck : 1; /* 11 channel-subsystem damage */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) u64 : 2; /* 12-13 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) u64 b : 1; /* 14 backed up */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) u64 : 1; /* 15 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) u64 se : 1; /* 16 storage error uncorrected */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) u64 sc : 1; /* 17 storage error corrected */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) u64 ke : 1; /* 18 storage-key error uncorrected */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) u64 ds : 1; /* 19 storage degradation */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) u64 wp : 1; /* 20 psw mwp validity */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) u64 ms : 1; /* 21 psw mask and key validity */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) u64 pm : 1; /* 22 psw program mask and cc validity */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) u64 ia : 1; /* 23 psw instruction address validity */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) u64 fa : 1; /* 24 failing storage address validity */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) u64 vr : 1; /* 25 vector register validity */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) u64 ec : 1; /* 26 external damage code validity */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) u64 fp : 1; /* 27 floating point register validity */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) u64 gr : 1; /* 28 general register validity */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) u64 cr : 1; /* 29 control register validity */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) u64 : 1; /* 30 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) u64 st : 1; /* 31 storage logical validity */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) u64 ie : 1; /* 32 indirect storage error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) u64 ar : 1; /* 33 access register validity */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) u64 da : 1; /* 34 delayed access exception */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) u64 : 1; /* 35 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) u64 gs : 1; /* 36 guarded storage registers validity */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) u64 : 5; /* 37-41 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) u64 pr : 1; /* 42 tod programmable register validity */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) u64 fc : 1; /* 43 fp control register validity */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) u64 ap : 1; /* 44 ancillary report */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) u64 : 1; /* 45 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) u64 ct : 1; /* 46 cpu timer validity */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) u64 cc : 1; /* 47 clock comparator validity */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) u64 : 16; /* 47-63 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #define MCESA_ORIGIN_MASK (~0x3ffUL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #define MCESA_LC_MASK (0xfUL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #define MCESA_MIN_SIZE (1024)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #define MCESA_MAX_SIZE (2048)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) struct mcesa {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) u8 vector_save_area[1024];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) u8 guarded_storage_save_area[32];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) struct pt_regs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) void nmi_alloc_boot_cpu(struct lowcore *lc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) int nmi_alloc_per_cpu(struct lowcore *lc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) void nmi_free_per_cpu(struct lowcore *lc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) void s390_handle_mcck(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) int s390_do_machine_check(struct pt_regs *regs);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #endif /* __ASSEMBLY__ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #endif /* _ASM_S390_NMI_H */