Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

RFE: Support the ASCII console in the zipl boot menu #126

Open
huth opened this issue Nov 18, 2021 · 2 comments
Open

RFE: Support the ASCII console in the zipl boot menu #126

huth opened this issue Nov 18, 2021 · 2 comments

Comments

@huth
Copy link
Contributor

huth commented Nov 18, 2021

The zipl boot menu currently only enables the line mode console with sclp_setup(SCLP_INIT) in zipl/boot/menu.c. That's ok for most use-cases, but recently I wanted to boot a KVM guest from a DASD that has been passed-through to the guest via vfio-ccw, and noticed that I can not get the boot menu in that case:

qemu-system-s390x -accel kvm -m 4G -nographic -boot menu=on
-device vfio-ccw,devno=fe.0.2345,sysfsdev=/sys/bus/mdev/devices/UUID,bootindex=1

Would it be feasible to support the ASCII console for these scenarios, too (i.e. to fall back to sclp_setup(SCLP_LINE_ASCII_INIT) in case the line mode init fails)?

@huth huth changed the title Support the ASCII console in the zipl boot menu RFE: Support the ASCII console in the zipl boot menu Nov 18, 2021
@mhartmay
Copy link
Contributor

The last time I wanted to implement this, there were size limitations in the stage[123] loaders. If I remember correctly the tables in ebcdic_conv.c were too large.

@huth
Copy link
Contributor Author

huth commented Nov 22, 2021

