1 | // SPDX-License-Identifier: GPL-2.0 |
---|---|
2 | #include <linux/minmax.h> |
3 | #include <linux/string.h> |
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; |
16 | if ((ipb->ccw.vm_flags & IPL_PB0_CCW_VM_FLAG_VP) && |
17 | (ipb->ccw.vm_parm_len > 0)) { |
18 | |
19 | len = min_t(size_t, size - 1, ipb->ccw.vm_parm_len); |
20 | memcpy(dest, ipb->ccw.vm_parm, len); |
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 | } |
39 |