root/arch/s390/boot/pgm_check_info.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. __add_val_as_hex
  2. add_str
  3. print_pgm_check_info

   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 
   8 const 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 
  13 static 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 
  20 static char *add_str(char *dst, char *src)
  21 {
  22         strcpy(dst, src);
  23         return dst + strlen(dst);
  24 }
  25 
  26 void 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 }

/* [<][>][^][v][top][bottom][index][help] */