cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

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}