Currently, the two tables in ebcdic_conv.c are the same, so maybe one could get removed (see #125 )? Or if you care about the right code pages, maybe a patch like this could help to save approx. 90 bytes (not sure whether that's enough, though):

diff --git a/zipl/boot/ebcdic_conv.c b/zipl/boot/ebcdic_conv.c
--- a/zipl/boot/ebcdic_conv.c
+++ b/zipl/boot/ebcdic_conv.c
@@ -84,84 +84,41 @@ static unsigned char ebcdic_037[256] = {
 	0x38, 0x39, 0x07, 0x07, 0x9A, 0x07, 0x07, 0x07
 };
 
-static unsigned char ebcdic_500[256] = {
-/* 0x00  NUL   SOH   STX   ETX  *SEL    HT  *RNL   DEL */
-	0x00, 0x01, 0x02, 0x03, 0x07, 0x09, 0x07, 0x7F,
-/* 0x08  -GE  -SPS  -RPT    VT    FF    CR    SO    SI */
-	0x07, 0x07, 0x07, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
-/* 0x10  DLE   DC1   DC2   DC3  -RES   -NL    BS  -POC
-				-ENP  ->LF             */
-	0x10, 0x11, 0x12, 0x13, 0x07, 0x0A, 0x08, 0x07,
-/* 0x18  CAN    EM  -UBS  -CU1  -IFS  -IGS  -IRS  -ITB
-						  -IUS */
-	0x18, 0x19, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
-/* 0x20  -DS  -SOS    FS  -WUS  -BYP    LF   ETB   ESC
-				-INP                   */
-	0x07, 0x07, 0x1C, 0x07, 0x07, 0x0A, 0x17, 0x1B,
-/* 0x28  -SA  -SFE   -SM  -CSP  -MFA   ENQ   ACK   BEL
-		     -SW                               */
-	0x07, 0x07, 0x07, 0x07, 0x07, 0x05, 0x06, 0x07,
-/* 0x30 ----  ----   SYN   -IR   -PP  -TRN  -NBS   EOT */
-	0x07, 0x07, 0x16, 0x07, 0x07, 0x07, 0x07, 0x04,
-/* 0x38 -SBS   -IT  -RFF  -CU3   DC4   NAK  ----   SUB */
-	0x07, 0x07, 0x07, 0x07, 0x14, 0x15, 0x07, 0x1A,
-/* 0x40   SP   RSP           ä              ----       */
-	0x20, 0xFF, 0x83, 0x84, 0x85, 0xA0, 0x07, 0x86,
-/* 0x48                      .     <     (     +     | */
-	0x87, 0xA4, 0x9B, 0x2E, 0x3C, 0x28, 0x2B, 0x7C,
+static unsigned char ebcdic_500_4a[22] = {
+/* 0x48                [     .     <     (     +     ! */
+                    0x5B, 0x2E, 0x3C, 0x28, 0x2B, 0x21,
 /* 0x50    &                                      ---- */
-	0x26, 0x82, 0x88, 0x89, 0x8A, 0xA1, 0x8C, 0x07,
-/* 0x58          ß     !     $     *     )     ;       */
-	0x8D, 0xE1, 0x21, 0x24, 0x2A, 0x29, 0x3B, 0xAA,
-/* 0x60    -     /  ----     Ä  ----  ----  ----       */
-	0x2D, 0x2F, 0x07, 0x8E, 0x07, 0x07, 0x07, 0x8F,
-/* 0x68             ----     ,     %     _     >     ? */
-	0x80, 0xA5, 0x07, 0x2C, 0x25, 0x5F, 0x3E, 0x3F,
-/* 0x70  ---        ----  ----  ----  ----  ----  ---- */
-	0x07, 0x90, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
-/* 0x78    *     `     :     #     @     '     =     " */
-	0x70, 0x60, 0x3A, 0x23, 0x40, 0x27, 0x3D, 0x22,
-/* 0x80    *     a     b     c     d     e     f     g */
-	0x07, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
-/* 0x88    h     i              ----  ----  ----       */
-	0x68, 0x69, 0xAE, 0xAF, 0x07, 0x07, 0x07, 0xF1,
-/* 0x90    °     j     k     l     m     n     o     p */
-	0xF8, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, 0x70,
-/* 0x98    q     r                    ----        ---- */
-	0x71, 0x72, 0xA6, 0xA7, 0x91, 0x07, 0x92, 0x07,
-/* 0xA0          ~     s     t     u     v     w     x */
-	0xE6, 0x7E, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78,
-/* 0xA8    y     z              ----  ----  ----  ---- */
-	0x79, 0x7A, 0xAD, 0xAB, 0x07, 0x07, 0x07, 0x07,
-/* 0xB0    ^                    ----     §  ----       */
-	0x5E, 0x9C, 0x9D, 0xFA, 0x07, 0x07, 0x07, 0xAC,
-/* 0xB8       ----     [     ]  ----  ----  ----  ---- */
-	0xAB, 0x07, 0x5B, 0x5D, 0x07, 0x07, 0x07, 0x07,
-/* 0xC0    {     A     B     C     D     E     F     G */
-	0x7B, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
-/* 0xC8    H     I  ----           ö              ---- */
-	0x48, 0x49, 0x07, 0x93, 0x94, 0x95, 0xA2, 0x07,
-/* 0xD0    }     J     K     L     M     N     O     P */
-	0x7D, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50,
-/* 0xD8    Q     R  ----           ü                   */
-	0x51, 0x52, 0x07, 0x96, 0x81, 0x97, 0xA3, 0x98,
-/* 0xE0    \           S     T     U     V     W     X */
-	0x5C, 0xF6, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58,
-/* 0xE8    Y     Z        ----     Ö  ----  ----  ---- */
-	0x59, 0x5A, 0xFD, 0x07, 0x99, 0x07, 0x07, 0x07,
-/* 0xF0    0     1     2     3     4     5     6     7 */
-	0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
-/* 0xF8    8     9  ----  ----     Ü  ----  ----  ---- */
-	0x38, 0x39, 0x07, 0x07, 0x9A, 0x07, 0x07, 0x07
+        0x26, 0x82, 0x88, 0x89, 0x8A, 0xA1, 0x8C, 0x07,
+/* 0x58          ß     ]     $     *     )     ;     ^ */
+        0x8D, 0xE1, 0x5D, 0x24, 0x2A, 0x29, 0x3B, 0x5E,
+};
+
+static unsigned char ebcdic_500_b0[12] = {
+/* 0xB0                         ----     §  ----       */
+        0x9B, 0x9C, 0x9D, 0xFA, 0x07, 0x07, 0x07, 0xAC,
+/* 0xB8       ----           |  ----  ----  ----  ---- */
+        0xAB, 0x07, 0xAA, 0x7C,
 };
 
 void ebcdic_to_ascii(unsigned char *target, const unsigned char *source,
 		     unsigned int l)
 {
-	unsigned char *ebc;
 	unsigned int i;
+	unsigned char dc, sc;
 
-	ebc = is_zvm() ? ebcdic_037 : ebcdic_500;
-	for (i = 0; i < l; i++)
-		target[i] = ebc[source[i]];
+	if (is_zvm()) {
+		for (i = 0; i < l; i++)
+			target[i] = ebcdic_037[source[i]];
+	} else {
+		for (i = 0; i < l; i++) {
+			sc = source[i];
+			if (sc >= 0x4a && sc <= 0x5f)
+				dc = ebcdic_500_4a[sc - 0x4a];
+			else if (sc >= 0xb0 && sc <= 0xbb)
+				dc = ebcdic_500_b0[sc - 0xb0];
+			else
+				dc = ebcdic_037[sc];
+			target[i] = dc;
+		}
+	}
 }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants