Skip to content

Commit 5c9a274

Browse files
committed
s390/boot: Move boot_printk() code to own file
Keep the printk code separate from the program check code and move boot_printk() and helper functions to own printk.c file. Reviewed-by: Sven Schnelle <svens@linux.ibm.com> Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
1 parent dc71555 commit 5c9a274

File tree

3 files changed

+126
-113
lines changed

3 files changed

+126
-113
lines changed

arch/s390/boot/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ CFLAGS_sclp_early_core.o += -I$(srctree)/drivers/s390/char
2626

2727
obj-y := head.o als.o startup.o physmem_info.o ipl_parm.o ipl_report.o vmem.o
2828
obj-y += string.o ebcdic.o sclp_early_core.o mem.o ipl_vmparm.o cmdline.o
29-
obj-y += version.o pgm_check_info.o ctype.o ipl_data.o relocs.o alternative.o uv.o
29+
obj-y += version.o pgm_check_info.o ctype.o ipl_data.o relocs.o alternative.o
30+
obj-y += uv.o printk.o
3031
obj-$(CONFIG_RANDOMIZE_BASE) += kaslr.o
3132
obj-y += $(if $(CONFIG_KERNEL_UNCOMPRESSED),,decompressor.o) info.o
3233
obj-$(CONFIG_KERNEL_ZSTD) += clz_ctz.o

arch/s390/boot/pgm_check_info.c

Lines changed: 0 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -11,118 +11,6 @@
1111
#include <asm/uv.h>
1212
#include "boot.h"
1313

