Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.15.
 1// SPDX-License-Identifier: GPL-2.0
 2#include <linux/kernel.h>
 3#include <linux/string.h>
 4#include <asm/lowcore.h>
 5#include <asm/sclp.h>
 6#include "boot.h"
 7
 8const char hex_asc[] = "0123456789abcdef";
 9
10#define add_val_as_hex(dst, val)					       \
11	__add_val_as_hex(dst, (const unsigned char *)&val, sizeof(val))
12
13static char *__add_val_as_hex(char *dst, const unsigned char *src, size_t count)
14{
15	while (count--)
16		dst = hex_byte_pack(dst, *src++);
17	return dst;
18}
19
20static char *add_str(char *dst, char *src)
21{
22	strcpy(dst, src);
23	return dst + strlen(dst);
24}
25
26void print_pgm_check_info(void)
27{
28	struct psw_bits *psw = &psw_bits(S390_lowcore.psw_save_area);
29	unsigned short ilc = S390_lowcore.pgm_ilc >> 1;
30	char buf[256];
31	int row, col;
32	char *p;
33
34	add_str(buf, "Linux version ");
35	strlcat(buf, kernel_version, sizeof(buf));
36	sclp_early_printk(buf);
37
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);
42	add_str(p, "\n");
43	sclp_early_printk(buf);
44
45	p = add_str(buf, "PSW : ");
46	p = add_val_as_hex(p, S390_lowcore.psw_save_area.mask);
47	p = add_str(p, " ");
48	p = add_val_as_hex(p, S390_lowcore.psw_save_area.addr);
49	add_str(p, "\n");
50	sclp_early_printk(buf);
51
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);
78	add_str(p, "\n");
79	sclp_early_printk(buf);
80
81	for (row = 0; row < 4; row++) {
82		p = add_str(buf, row == 0 ? "GPRS:" : "     ");
83		for (col = 0; col < 4; col++) {
84			p = add_str(p, " ");
85			p = add_val_as_hex(p, S390_lowcore.gpregs_save_area[row * 4 + col]);
86		}
87		add_str(p, "\n");
88		sclp_early_printk(buf);
89	}
90}