1 // SPDX-License-Identifier: GPL-2.0
2 #include <linux/kernel.h>
3 #include <linux/string.h>
4 #include <asm/lowcore.h>
8 const char hex_asc
[] = "0123456789abcdef";
10 #define add_val_as_hex(dst, val) \
11 __add_val_as_hex(dst, (const unsigned char *)&val, sizeof(val))
13 static char *__add_val_as_hex(char *dst
, const unsigned char *src
, size_t count
)
16 dst
= hex_byte_pack(dst
, *src
++);
20 static char *add_str(char *dst
, char *src
)
23 return dst
+ strlen(dst
);
26 void print_pgm_check_info(void)
28 struct psw_bits
*psw
= &psw_bits(S390_lowcore
.psw_save_area
);
29 unsigned short ilc
= S390_lowcore
.pgm_ilc
>> 1;
34 add_str(buf
, "Linux version ");
35 strlcat(buf
, kernel_version
, sizeof(buf
));
36 sclp_early_printk(buf
);
38 p
= add_str(buf
, "Kernel fault: interruption code ");
39 p
= add_val_as_hex(buf
+ strlen(buf
), S390_lowcore
.pgm_code
);
40 p
= add_str(p
, " ilc:");
41 *p
++ = hex_asc_lo(ilc
);
43 sclp_early_printk(buf
);
45 p
= add_str(buf
, "PSW : ");
46 p
= add_val_as_hex(p
, S390_lowcore
.psw_save_area
.mask
);
48 p
= add_val_as_hex(p
, S390_lowcore
.psw_save_area
.addr
);
50 sclp_early_printk(buf
);
52 p
= add_str(buf
, " R:");
53 *p
++ = hex_asc_lo(psw
->per
);
54 p
= add_str(p
, " T:");
55 *p
++ = hex_asc_lo(psw
->dat
);
56 p
= add_str(p
, " IO:");
57 *p
++ = hex_asc_lo(psw
->io
);
58 p
= add_str(p
, " EX:");
59 *p
++ = hex_asc_lo(psw
->ext
);
60 p
= add_str(p
, " Key:");
61 *p
++ = hex_asc_lo(psw
->key
);
62 p
= add_str(p
, " M:");
63 *p
++ = hex_asc_lo(psw
->mcheck
);
64 p
= add_str(p
, " W:");
65 *p
++ = hex_asc_lo(psw
->wait
);
66 p
= add_str(p
, " P:");
67 *p
++ = hex_asc_lo(psw
->pstate
);
68 p
= add_str(p
, " AS:");
69 *p
++ = hex_asc_lo(psw
->as
);
70 p
= add_str(p
, " CC:");
71 *p
++ = hex_asc_lo(psw
->cc
);
72 p
= add_str(p
, " PM:");
73 *p
++ = hex_asc_lo(psw
->pm
);
74 p
= add_str(p
, " RI:");
75 *p
++ = hex_asc_lo(psw
->ri
);
76 p
= add_str(p
, " EA:");
77 *p
++ = hex_asc_lo(psw
->eaba
);
79 sclp_early_printk(buf
);
81 for (row
= 0; row
< 4; row
++) {
82 p
= add_str(buf
, row
== 0 ? "GPRS:" : " ");
83 for (col
= 0; col
< 4; col
++) {
85 p
= add_val_as_hex(p
, S390_lowcore
.gpregs_save_area
[row
* 4 + col
]);
88 sclp_early_printk(buf
);