ipl_vmparm.c (968B)
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 */ 8size_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}