ipl_vmparm.c 968 B

1234567891011121314151617181920212223242526272829303132333435363738
  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. /* VM IPL PARM routines */
  7. size_t ipl_block_get_ascii_vmparm(char *dest, size_t size,
  8. const struct ipl_parameter_block *ipb)
  9. {
  10. int i;
  11. size_t len;
  12. char has_lowercase = 0;
  13. len = 0;
  14. if ((ipb->ccw.vm_flags & IPL_PB0_CCW_VM_FLAG_VP) &&
  15. (ipb->ccw.vm_parm_len > 0)) {
  16. len = min_t(size_t, size - 1, ipb->ccw.vm_parm_len);
  17. memcpy(dest, ipb->ccw.vm_parm, len);
  18. /* If at least one character is lowercase, we assume mixed
  19. * case; otherwise we convert everything to lowercase.
  20. */
  21. for (i = 0; i < len; i++)
  22. if ((dest[i] > 0x80 && dest[i] < 0x8a) || /* a-i */
  23. (dest[i] > 0x90 && dest[i] < 0x9a) || /* j-r */
  24. (dest[i] > 0xa1 && dest[i] < 0xaa)) { /* s-z */
  25. has_lowercase = 1;
  26. break;
  27. }
  28. if (!has_lowercase)
  29. EBC_TOLOWER(dest, len);
  30. EBCASC(dest, len);
  31. }
  32. dest[len] = 0;
  33. return len;
  34. }