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