14-
const char hex_asc[] = "0123456789abcdef";
15-
16-
static char *as_hex(char *dst, unsigned long val, int pad)
17-
{
18-
char *p, *end = p = dst + max(pad, (int)__fls(val | 1) / 4 + 1);
19-
20-
for (*p-- = 0; p >= dst; val >>= 4)
21-
*p-- = hex_asc[val & 0x0f];
22-
return end;
23-
}
24-
25-
static char *symstart(char *p)
26-
{
27-
while (*p)
28-
p--;
29-
return p + 1;
30-
}
31-
32-
static noinline char *findsym(unsigned long ip, unsigned short *off, unsigned short *len)
33-
{
34-
/* symbol entries are in a form "10000 c4 startup\0" */
35-
char *a = _decompressor_syms_start;
36-
char *b = _decompressor_syms_end;
37-
unsigned long start;
38-
unsigned long size;
39-
char *pivot;
40-
char *endp;
41-
42-
while (a < b) {
43-
pivot = symstart(a + (b - a) / 2);
44-
start = simple_strtoull(pivot, &endp, 16);
45-
size = simple_strtoull(endp + 1, &endp, 16);
46-
if (ip < start) {
47-
b = pivot;
48-
continue;
49-
}
50-
if (ip > start + size) {
51-
a = pivot + strlen(pivot) + 1;
52-
continue;
53-
}
54-
*off = ip - start;
55-
*len = size;
56-
return endp + 1;
57-
}
58-
return NULL;
59-
}
60-
61-
static noinline char *strsym(void *ip)
62-
{
63-
static char buf[64];
64-
unsigned short off;
65-
unsigned short len;
66-
char *p;
67-
68-
p = findsym((unsigned long)ip, &off, &len);
69-
if (p) {
70-
strncpy(buf, p, sizeof(buf));
71-
/* reserve 15 bytes for offset/len in symbol+0x1234/0x1234 */
72-
p = buf + strnlen(buf, sizeof(buf) - 15);
73-
strcpy(p, "+0x");
74-
p = as_hex(p + 3, off, 0);
75-
strcpy(p, "/0x");
76-
as_hex(p + 3, len, 0);
77-
} else {
78-
as_hex(buf, (unsigned long)ip, 16);
79-
}
80-
return buf;
81-
}
82-
83-
void boot_printk(const char *fmt, ...)
84-
{
85-
char buf[1024] = { 0 };
86-
char *end = buf + sizeof(buf) - 1; /* make sure buf is 0 terminated */
87-
unsigned long pad;
88-
char *p = buf;
89-
va_list args;
90-
91-
va_start(args, fmt);
92-
for (; p < end && *fmt; fmt++) {
93-
if (*fmt != '%') {
94-
*p++ = *fmt;
95-
continue;
96-
}
97-
pad = isdigit(*++fmt) ? simple_strtol(fmt, (char **)&fmt, 10) : 0;
98-
switch (*fmt) {
99-
case 's':
100-
p = buf + strlcat(buf, va_arg(args, char *), sizeof(buf));
101-
break;
102-
case 'p':
103-
if (*++fmt != 'S')
104-
goto out;
105-
p = buf + strlcat(buf, strsym(va_arg(args, void *)), sizeof(buf));
106-
break;
107-
case 'l':
108-
if (*++fmt != 'x' || end - p <= max(sizeof(long) * 2, pad))
109-
goto out;
110-
p = as_hex(p, va_arg(args, unsigned long), pad);
111-
break;
112-
case 'x':
113-
if (end - p <= max(sizeof(int) * 2, pad))
114-
goto out;
115-
p = as_hex(p, va_arg(args, unsigned int), pad);
116-
break;
117-
default:
118-
goto out;
119-
}
120-
}
121-
out:
122-
va_end(args);
123-
sclp_early_printk(buf);
124-
}
125-
12614
void print_stacktrace(unsigned long sp)
12715
{
12816
struct stack_info boot_stack = { STACK_TYPE_TASK, (unsigned long)_stack_start,

arch/s390/boot/printk.c

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
// SPDX-License-Identifier: GPL-2.0
2+
#include <linux/kernel.h>
3+
#include <linux/stdarg.h>
4+
#include <linux/string.h>
5+
#include <linux/ctype.h>
6+
#include <asm/stacktrace.h>
7+
#include <asm/boot_data.h>
8+
#include <asm/lowcore.h>
9+
#include <asm/setup.h>
10+
#include <asm/sclp.h>
11+
#include <asm/uv.h>
12+
#include "boot.h"
13+
14+
const char hex_asc[] = "0123456789abcdef";
15+
16+
static char *as_hex(char *dst, unsigned long val, int pad)
17+
{
18+
char *p, *end = p = dst + max(pad, (int)__fls(val | 1) / 4 + 1);
19+
20+
for (*p-- = 0; p >= dst; val >>= 4)
21+
*p-- = hex_asc[val & 0x0f];
22+
return end;
23+
}
24+
25+
static char *symstart(char *p)
26+
{
27+
while (*p)
28+
p--;
29+
return p + 1;
30+
}
31+
32+
static noinline char *findsym(unsigned long ip, unsigned short *off, unsigned short *len)
33+
{
34+
/* symbol entries are in a form "10000 c4 startup\0" */
35+
char *a = _decompressor_syms_start;
36+
char *b = _decompressor_syms_end;
37+
unsigned long start;
38+
unsigned long size;
39+
char *pivot;
40+
char *endp;
41+
42+
while (a < b) {
43+
pivot = symstart(a + (b - a) / 2);
44+
start = simple_strtoull(pivot, &endp, 16);
45+
size = simple_strtoull(endp + 1, &endp, 16);
46+
if (ip < start) {
47+
b = pivot;
48+
continue;
49+
}
50+
if (ip > start + size) {
51+
a = pivot + strlen(pivot) + 1;
52+
continue;
53+
}
54+
*off = ip - start;
55+
*len = size;
56+
return endp + 1;
57+
}
58+
return NULL;
59+
}
60+
61+
static noinline char *strsym(void *ip)
62+
{
63+
static char buf[64];
64+
unsigned short off;
65+
unsigned short len;
66+
char *p;
67+
68+
p = findsym((unsigned long)ip, &off, &len);
69+
if (p) {
70+
strncpy(buf, p, sizeof(buf));
71+
/* reserve 15 bytes for offset/len in symbol+0x1234/0x1234 */
72+
p = buf + strnlen(buf, sizeof(buf) - 15);
73+
strcpy(p, "+0x");
74+
p = as_hex(p + 3, off, 0);
75+
strcpy(p, "/0x");
76+
as_hex(p + 3, len, 0);
77+
} else {
78+
as_hex(buf, (unsigned long)ip, 16);
79+
}
80+
return buf;
81+
}
82+
83+
void boot_printk(const char *fmt, ...)
84+
{
85+
char buf[1024] = { 0 };
86+
char *end = buf + sizeof(buf) - 1; /* make sure buf is 0 terminated */
87+
unsigned long pad;
88+
char *p = buf;
89+
va_list args;
90+
91+
va_start(args, fmt);
92+
for (; p < end && *fmt; fmt++) {
93+
if (*fmt != '%') {
94+
*p++ = *fmt;
95+
continue;
96+
}
97+
pad = isdigit(*++fmt) ? simple_strtol(fmt, (char **)&fmt, 10) : 0;
98+
switch (*fmt) {
99+
case 's':
100+
p = buf + strlcat(buf, va_arg(args, char *), sizeof(buf));
101+
break;
102+
case 'p':
103+
if (*++fmt != 'S')
104+
goto out;
105+
p = buf + strlcat(buf, strsym(va_arg(args, void *)), sizeof(buf));
106+
break;
107+
case 'l':
108+
if (*++fmt != 'x' || end - p <= max(sizeof(long) * 2, pad))
109+
goto out;
110+
p = as_hex(p, va_arg(args, unsigned long), pad);
111+
break;
112+
case 'x':
113+
if (end - p <= max(sizeof(int) * 2, pad))
114+
goto out;
115+
p = as_hex(p, va_arg(args, unsigned int), pad);
116+
break;
117+
default:
118+
goto out;
119+
}
120+
}
121+
out:
122+
va_end(args);
123+
sclp_early_printk(buf);
124+
}

0 commit comments

Comments
 (0)