Commit | Line | Data |
---|---|---|
49698745 | 1 | // SPDX-License-Identifier: GPL-2.0 |
6040b3f4 AE |
2 | #include <linux/minmax.h> |
3 | #include <linux/string.h> | |
49698745 VG |
4 | #include <asm/ebcdic.h> |
5 | #include <asm/ipl.h> | |
6 | ||
7 | /* VM IPL PARM routines */ | |
8 | size_t ipl_block_get_ascii_vmparm(char *dest, size_t size, | |
9 | const struct ipl_parameter_block *ipb) | |
10 | { | |
11 | int i; | |
12 | size_t len; | |
13 | char has_lowercase = 0; | |
14 | ||
15 | len = 0; | |
5f1207fb | 16 | if ((ipb->ccw.vm_flags & IPL_PB0_CCW_VM_FLAG_VP) && |
86c74d86 | 17 | (ipb->ccw.vm_parm_len > 0)) { |
49698745 | 18 | |
86c74d86 MS |
19 | len = min_t(size_t, size - 1, ipb->ccw.vm_parm_len); |
20 | memcpy(dest, ipb->ccw.vm_parm, len); | |
49698745 VG |
21 | /* If at least one character is lowercase, we assume mixed |
22 | * case; otherwise we convert everything to lowercase. | |
23 | */ | |
24 | for (i = 0; i < len; i++) | |
25 | if ((dest[i] > 0x80 && dest[i] < 0x8a) || /* a-i */ | |
26 | (dest[i] > 0x90 && dest[i] < 0x9a) || /* j-r */ | |
27 | (dest[i] > 0xa1 && dest[i] < 0xaa)) { /* s-z */ | |
28 | has_lowercase = 1; | |
29 | break; | |
30 | } | |
31 | if (!has_lowercase) | |
32 | EBC_TOLOWER(dest, len); | |
33 | EBCASC(dest, len); | |
34 | } | |
35 | dest[len] = 0; | |
36 | ||
37 | return len; | |
38 | } |