From nobody Thu May 2 08:32:01 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 80.81.252.135 is neither permitted nor denied by domain of seabios.org) client-ip=80.81.252.135; envelope-from=seabios-bounces@seabios.org; helo=mail.coreboot.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 80.81.252.135 is neither permitted nor denied by domain of seabios.org) smtp.mailfrom=seabios-bounces@seabios.org Return-Path: Received: from mail.coreboot.org (mail.coreboot.org [80.81.252.135]) by mx.zohomail.com with SMTPS id 1504851559400327.22769657106846; Thu, 7 Sep 2017 23:19:19 -0700 (PDT) Received: from [127.0.0.1] (helo=ra.coreboot.org) by mail.coreboot.org with esmtp (Exim 4.86_2) (envelope-from ) id 1dqCcj-0002WG-HF; Fri, 08 Sep 2017 08:18:41 +0200 Received: from mx1.redhat.com ([209.132.183.28]) by mail.coreboot.org with esmtps (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.86_2) (envelope-from ) id 1dqCcM-0002T8-B9 for seabios@seabios.org; Fri, 08 Sep 2017 08:18:34 +0200 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 5A99B81DEF for ; Fri, 8 Sep 2017 06:18:33 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-117-175.ams2.redhat.com [10.36.117.175]) by smtp.corp.redhat.com (Postfix) with ESMTP id 85CEC5D979; Fri, 8 Sep 2017 06:18:29 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 0ECB13FBA7; Fri, 8 Sep 2017 08:18:28 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 5A99B81DEF Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=kraxel@redhat.com From: Gerd Hoffmann To: seabios@seabios.org Date: Fri, 8 Sep 2017 08:18:23 +0200 Message-Id: <20170908061828.13732-2-kraxel@redhat.com> In-Reply-To: <20170908061828.13732-1-kraxel@redhat.com> References: <20170908061828.13732-1-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Fri, 08 Sep 2017 06:18:33 +0000 (UTC) X-Spam-Score: -4.5 (----) Subject: [SeaBIOS] [PATCH 1/6] std: add cp437 to unicode map X-BeenThere: seabios@seabios.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: SeaBIOS mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gerd Hoffmann MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: seabios-bounces@seabios.org Sender: "SeaBIOS" X-Duff: Orig. Duff, Duff Lite, Duff Dry, Duff Dark, Raspberry Duff, Lady Duff, Red Duff, Tartar Control Duff X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Signed-off-by: Gerd Hoffmann --- Makefile | 1 + src/cp437.h | 1 + src/cp437.c | 275 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++= ++++ 3 files changed, 277 insertions(+) create mode 100644 src/cp437.h create mode 100644 src/cp437.c diff --git a/Makefile b/Makefile index 946df7eab6..a0158ed443 100644 --- a/Makefile +++ b/Makefile @@ -30,6 +30,7 @@ LD32BIT_FLAG:=3D-melf_i386 # Source files SRCBOTH=3Dmisc.c stacks.c output.c string.c block.c cdrom.c disk.c mouse.c= kbd.c \ system.c serial.c clock.c resume.c pnpbios.c vgahooks.c pcibios.c apm.= c \ + cp437.c \ hw/pci.c hw/timer.c hw/rtc.c hw/dma.c hw/pic.c hw/ps2port.c hw/seriali= o.c \ hw/usb.c hw/usb-uhci.c hw/usb-ohci.c hw/usb-ehci.c \ hw/usb-hid.c hw/usb-msc.c hw/usb-uas.c \ diff --git a/src/cp437.h b/src/cp437.h new file mode 100644 index 0000000000..7bd1ef152b --- /dev/null +++ b/src/cp437.h @@ -0,0 +1 @@ +u16 cp437_to_unicode(u8 cp437); diff --git a/src/cp437.c b/src/cp437.c new file mode 100644 index 0000000000..7305e20737 --- /dev/null +++ b/src/cp437.c @@ -0,0 +1,275 @@ +/* + * code page 437 to unicode map + */ + +#include "types.h" +#include "biosvar.h" +#include "cp437.h" + +static VAR16 u16 cp437_to_unicode_map[256] =3D { + + /* https://en.wikipedia.org/wiki/Code_page_437 */ + [ 0x00 ] =3D 0x0000, + [ 0x01 ] =3D 0x263A, + [ 0x02 ] =3D 0x263B, + [ 0x03 ] =3D 0x2665, + [ 0x04 ] =3D 0x2666, + [ 0x05 ] =3D 0x2663, + [ 0x06 ] =3D 0x2660, + [ 0x07 ] =3D 0x2022, + [ 0x08 ] =3D 0x25D8, + [ 0x09 ] =3D 0x25CB, + [ 0x0a ] =3D 0x25D9, + [ 0x0b ] =3D 0x2642, + [ 0x0c ] =3D 0x2640, + [ 0x0d ] =3D 0x266A, + [ 0x0e ] =3D 0x266B, + [ 0x0f ] =3D 0x263C, + [ 0x10 ] =3D 0x25BA, + [ 0x11 ] =3D 0x25C4, + [ 0x12 ] =3D 0x2195, + [ 0x13 ] =3D 0x203C, + [ 0x14 ] =3D 0x00B6, + [ 0x15 ] =3D 0x00A7, + [ 0x16 ] =3D 0x25AC, + [ 0x17 ] =3D 0x21A8, + [ 0x18 ] =3D 0x2191, + [ 0x19 ] =3D 0x2193, + [ 0x1a ] =3D 0x2192, + [ 0x1b ] =3D 0x2190, + [ 0x1c ] =3D 0x221F, + [ 0x1d ] =3D 0x2194, + [ 0x1e ] =3D 0x25B2, + [ 0x1f ] =3D 0x25BC, + [ 0x7f ] =3D 0x2302, + + /* http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/PC/CP437.TXT = */ + [ 0x20 ] =3D 0x0020, // SPACE + [ 0x21 ] =3D 0x0021, // EXCLAMATION MARK + [ 0x22 ] =3D 0x0022, // QUOTATION MARK + [ 0x23 ] =3D 0x0023, // NUMBER SIGN + [ 0x24 ] =3D 0x0024, // DOLLAR SIGN + [ 0x25 ] =3D 0x0025, // PERCENT SIGN + [ 0x26 ] =3D 0x0026, // AMPERSAND + [ 0x27 ] =3D 0x0027, // APOSTROPHE + [ 0x28 ] =3D 0x0028, // LEFT PARENTHESIS + [ 0x29 ] =3D 0x0029, // RIGHT PARENTHESIS + [ 0x2a ] =3D 0x002a, // ASTERISK + [ 0x2b ] =3D 0x002b, // PLUS SIGN + [ 0x2c ] =3D 0x002c, // COMMA + [ 0x2d ] =3D 0x002d, // HYPHEN-MINUS + [ 0x2e ] =3D 0x002e, // FULL STOP + [ 0x2f ] =3D 0x002f, // SOLIDUS + [ 0x30 ] =3D 0x0030, // DIGIT ZERO + [ 0x31 ] =3D 0x0031, // DIGIT ONE + [ 0x32 ] =3D 0x0032, // DIGIT TWO + [ 0x33 ] =3D 0x0033, // DIGIT THREE + [ 0x34 ] =3D 0x0034, // DIGIT FOUR + [ 0x35 ] =3D 0x0035, // DIGIT FIVE + [ 0x36 ] =3D 0x0036, // DIGIT SIX + [ 0x37 ] =3D 0x0037, // DIGIT SEVEN + [ 0x38 ] =3D 0x0038, // DIGIT EIGHT + [ 0x39 ] =3D 0x0039, // DIGIT NINE + [ 0x3a ] =3D 0x003a, // COLON + [ 0x3b ] =3D 0x003b, // SEMICOLON + [ 0x3c ] =3D 0x003c, // LESS-THAN SIGN + [ 0x3d ] =3D 0x003d, // EQUALS SIGN + [ 0x3e ] =3D 0x003e, // GREATER-THAN SIGN + [ 0x3f ] =3D 0x003f, // QUESTION MARK + [ 0x40 ] =3D 0x0040, // COMMERCIAL AT + [ 0x41 ] =3D 0x0041, // LATIN CAPITAL LETTER A + [ 0x42 ] =3D 0x0042, // LATIN CAPITAL LETTER B + [ 0x43 ] =3D 0x0043, // LATIN CAPITAL LETTER C + [ 0x44 ] =3D 0x0044, // LATIN CAPITAL LETTER D + [ 0x45 ] =3D 0x0045, // LATIN CAPITAL LETTER E + [ 0x46 ] =3D 0x0046, // LATIN CAPITAL LETTER F + [ 0x47 ] =3D 0x0047, // LATIN CAPITAL LETTER G + [ 0x48 ] =3D 0x0048, // LATIN CAPITAL LETTER H + [ 0x49 ] =3D 0x0049, // LATIN CAPITAL LETTER I + [ 0x4a ] =3D 0x004a, // LATIN CAPITAL LETTER J + [ 0x4b ] =3D 0x004b, // LATIN CAPITAL LETTER K + [ 0x4c ] =3D 0x004c, // LATIN CAPITAL LETTER L + [ 0x4d ] =3D 0x004d, // LATIN CAPITAL LETTER M + [ 0x4e ] =3D 0x004e, // LATIN CAPITAL LETTER N + [ 0x4f ] =3D 0x004f, // LATIN CAPITAL LETTER O + [ 0x50 ] =3D 0x0050, // LATIN CAPITAL LETTER P + [ 0x51 ] =3D 0x0051, // LATIN CAPITAL LETTER Q + [ 0x52 ] =3D 0x0052, // LATIN CAPITAL LETTER R + [ 0x53 ] =3D 0x0053, // LATIN CAPITAL LETTER S + [ 0x54 ] =3D 0x0054, // LATIN CAPITAL LETTER T + [ 0x55 ] =3D 0x0055, // LATIN CAPITAL LETTER U + [ 0x56 ] =3D 0x0056, // LATIN CAPITAL LETTER V + [ 0x57 ] =3D 0x0057, // LATIN CAPITAL LETTER W + [ 0x58 ] =3D 0x0058, // LATIN CAPITAL LETTER X + [ 0x59 ] =3D 0x0059, // LATIN CAPITAL LETTER Y + [ 0x5a ] =3D 0x005a, // LATIN CAPITAL LETTER Z + [ 0x5b ] =3D 0x005b, // LEFT SQUARE BRACKET + [ 0x5c ] =3D 0x005c, // REVERSE SOLIDUS + [ 0x5d ] =3D 0x005d, // RIGHT SQUARE BRACKET + [ 0x5e ] =3D 0x005e, // CIRCUMFLEX ACCENT + [ 0x5f ] =3D 0x005f, // LOW LINE + [ 0x60 ] =3D 0x0060, // GRAVE ACCENT + [ 0x61 ] =3D 0x0061, // LATIN SMALL LETTER A + [ 0x62 ] =3D 0x0062, // LATIN SMALL LETTER B + [ 0x63 ] =3D 0x0063, // LATIN SMALL LETTER C + [ 0x64 ] =3D 0x0064, // LATIN SMALL LETTER D + [ 0x65 ] =3D 0x0065, // LATIN SMALL LETTER E + [ 0x66 ] =3D 0x0066, // LATIN SMALL LETTER F + [ 0x67 ] =3D 0x0067, // LATIN SMALL LETTER G + [ 0x68 ] =3D 0x0068, // LATIN SMALL LETTER H + [ 0x69 ] =3D 0x0069, // LATIN SMALL LETTER I + [ 0x6a ] =3D 0x006a, // LATIN SMALL LETTER J + [ 0x6b ] =3D 0x006b, // LATIN SMALL LETTER K + [ 0x6c ] =3D 0x006c, // LATIN SMALL LETTER L + [ 0x6d ] =3D 0x006d, // LATIN SMALL LETTER M + [ 0x6e ] =3D 0x006e, // LATIN SMALL LETTER N + [ 0x6f ] =3D 0x006f, // LATIN SMALL LETTER O + [ 0x70 ] =3D 0x0070, // LATIN SMALL LETTER P + [ 0x71 ] =3D 0x0071, // LATIN SMALL LETTER Q + [ 0x72 ] =3D 0x0072, // LATIN SMALL LETTER R + [ 0x73 ] =3D 0x0073, // LATIN SMALL LETTER S + [ 0x74 ] =3D 0x0074, // LATIN SMALL LETTER T + [ 0x75 ] =3D 0x0075, // LATIN SMALL LETTER U + [ 0x76 ] =3D 0x0076, // LATIN SMALL LETTER V + [ 0x77 ] =3D 0x0077, // LATIN SMALL LETTER W + [ 0x78 ] =3D 0x0078, // LATIN SMALL LETTER X + [ 0x79 ] =3D 0x0079, // LATIN SMALL LETTER Y + [ 0x7a ] =3D 0x007a, // LATIN SMALL LETTER Z + [ 0x7b ] =3D 0x007b, // LEFT CURLY BRACKET + [ 0x7c ] =3D 0x007c, // VERTICAL LINE + [ 0x7d ] =3D 0x007d, // RIGHT CURLY BRACKET + [ 0x7e ] =3D 0x007e, // TILDE + [ 0x80 ] =3D 0x00c7, // LATIN CAPITAL LETTER C WITH CEDILLA + [ 0x81 ] =3D 0x00fc, // LATIN SMALL LETTER U WITH DIAERESIS + [ 0x82 ] =3D 0x00e9, // LATIN SMALL LETTER E WITH ACUTE + [ 0x83 ] =3D 0x00e2, // LATIN SMALL LETTER A WITH CIRCUMFLEX + [ 0x84 ] =3D 0x00e4, // LATIN SMALL LETTER A WITH DIAERESIS + [ 0x85 ] =3D 0x00e0, // LATIN SMALL LETTER A WITH GRAVE + [ 0x86 ] =3D 0x00e5, // LATIN SMALL LETTER A WITH RING ABOVE + [ 0x87 ] =3D 0x00e7, // LATIN SMALL LETTER C WITH CEDILLA + [ 0x88 ] =3D 0x00ea, // LATIN SMALL LETTER E WITH CIRCUMFLEX + [ 0x89 ] =3D 0x00eb, // LATIN SMALL LETTER E WITH DIAERESIS + [ 0x8a ] =3D 0x00e8, // LATIN SMALL LETTER E WITH GRAVE + [ 0x8b ] =3D 0x00ef, // LATIN SMALL LETTER I WITH DIAERESIS + [ 0x8c ] =3D 0x00ee, // LATIN SMALL LETTER I WITH CIRCUMFLEX + [ 0x8d ] =3D 0x00ec, // LATIN SMALL LETTER I WITH GRAVE + [ 0x8e ] =3D 0x00c4, // LATIN CAPITAL LETTER A WITH DIAERESIS + [ 0x8f ] =3D 0x00c5, // LATIN CAPITAL LETTER A WITH RING ABOVE + [ 0x90 ] =3D 0x00c9, // LATIN CAPITAL LETTER E WITH ACUTE + [ 0x91 ] =3D 0x00e6, // LATIN SMALL LIGATURE AE + [ 0x92 ] =3D 0x00c6, // LATIN CAPITAL LIGATURE AE + [ 0x93 ] =3D 0x00f4, // LATIN SMALL LETTER O WITH CIRCUMFLEX + [ 0x94 ] =3D 0x00f6, // LATIN SMALL LETTER O WITH DIAERESIS + [ 0x95 ] =3D 0x00f2, // LATIN SMALL LETTER O WITH GRAVE + [ 0x96 ] =3D 0x00fb, // LATIN SMALL LETTER U WITH CIRCUMFLEX + [ 0x97 ] =3D 0x00f9, // LATIN SMALL LETTER U WITH GRAVE + [ 0x98 ] =3D 0x00ff, // LATIN SMALL LETTER Y WITH DIAERESIS + [ 0x99 ] =3D 0x00d6, // LATIN CAPITAL LETTER O WITH DIAERESIS + [ 0x9a ] =3D 0x00dc, // LATIN CAPITAL LETTER U WITH DIAERESIS + [ 0x9b ] =3D 0x00a2, // CENT SIGN + [ 0x9c ] =3D 0x00a3, // POUND SIGN + [ 0x9d ] =3D 0x00a5, // YEN SIGN + [ 0x9e ] =3D 0x20a7, // PESETA SIGN + [ 0x9f ] =3D 0x0192, // LATIN SMALL LETTER F WITH HOOK + [ 0xa0 ] =3D 0x00e1, // LATIN SMALL LETTER A WITH ACUTE + [ 0xa1 ] =3D 0x00ed, // LATIN SMALL LETTER I WITH ACUTE + [ 0xa2 ] =3D 0x00f3, // LATIN SMALL LETTER O WITH ACUTE + [ 0xa3 ] =3D 0x00fa, // LATIN SMALL LETTER U WITH ACUTE + [ 0xa4 ] =3D 0x00f1, // LATIN SMALL LETTER N WITH TILDE + [ 0xa5 ] =3D 0x00d1, // LATIN CAPITAL LETTER N WITH TILDE + [ 0xa6 ] =3D 0x00aa, // FEMININE ORDINAL INDICATOR + [ 0xa7 ] =3D 0x00ba, // MASCULINE ORDINAL INDICATOR + [ 0xa8 ] =3D 0x00bf, // INVERTED QUESTION MARK + [ 0xa9 ] =3D 0x2310, // REVERSED NOT SIGN + [ 0xaa ] =3D 0x00ac, // NOT SIGN + [ 0xab ] =3D 0x00bd, // VULGAR FRACTION ONE HALF + [ 0xac ] =3D 0x00bc, // VULGAR FRACTION ONE QUARTER + [ 0xad ] =3D 0x00a1, // INVERTED EXCLAMATION MARK + [ 0xae ] =3D 0x00ab, // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK + [ 0xaf ] =3D 0x00bb, // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK + [ 0xb0 ] =3D 0x2591, // LIGHT SHADE + [ 0xb1 ] =3D 0x2592, // MEDIUM SHADE + [ 0xb2 ] =3D 0x2593, // DARK SHADE + [ 0xb3 ] =3D 0x2502, // BOX DRAWINGS LIGHT VERTICAL + [ 0xb4 ] =3D 0x2524, // BOX DRAWINGS LIGHT VERTICAL AND LEFT + [ 0xb5 ] =3D 0x2561, // BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE + [ 0xb6 ] =3D 0x2562, // BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE + [ 0xb7 ] =3D 0x2556, // BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE + [ 0xb8 ] =3D 0x2555, // BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE + [ 0xb9 ] =3D 0x2563, // BOX DRAWINGS DOUBLE VERTICAL AND LEFT + [ 0xba ] =3D 0x2551, // BOX DRAWINGS DOUBLE VERTICAL + [ 0xbb ] =3D 0x2557, // BOX DRAWINGS DOUBLE DOWN AND LEFT + [ 0xbc ] =3D 0x255d, // BOX DRAWINGS DOUBLE UP AND LEFT + [ 0xbd ] =3D 0x255c, // BOX DRAWINGS UP DOUBLE AND LEFT SINGLE + [ 0xbe ] =3D 0x255b, // BOX DRAWINGS UP SINGLE AND LEFT DOUBLE + [ 0xbf ] =3D 0x2510, // BOX DRAWINGS LIGHT DOWN AND LEFT + [ 0xc0 ] =3D 0x2514, // BOX DRAWINGS LIGHT UP AND RIGHT + [ 0xc1 ] =3D 0x2534, // BOX DRAWINGS LIGHT UP AND HORIZONTAL + [ 0xc2 ] =3D 0x252c, // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL + [ 0xc3 ] =3D 0x251c, // BOX DRAWINGS LIGHT VERTICAL AND RIGHT + [ 0xc4 ] =3D 0x2500, // BOX DRAWINGS LIGHT HORIZONTAL + [ 0xc5 ] =3D 0x253c, // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL + [ 0xc6 ] =3D 0x255e, // BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE + [ 0xc7 ] =3D 0x255f, // BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE + [ 0xc8 ] =3D 0x255a, // BOX DRAWINGS DOUBLE UP AND RIGHT + [ 0xc9 ] =3D 0x2554, // BOX DRAWINGS DOUBLE DOWN AND RIGHT + [ 0xca ] =3D 0x2569, // BOX DRAWINGS DOUBLE UP AND HORIZONTAL + [ 0xcb ] =3D 0x2566, // BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL + [ 0xcc ] =3D 0x2560, // BOX DRAWINGS DOUBLE VERTICAL AND RIGHT + [ 0xcd ] =3D 0x2550, // BOX DRAWINGS DOUBLE HORIZONTAL + [ 0xce ] =3D 0x256c, // BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL + [ 0xcf ] =3D 0x2567, // BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE + [ 0xd0 ] =3D 0x2568, // BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE + [ 0xd1 ] =3D 0x2564, // BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE + [ 0xd2 ] =3D 0x2565, // BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE + [ 0xd3 ] =3D 0x2559, // BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE + [ 0xd4 ] =3D 0x2558, // BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE + [ 0xd5 ] =3D 0x2552, // BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE + [ 0xd6 ] =3D 0x2553, // BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE + [ 0xd7 ] =3D 0x256b, // BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL S= INGLE + [ 0xd8 ] =3D 0x256a, // BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL D= OUBLE + [ 0xd9 ] =3D 0x2518, // BOX DRAWINGS LIGHT UP AND LEFT + [ 0xda ] =3D 0x250c, // BOX DRAWINGS LIGHT DOWN AND RIGHT + [ 0xdb ] =3D 0x2588, // FULL BLOCK + [ 0xdc ] =3D 0x2584, // LOWER HALF BLOCK + [ 0xdd ] =3D 0x258c, // LEFT HALF BLOCK + [ 0xde ] =3D 0x2590, // RIGHT HALF BLOCK + [ 0xdf ] =3D 0x2580, // UPPER HALF BLOCK + [ 0xe0 ] =3D 0x03b1, // GREEK SMALL LETTER ALPHA + [ 0xe1 ] =3D 0x00df, // LATIN SMALL LETTER SHARP S + [ 0xe2 ] =3D 0x0393, // GREEK CAPITAL LETTER GAMMA + [ 0xe3 ] =3D 0x03c0, // GREEK SMALL LETTER PI + [ 0xe4 ] =3D 0x03a3, // GREEK CAPITAL LETTER SIGMA + [ 0xe5 ] =3D 0x03c3, // GREEK SMALL LETTER SIGMA + [ 0xe6 ] =3D 0x00b5, // MICRO SIGN + [ 0xe7 ] =3D 0x03c4, // GREEK SMALL LETTER TAU + [ 0xe8 ] =3D 0x03a6, // GREEK CAPITAL LETTER PHI + [ 0xe9 ] =3D 0x0398, // GREEK CAPITAL LETTER THETA + [ 0xea ] =3D 0x03a9, // GREEK CAPITAL LETTER OMEGA + [ 0xeb ] =3D 0x03b4, // GREEK SMALL LETTER DELTA + [ 0xec ] =3D 0x221e, // INFINITY + [ 0xed ] =3D 0x03c6, // GREEK SMALL LETTER PHI + [ 0xee ] =3D 0x03b5, // GREEK SMALL LETTER EPSILON + [ 0xef ] =3D 0x2229, // INTERSECTION + [ 0xf0 ] =3D 0x2261, // IDENTICAL TO + [ 0xf1 ] =3D 0x00b1, // PLUS-MINUS SIGN + [ 0xf2 ] =3D 0x2265, // GREATER-THAN OR EQUAL TO + [ 0xf3 ] =3D 0x2264, // LESS-THAN OR EQUAL TO + [ 0xf4 ] =3D 0x2320, // TOP HALF INTEGRAL + [ 0xf5 ] =3D 0x2321, // BOTTOM HALF INTEGRAL + [ 0xf6 ] =3D 0x00f7, // DIVISION SIGN + [ 0xf7 ] =3D 0x2248, // ALMOST EQUAL TO + [ 0xf8 ] =3D 0x00b0, // DEGREE SIGN + [ 0xf9 ] =3D 0x2219, // BULLET OPERATOR + [ 0xfa ] =3D 0x00b7, // MIDDLE DOT + [ 0xfb ] =3D 0x221a, // SQUARE ROOT + [ 0xfc ] =3D 0x207f, // SUPERSCRIPT LATIN SMALL LETTER N + [ 0xfd ] =3D 0x00b2, // SUPERSCRIPT TWO + [ 0xfe ] =3D 0x25a0, // BLACK SQUARE + [ 0xff ] =3D 0x00a0, // NO-BREAK SPACE +}; + +u16 cp437_to_unicode(u8 cp437) +{ + return GET_GLOBAL(cp437_to_unicode_map[cp437]); +} --=20 2.9.3 _______________________________________________ SeaBIOS mailing list SeaBIOS@seabios.org https://mail.coreboot.org/mailman/listinfo/seabios From nobody Thu May 2 08:32:01 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 80.81.252.135 is neither permitted nor denied by domain of seabios.org) client-ip=80.81.252.135; envelope-from=seabios-bounces@seabios.org; helo=mail.coreboot.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 80.81.252.135 is neither permitted nor denied by domain of seabios.org) smtp.mailfrom=seabios-bounces@seabios.org Return-Path: Received: from mail.coreboot.org (mail.coreboot.org [80.81.252.135]) by mx.zohomail.com with SMTPS id 1504851546711413.3271337742274; Thu, 7 Sep 2017 23:19:06 -0700 (PDT) Received: from [127.0.0.1] (helo=ra.coreboot.org) by mail.coreboot.org with esmtp (Exim 4.86_2) (envelope-from ) id 1dqCcV-0002Tf-47; Fri, 08 Sep 2017 08:18:27 +0200 Received: from mx1.redhat.com ([209.132.183.28]) by mail.coreboot.org with esmtps (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.86_2) (envelope-from ) id 1dqCcL-0002T6-C9 for seabios@seabios.org; Fri, 08 Sep 2017 08:18:24 +0200 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 621607E424 for ; Fri, 8 Sep 2017 06:18:32 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-117-175.ams2.redhat.com [10.36.117.175]) by smtp.corp.redhat.com (Postfix) with ESMTP id B3E246BF98; Fri, 8 Sep 2017 06:18:29 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 1079E3FBB7; Fri, 8 Sep 2017 08:18:28 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 621607E424 Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=kraxel@redhat.com From: Gerd Hoffmann To: seabios@seabios.org Date: Fri, 8 Sep 2017 08:18:24 +0200 Message-Id: <20170908061828.13732-3-kraxel@redhat.com> In-Reply-To: <20170908061828.13732-1-kraxel@redhat.com> References: <20170908061828.13732-1-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Fri, 08 Sep 2017 06:18:32 +0000 (UTC) X-Spam-Score: -6.5 (------) Subject: [SeaBIOS] [PATCH 2/6] kbd: make enqueue_key public, add ascii_to_keycode X-BeenThere: seabios@seabios.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: SeaBIOS mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gerd Hoffmann MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: seabios-bounces@seabios.org Sender: "SeaBIOS" X-Duff: Orig. Duff, Duff Lite, Duff Dry, Duff Dark, Raspberry Duff, Lady Duff, Red Duff, Tartar Control Duff X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" serial console wants queue key events and needs to map ascii chars to the keycode, so make enqueue_key public and also exports a helper function so sercon can use the scan_to_keycode mapping table. Signed-off-by: Gerd Hoffmann --- src/util.h | 2 ++ src/kbd.c | 18 +++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/util.h b/src/util.h index 8269057fe7..da9059a9bf 100644 --- a/src/util.h +++ b/src/util.h @@ -186,6 +186,8 @@ int jpeg_show(struct jpeg_decdata *jpeg, unsigned char = *pic, int width void kbd_init(void); void handle_15c2(struct bregs *regs); void process_key(u8 key); +u8 enqueue_key(u16 keycode); +u16 ascii_to_keycode(u8 ascii); =20 // misc.c extern int HaveRunPost; diff --git a/src/kbd.c b/src/kbd.c index 916358eed7..15e5ae789c 100644 --- a/src/kbd.c +++ b/src/kbd.c @@ -29,7 +29,7 @@ kbd_init(void) , x + FIELD_SIZEOF(struct bios_data_area_s, kbd_buf)); } =20 -static u8 +u8 enqueue_key(u16 keycode) { u16 buffer_start =3D GET_BDA(kbd_buf_start_offset); @@ -375,6 +375,22 @@ struct scaninfo key_ext_slash VAR16 =3D { 0xe02f, 0xe02f, 0x9500, 0xa400 }; =20 +u16 ascii_to_keycode(u8 ascii) +{ + int i; + + for (i =3D 0; i < ARRAY_SIZE(scan_to_keycode); i++) { + if ((GET_GLOBAL(scan_to_keycode[i].normal) & 0xff) =3D=3D ascii) + return GET_GLOBAL(scan_to_keycode[i].normal); + if ((GET_GLOBAL(scan_to_keycode[i].shift) & 0xff) =3D=3D ascii) + return GET_GLOBAL(scan_to_keycode[i].shift); + if ((GET_GLOBAL(scan_to_keycode[i].control) & 0xff) =3D=3D ascii) + return GET_GLOBAL(scan_to_keycode[i].control); + } + return 0; +} + +// Handle a ps2 style scancode read from the keyboard. static void kbd_set_flag(int key_release, u16 set_bit0, u8 set_bit1, u16 toggle_bit) { --=20 2.9.3 _______________________________________________ SeaBIOS mailing list SeaBIOS@seabios.org https://mail.coreboot.org/mailman/listinfo/seabios From nobody Thu May 2 08:32:01 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 80.81.252.135 is neither permitted nor denied by domain of seabios.org) client-ip=80.81.252.135; envelope-from=seabios-bounces@seabios.org; helo=mail.coreboot.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 80.81.252.135 is neither permitted nor denied by domain of seabios.org) smtp.mailfrom=seabios-bounces@seabios.org Return-Path: Received: from mail.coreboot.org (mail.coreboot.org [80.81.252.135]) by mx.zohomail.com with SMTPS id 1504851554801432.78403280085547; Thu, 7 Sep 2017 23:19:14 -0700 (PDT) Received: from [127.0.0.1] (helo=ra.coreboot.org) by mail.coreboot.org with esmtp (Exim 4.86_2) (envelope-from ) id 1dqCcf-0002VJ-5U; Fri, 08 Sep 2017 08:18:37 +0200 Received: from mx1.redhat.com ([209.132.183.28]) by mail.coreboot.org with esmtps (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.86_2) (envelope-from ) id 1dqCcM-0002T9-Bz for seabios@seabios.org; Fri, 08 Sep 2017 08:18:31 +0200 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 64F25356C0 for ; Fri, 8 Sep 2017 06:18:33 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-117-175.ams2.redhat.com [10.36.117.175]) by smtp.corp.redhat.com (Postfix) with ESMTP id B2E8C6BF89; Fri, 8 Sep 2017 06:18:29 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 12A0B3FBB8; Fri, 8 Sep 2017 08:18:28 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 64F25356C0 Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx06.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=kraxel@redhat.com From: Gerd Hoffmann To: seabios@seabios.org Date: Fri, 8 Sep 2017 08:18:25 +0200 Message-Id: <20170908061828.13732-4-kraxel@redhat.com> In-Reply-To: <20170908061828.13732-1-kraxel@redhat.com> References: <20170908061828.13732-1-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Fri, 08 Sep 2017 06:18:33 +0000 (UTC) X-Spam-Score: -8.0 (--------) Subject: [SeaBIOS] [PATCH 3/6] paravirt: read QEMU_CFG_NOGRAPHIC, store in etc/sercon-enable romfile X-BeenThere: seabios@seabios.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: SeaBIOS mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gerd Hoffmann MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: seabios-bounces@seabios.org Sender: "SeaBIOS" X-Duff: Orig. Duff, Duff Lite, Duff Dry, Duff Dark, Raspberry Duff, Lady Duff, Red Duff, Tartar Control Duff X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Will be used as runtime switch to enable serial console support. Signed-off-by: Gerd Hoffmann --- src/fw/paravirt.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/fw/paravirt.c b/src/fw/paravirt.c index 5b23d786be..e9cca4fe6e 100644 --- a/src/fw/paravirt.c +++ b/src/fw/paravirt.c @@ -210,6 +210,7 @@ qemu_platform_setup(void) #define QEMU_CFG_SIGNATURE 0x00 #define QEMU_CFG_ID 0x01 #define QEMU_CFG_UUID 0x02 +#define QEMU_CFG_NOGRAPHIC 0x04 #define QEMU_CFG_NUMA 0x0d #define QEMU_CFG_BOOT_MENU 0x0e #define QEMU_CFG_NB_CPUS 0x05 @@ -510,6 +511,7 @@ qemu_cfg_legacy(void) qemu_romfile_add("etc/show-boot-menu", QEMU_CFG_BOOT_MENU, 0, 2); qemu_romfile_add("etc/irq0-override", QEMU_CFG_IRQ0_OVERRIDE, 0, 1); qemu_romfile_add("etc/max-cpus", QEMU_CFG_MAX_CPUS, 0, 2); + qemu_romfile_add("etc/sercon-enable", QEMU_CFG_NOGRAPHIC, 0, 2); =20 // NUMA data u64 numacount; --=20 2.9.3 _______________________________________________ SeaBIOS mailing list SeaBIOS@seabios.org https://mail.coreboot.org/mailman/listinfo/seabios From nobody Thu May 2 08:32:01 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 80.81.252.135 is neither permitted nor denied by domain of seabios.org) client-ip=80.81.252.135; envelope-from=seabios-bounces@seabios.org; helo=mail.coreboot.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 80.81.252.135 is neither permitted nor denied by domain of seabios.org) smtp.mailfrom=seabios-bounces@seabios.org Return-Path: Received: from mail.coreboot.org (mail.coreboot.org [80.81.252.135]) by mx.zohomail.com with SMTPS id 1504851554826766.5826887500045; Thu, 7 Sep 2017 23:19:14 -0700 (PDT) Received: from [127.0.0.1] (helo=ra.coreboot.org) by mail.coreboot.org with esmtp (Exim 4.86_2) (envelope-from ) id 1dqCch-0002Vn-Un; Fri, 08 Sep 2017 08:18:40 +0200 Received: from mx1.redhat.com ([209.132.183.28]) by mail.coreboot.org with esmtps (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.86_2) (envelope-from ) id 1dqCcR-0002TA-M7 for seabios@seabios.org; Fri, 08 Sep 2017 08:18:33 +0200 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id A165A81DF7 for ; Fri, 8 Sep 2017 06:18:33 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-117-175.ams2.redhat.com [10.36.117.175]) by smtp.corp.redhat.com (Postfix) with ESMTP id D85DC60E3A; Fri, 8 Sep 2017 06:18:29 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 14F893FBB9; Fri, 8 Sep 2017 08:18:28 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com A165A81DF7 Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx01.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=kraxel@redhat.com From: Gerd Hoffmann To: seabios@seabios.org Date: Fri, 8 Sep 2017 08:18:26 +0200 Message-Id: <20170908061828.13732-5-kraxel@redhat.com> In-Reply-To: <20170908061828.13732-1-kraxel@redhat.com> References: <20170908061828.13732-1-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.25]); Fri, 08 Sep 2017 06:18:33 +0000 (UTC) X-Spam-Score: -8.0 (--------) Subject: [SeaBIOS] [PATCH 4/6] add serial console support X-BeenThere: seabios@seabios.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: SeaBIOS mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gerd Hoffmann MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: seabios-bounces@seabios.org Sender: "SeaBIOS" X-Duff: Orig. Duff, Duff Lite, Duff Dry, Duff Dark, Raspberry Duff, Lady Duff, Red Duff, Tartar Control Duff X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Redirect int10 calls to serial console output. Parse serial input and queue key events. Signed-off-by: Gerd Hoffmann --- Makefile | 2 +- src/util.h | 3 + src/clock.c | 1 + src/misc.c | 2 + src/optionroms.c | 7 +- src/sercon.c | 604 +++++++++++++++++++++++++++++++++++++++++++++++++++= ++++ src/Kconfig | 5 + 7 files changed, 622 insertions(+), 2 deletions(-) create mode 100644 src/sercon.c diff --git a/Makefile b/Makefile index a0158ed443..289ed82ad8 100644 --- a/Makefile +++ b/Makefile @@ -29,7 +29,7 @@ LD32BIT_FLAG:=3D-melf_i386 =20 # Source files SRCBOTH=3Dmisc.c stacks.c output.c string.c block.c cdrom.c disk.c mouse.c= kbd.c \ - system.c serial.c clock.c resume.c pnpbios.c vgahooks.c pcibios.c apm.= c \ + system.c serial.c sercon.c clock.c resume.c pnpbios.c vgahooks.c pcibi= os.c apm.c \ cp437.c \ hw/pci.c hw/timer.c hw/rtc.c hw/dma.c hw/pic.c hw/ps2port.c hw/seriali= o.c \ hw/usb.c hw/usb-uhci.c hw/usb-ohci.c hw/usb-ehci.c \ diff --git a/src/util.h b/src/util.h index da9059a9bf..f7ea3ae862 100644 --- a/src/util.h +++ b/src/util.h @@ -234,6 +234,9 @@ void code_mutable_preinit(void); // serial.c void serial_setup(void); void lpt_setup(void); +void sercon_10(struct bregs *regs); +void sercon_setup(void); +void sercon_check_event(void); =20 // version.c extern const char VERSION[], BUILDINFO[]; diff --git a/src/clock.c b/src/clock.c index e83e0f3388..e44e112068 100644 --- a/src/clock.c +++ b/src/clock.c @@ -295,6 +295,7 @@ clock_update(void) floppy_tick(); usb_check_event(); ps2_check_event(); + sercon_check_event(); } =20 // INT 08h System Timer ISR Entry Point diff --git a/src/misc.c b/src/misc.c index f02237c366..f4b656dd35 100644 --- a/src/misc.c +++ b/src/misc.c @@ -11,6 +11,7 @@ #include "output.h" // debug_enter #include "stacks.h" // call16_int #include "string.h" // memset +#include "util.h" // serial_10 =20 #define PORT_MATH_CLEAR 0x00f0 =20 @@ -57,6 +58,7 @@ handle_10(struct bregs *regs) { debug_enter(regs, DEBUG_HDL_10); // don't do anything, since the VGA BIOS handles int10h requests + sercon_10(regs); } =20 // NMI handler diff --git a/src/optionroms.c b/src/optionroms.c index 65f7fe0ef4..8665db42e3 100644 --- a/src/optionroms.c +++ b/src/optionroms.c @@ -432,9 +432,14 @@ vgarom_setup(void) run_file_roms("vgaroms/", 1, NULL); rom_reserve(0); =20 - if (rom_get_last() =3D=3D BUILD_ROM_START) + if (rom_get_last() =3D=3D BUILD_ROM_START) { // No VGA rom found + if (romfile_loadint("etc/sercon-enable", 0)) { + sercon_setup(); + enable_vga_console(); + } return; + } =20 VgaROM =3D (void*)BUILD_ROM_START; enable_vga_console(); diff --git a/src/sercon.c b/src/sercon.c new file mode 100644 index 0000000000..f785aa8fd9 --- /dev/null +++ b/src/sercon.c @@ -0,0 +1,604 @@ +// serial console support +// +// Copyright (C) 2016 Gerd Hoffmann +// +// This file may be distributed under the terms of the GNU LGPLv3 license. + +#include "biosvar.h" // SET_BDA +#include "bregs.h" // struct bregs +#include "stacks.h" // yield +#include "output.h" // dprintf +#include "util.h" // irqtimer_calc_ticks +#include "hw/serialio.h" // SEROFF_IER +#include "cp437.h" + +static u8 video_rows(void) +{ + return GET_BDA(video_rows)+1; +} + +static u8 video_cols(void) +{ + return GET_BDA(video_cols); +} + +static u8 cursor_pos_col(void) +{ + u16 pos =3D GET_BDA(cursor_pos[0]); + return pos & 0xff; +} + +static u8 cursor_pos_row(void) +{ + u16 pos =3D GET_BDA(cursor_pos[0]); + return (pos >> 8) & 0xff; +} + +static void cursor_pos_set(u8 row, u8 col) +{ + u16 pos =3D ((u16)row << 8) | col; + SET_BDA(cursor_pos[0], pos); +} + +/**************************************************************** + * serial console output + ****************************************************************/ + +VARLOW u16 sercon_port; + +/* + * We have a small output buffer here, for lazy output. That allows + * to avoid a whole bunch of control sequences for pointless cursor + * moves, so when logging the output it'll be *alot* less cluttered. + * + * sercon_char/attr is the actual output buffer. + * sercon_attr_last is the most recent attribute sent to the terminal. + * sercon_col_last is the most recent column sent to the terminal. + * sercon_row_last is the most recent row sent to the terminal. + */ +VARLOW u8 sercon_attr_last; +VARLOW u8 sercon_col_last; +VARLOW u8 sercon_row_last; +VARLOW u8 sercon_char; +VARLOW u8 sercon_attr =3D 0x07; + +static VAR16 u8 sercon_cmap[8] =3D { '0', '4', '2', '6', '1', '5', '3', '7= ' }; + +static void sercon_putchar(u8 chr) +{ + u16 addr =3D GET_LOW(sercon_port); + u32 end =3D irqtimer_calc_ticks(0x0a); + +#if 0 + /* for visual control sequence debugging */ + if (chr =3D=3D '\x1b') + chr =3D '*'; +#endif + + for (;;) { + u8 lsr =3D inb(addr+SEROFF_LSR); + if ((lsr & 0x60) =3D=3D 0x60) { + // Success - can write data + outb(chr, addr+SEROFF_DATA); + break; + } + if (irqtimer_check(end)) { + break; + } + yield(); + } +} + +static void sercon_term_reset(void) +{ + sercon_putchar('\x1b'); + sercon_putchar('c'); +} + +static void sercon_term_clear_screen(void) +{ + sercon_putchar('\x1b'); + sercon_putchar('['); + sercon_putchar('2'); + sercon_putchar('J'); +} + +static void sercon_term_no_linewrap(void) +{ + sercon_putchar('\x1b'); + sercon_putchar('['); + sercon_putchar('?'); + sercon_putchar('7'); + sercon_putchar('l'); +} + +static void sercon_term_cursor_goto(u8 row, u8 col) +{ + row++; col++; + sercon_putchar('\x1b'); + sercon_putchar('['); + sercon_putchar('0' + row / 10); + sercon_putchar('0' + row % 10); + sercon_putchar(';'); + sercon_putchar('0' + col / 10); + sercon_putchar('0' + col % 10); + sercon_putchar('H'); +} + +static void sercon_term_set_color(u8 fg, u8 bg, u8 bold) +{ + sercon_putchar('\x1b'); + sercon_putchar('['); + sercon_putchar('0'); + if (fg !=3D 7) { + sercon_putchar(';'); + sercon_putchar('3'); + sercon_putchar(GET_GLOBAL(sercon_cmap[fg & 7])); + } + if (bg !=3D 0) { + sercon_putchar(';'); + sercon_putchar('4'); + sercon_putchar(GET_GLOBAL(sercon_cmap[bg & 7])); + } + if (bold) { + sercon_putchar(';'); + sercon_putchar('1'); + } + sercon_putchar('m'); +} + +static void sercon_set_attr(u8 attr) +{ + if (attr =3D=3D GET_LOW(sercon_attr_last)) + return; + + SET_LOW(sercon_attr_last, attr); + sercon_term_set_color((attr >> 0) & 7, + (attr >> 4) & 7, + attr & 0x08); +} + +static void sercon_print_utf8(u8 chr) +{ + u16 unicode =3D cp437_to_unicode(chr); + + if (unicode < 0x7f) { + sercon_putchar(unicode); + } else if (unicode < 0x7ff) { + sercon_putchar(0xc0 | ((unicode >> 6) & 0x1f)); + sercon_putchar(0x80 | ((unicode >> 0) & 0x3f)); + } else { + sercon_putchar(0xe0 | ((unicode >> 12) & 0x0f)); + sercon_putchar(0x80 | ((unicode >> 6) & 0x3f)); + sercon_putchar(0x80 | ((unicode >> 0) & 0x3f)); + } +} + +static void sercon_lazy_cursor_sync(void) +{ + u8 row =3D cursor_pos_row(); + u8 col =3D cursor_pos_col(); + + if (GET_LOW(sercon_row_last) =3D=3D row && + GET_LOW(sercon_col_last) =3D=3D col) + return; + + if (col =3D=3D 0 && GET_LOW(sercon_row_last) <=3D row) { + if (GET_LOW(sercon_col_last) !=3D 0) { + sercon_putchar('\r'); + SET_LOW(sercon_col_last, 0); + } + while (GET_LOW(sercon_row_last) < row) { + sercon_putchar('\n'); + SET_LOW(sercon_row_last, GET_LOW(sercon_row_last)+1); + } + if (GET_LOW(sercon_row_last) =3D=3D row && + GET_LOW(sercon_col_last) =3D=3D col) + return; + } + + sercon_term_cursor_goto(row, col); + SET_LOW(sercon_row_last, row); + SET_LOW(sercon_col_last, col); +} + +static void sercon_lazy_flush(void) +{ + u8 chr, attr; + + chr =3D GET_LOW(sercon_char); + attr =3D GET_LOW(sercon_attr); + if (chr) { + sercon_set_attr(attr); + sercon_print_utf8(chr); + SET_LOW(sercon_col_last, GET_LOW(sercon_col_last) + 1); + } + + sercon_lazy_cursor_sync(); + + SET_LOW(sercon_attr, 0x07); + SET_LOW(sercon_char, 0x00); +} + +static void sercon_lazy_cursor_update(u8 row, u8 col) +{ + cursor_pos_set(row, col); + SET_LOW(sercon_row_last, row); + SET_LOW(sercon_col_last, col); +} + +static void sercon_lazy_backspace(void) +{ + u8 col; + + sercon_lazy_flush(); + col =3D cursor_pos_col(); + if (col > 0) { + sercon_putchar(8); + sercon_lazy_cursor_update(cursor_pos_row(), col-1); + } +} + +static void sercon_lazy_cr(void) +{ + cursor_pos_set(cursor_pos_row(), 0); +} + +static void sercon_lazy_lf(void) +{ + u8 row; + + row =3D cursor_pos_row() + 1; + if (row >=3D video_rows()) { + /* scrolling up */ + row =3D video_rows()-1; + if (GET_LOW(sercon_row_last) > 0) { + SET_LOW(sercon_row_last, GET_LOW(sercon_row_last) - 1); + } + } + cursor_pos_set(row, cursor_pos_col()); +} + +static void sercon_lazy_move_cursor(void) +{ + u8 col; + + col =3D cursor_pos_col() + 1; + if (col >=3D video_cols()) { + sercon_lazy_cr(); + sercon_lazy_lf(); + } else { + cursor_pos_set(cursor_pos_row(), col); + } +} + +static void sercon_lazy_putchar(u8 chr, u8 attr, u8 teletype) +{ + if (cursor_pos_row() !=3D GET_LOW(sercon_row_last) || + cursor_pos_col() !=3D GET_LOW(sercon_col_last)) { + sercon_lazy_flush(); + } + + SET_LOW(sercon_char, chr); + if (teletype) + sercon_lazy_move_cursor(); + else + SET_LOW(sercon_attr, attr); +} + +/* Set video mode */ +static void sercon_1000(struct bregs *regs) +{ + u8 clearscreen =3D !(regs->al & 0x80); + u8 mode =3D regs->al & 0x7f; + u8 rows, cols; + + switch (mode) { + case 0x03: + default: + cols =3D 80; + rows =3D 25; + regs->al =3D 0x30; + } + SET_LOW(sercon_col_last, 0); + SET_LOW(sercon_row_last, 0); + SET_LOW(sercon_attr_last, 0); + + cursor_pos_set(0, 0); + SET_BDA(video_mode, mode); + SET_BDA(video_cols, cols); + SET_BDA(video_rows, rows-1); + SET_BDA(cursor_type, 0x0007); + + sercon_term_reset(); + sercon_term_no_linewrap(); + if (clearscreen) + sercon_term_clear_screen(); +} + +/* Set text-mode cursor shape */ +static void sercon_1001(struct bregs *regs) +{ + /* show/hide cursor? */ + SET_BDA(cursor_type, regs->cx); +} + +/* Set cursor position */ +static void sercon_1002(struct bregs *regs) +{ + u8 row =3D regs->dh; + u8 col =3D regs->dl; + + cursor_pos_set(row, col); +} + +/* Get cursor position */ +static void sercon_1003(struct bregs *regs) +{ + regs->cx =3D GET_BDA(cursor_type); + regs->dh =3D cursor_pos_row(); + regs->dl =3D cursor_pos_col(); +} + +/* Scroll up window */ +static void sercon_1006(struct bregs *regs) +{ + sercon_lazy_flush(); + if (regs->al =3D=3D 0) { + /* clear rect, do only in case this looks like a fullscreen clear = */ + if (regs->ch =3D=3D 0 && + regs->cl =3D=3D 0 && + regs->dh =3D=3D video_rows()-1 && + regs->dl =3D=3D video_cols()-1) { + sercon_set_attr(regs->bh); + sercon_term_clear_screen(); + } + } else { + sercon_putchar('\r'); + sercon_putchar('\n'); + } +} + +/* Read character and attribute at cursor position */ +static void sercon_1008(struct bregs *regs) +{ + regs->ah =3D 0x07; + regs->bh =3D ' '; +} + +/* Write character and attribute at cursor position */ +static void sercon_1009(struct bregs *regs) +{ + u16 count =3D regs->cx; + + if (count =3D=3D 1) { + sercon_lazy_putchar(regs->al, regs->bl, 0); + + } else if (regs->al =3D=3D 0x20 && + video_rows() * video_cols() =3D=3D count && + cursor_pos_row() =3D=3D 0 && + cursor_pos_col() =3D=3D 0) { + /* override everything with spaces -> this is clear screen */ + sercon_lazy_flush(); + sercon_set_attr(regs->bl); + sercon_term_clear_screen(); + + } else { + sercon_lazy_flush(); + sercon_set_attr(regs->bl); + while (count) { + sercon_print_utf8(regs->al); + count--; + } + sercon_term_cursor_goto(cursor_pos_row(), + cursor_pos_col()); + } +} + +/* Teletype output */ +static void sercon_100e(struct bregs *regs) +{ + switch (regs->al) { + case 7: + sercon_putchar(0x07); + break; + case 8: + sercon_lazy_backspace(); + break; + case '\r': + sercon_lazy_cr(); + break; + case '\n': + sercon_lazy_lf(); + break; + default: + sercon_lazy_putchar(regs->al, 0, 1); + break; + } +} + +/* Get current video mode */ +static void sercon_100f(struct bregs *regs) +{ + regs->al =3D GET_BDA(video_mode); + regs->ah =3D GET_BDA(video_cols); +} + +/* VBE 2.0 */ +static void sercon_104f(struct bregs *regs) +{ + regs->ax =3D 0x0100; +} + +static void sercon_10XX(struct bregs *regs) +{ + warn_unimplemented(regs); +} + +void VISIBLE16 +sercon_10(struct bregs *regs) +{ + if (!CONFIG_SERCON) + return; + if (!GET_LOW(sercon_port)) + return; + + switch (regs->ah) { + case 0x00: sercon_1000(regs); break; + case 0x01: sercon_1001(regs); break; + case 0x02: sercon_1002(regs); break; + case 0x03: sercon_1003(regs); break; + case 0x06: sercon_1006(regs); break; + case 0x08: sercon_1008(regs); break; + case 0x09: sercon_1009(regs); break; + case 0x0e: sercon_100e(regs); break; + case 0x0f: sercon_100f(regs); break; + case 0x4f: sercon_104f(regs); break; + default: sercon_10XX(regs); break; + } +} + +void sercon_setup(void) +{ + if (!CONFIG_SERCON) + return; + + struct segoff_s seabios, vgabios; + u16 addr =3D PORT_SERIAL1; + + SET_LOW(sercon_port, addr); + outb(0x03, addr + SEROFF_LCR); // 8N1 + outb(0x01, addr + 0x02); // enable fifo +} + +/**************************************************************** + * serial input + ****************************************************************/ + +VARLOW u8 rx_buf[16]; +VARLOW u8 rx_bytes; + +static VAR16 struct { + char seq[4]; + u8 len; + u16 keycode; +} termseq[] =3D { + { .seq =3D "OP", .len =3D 2, .keycode =3D 0x3b00 }, // F1 + { .seq =3D "OQ", .len =3D 2, .keycode =3D 0x3c00 }, // F2 + { .seq =3D "OR", .len =3D 2, .keycode =3D 0x3d00 }, // F3 + { .seq =3D "OS", .len =3D 2, .keycode =3D 0x3e00 }, // F4 + + { .seq =3D "[15~", .len =3D 4, .keycode =3D 0x3f00 }, // F5 + { .seq =3D "[17~", .len =3D 4, .keycode =3D 0x4000 }, // F6 + { .seq =3D "[18~", .len =3D 4, .keycode =3D 0x4100 }, // F7 + { .seq =3D "[19~", .len =3D 4, .keycode =3D 0x4200 }, // F8 + { .seq =3D "[20~", .len =3D 4, .keycode =3D 0x4300 }, // F9 + { .seq =3D "[21~", .len =3D 4, .keycode =3D 0x4400 }, // F10 + { .seq =3D "[23~", .len =3D 4, .keycode =3D 0x5700 }, // F11 + { .seq =3D "[24~", .len =3D 4, .keycode =3D 0x5800 }, // F12 + + { .seq =3D "[2~", .len =3D 3, .keycode =3D 0x52e0 }, // insert + { .seq =3D "[3~", .len =3D 3, .keycode =3D 0x53e0 }, // delete + { .seq =3D "[5~", .len =3D 3, .keycode =3D 0x49e0 }, // page up + { .seq =3D "[6~", .len =3D 3, .keycode =3D 0x51e0 }, // page down + + { .seq =3D "[A", .len =3D 2, .keycode =3D 0x48e0 }, // up + { .seq =3D "[B", .len =3D 2, .keycode =3D 0x50e0 }, // down + { .seq =3D "[C", .len =3D 2, .keycode =3D 0x4de0 }, // right + { .seq =3D "[D", .len =3D 2, .keycode =3D 0x4be0 }, // left + + { .seq =3D "[H", .len =3D 2, .keycode =3D 0x47e0 }, // home + { .seq =3D "[F", .len =3D 2, .keycode =3D 0x4fe0 }, // end +}; + +static void shiftbuf(int remove) +{ + int i, remaining; + + remaining =3D GET_LOW(rx_bytes) - remove; + SET_LOW(rx_bytes, remaining); + for (i =3D 0; i < remaining; i++) + SET_LOW(rx_buf[i], GET_LOW(rx_buf[i + remove])); +} + +static int cmpbuf(int seq) +{ + int chr, len; + + len =3D GET_GLOBAL(termseq[seq].len); + if (GET_LOW(rx_bytes) < len + 1) + return 0; + for (chr =3D 0; chr < len; chr++) + if (GET_GLOBAL(termseq[seq].seq[chr]) !=3D GET_LOW(rx_buf[chr + 1]= )) + return 0; + return 1; +} + +static int findseq(void) +{ + int seq; + + for (seq =3D 0; seq < ARRAY_SIZE(termseq); seq++) + if (cmpbuf(seq)) + return seq; + return -1; +} + +void +sercon_check_event(void) +{ + if (!CONFIG_SERCON) + return; + + u16 addr =3D GET_LOW(sercon_port); + u16 keycode; + u8 byte, count =3D 0; + int seq, chr; + + // check to see if there is a active serial port + if (!addr) + return; + if (inb(addr + SEROFF_LSR) =3D=3D 0xFF) + return; + + // flush pending output + sercon_lazy_flush(); + + // read all available data + while (inb(addr + SEROFF_LSR) & 0x01) { + byte =3D inb(addr + SEROFF_DATA); + if (GET_LOW(rx_bytes) < sizeof(rx_buf)) { + SET_LOW(rx_buf[rx_bytes], byte); + SET_LOW(rx_bytes, GET_LOW(rx_bytes) + 1); + count++; + } + } + + for (;;) { + // no (more) input data + if (!GET_LOW(rx_bytes)) + return; + + // lookup escape sequences + if (GET_LOW(rx_bytes) > 1 && GET_LOW(rx_buf[0]) =3D=3D 0x1b) { + seq =3D findseq(); + if (seq >=3D 0) { + enqueue_key(GET_GLOBAL(termseq[seq].keycode)); + shiftbuf(GET_GLOBAL(termseq[seq].len) + 1); + continue; + } + } + + // Seems we got a escape sequence we didn't recognise. + // -> If we received data wait for more, maybe it is just incompl= ete. + if (GET_LOW(rx_buf[0]) =3D=3D 0x1b && count) + return; + + // Handle input as individual char. + chr =3D GET_LOW(rx_buf[0]); + keycode =3D ascii_to_keycode(chr); + if (keycode) + enqueue_key(keycode); + shiftbuf(1); + } +} diff --git a/src/Kconfig b/src/Kconfig index 77ec9c7a91..55a87cb7f0 100644 --- a/src/Kconfig +++ b/src/Kconfig @@ -306,6 +306,11 @@ menu "Hardware support" default y help Support serial ports. This also enables int 14 serial port ca= lls. + config SERCON + bool "Serial console" + default y + help + Support redirecting vga output to the serial console. config LPT bool "Parallel port" default y --=20 2.9.3 _______________________________________________ SeaBIOS mailing list SeaBIOS@seabios.org https://mail.coreboot.org/mailman/listinfo/seabios From nobody Thu May 2 08:32:01 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 80.81.252.135 is neither permitted nor denied by domain of seabios.org) client-ip=80.81.252.135; envelope-from=seabios-bounces@seabios.org; helo=mail.coreboot.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 80.81.252.135 is neither permitted nor denied by domain of seabios.org) smtp.mailfrom=seabios-bounces@seabios.org Return-Path: Received: from mail.coreboot.org (mail.coreboot.org [80.81.252.135]) by mx.zohomail.com with SMTPS id 1504851557129500.8418216900492; Thu, 7 Sep 2017 23:19:17 -0700 (PDT) Received: from [127.0.0.1] (helo=ra.coreboot.org) by mail.coreboot.org with esmtp (Exim 4.86_2) (envelope-from ) id 1dqCcl-0002Wj-B1; Fri, 08 Sep 2017 08:18:43 +0200 Received: from mx1.redhat.com ([209.132.183.28]) by mail.coreboot.org with esmtps (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.86_2) (envelope-from ) id 1dqCcQ-0002TH-9N for seabios@seabios.org; Fri, 08 Sep 2017 08:18:36 +0200 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 55ACB4E341 for ; Fri, 8 Sep 2017 06:18:37 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-117-175.ams2.redhat.com [10.36.117.175]) by smtp.corp.redhat.com (Postfix) with ESMTP id C7DBF80A87; Fri, 8 Sep 2017 06:18:35 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 1743B41A80; Fri, 8 Sep 2017 08:18:28 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 55ACB4E341 Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=kraxel@redhat.com From: Gerd Hoffmann To: seabios@seabios.org Date: Fri, 8 Sep 2017 08:18:27 +0200 Message-Id: <20170908061828.13732-6-kraxel@redhat.com> In-Reply-To: <20170908061828.13732-1-kraxel@redhat.com> References: <20170908061828.13732-1-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Fri, 08 Sep 2017 06:18:37 +0000 (UTC) X-Spam-Score: -6.5 (------) Subject: [SeaBIOS] [PATCH 5/6] sercon: split-output implementation X-BeenThere: seabios@seabios.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: SeaBIOS mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gerd Hoffmann MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: seabios-bounces@seabios.org Sender: "SeaBIOS" X-Duff: Orig. Duff, Duff Lite, Duff Dry, Duff Dark, Raspberry Duff, Lady Duff, Red Duff, Tartar Control Duff X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Allows to run the serial console in parallel with a vga display. Output will show up on both vga and serial line. Input will be accepted from both keyboard and serial line. Signed-off-by: Gerd Hoffmann --- src/optionroms.c | 2 ++ src/sercon.c | 106 ++++++++++++++++++++++++++++++++++++++++++++-------= ---- src/romlayout.S | 46 ++++++++++++++++++++++++ 3 files changed, 133 insertions(+), 21 deletions(-) diff --git a/src/optionroms.c b/src/optionroms.c index 8665db42e3..76a70ea686 100644 --- a/src/optionroms.c +++ b/src/optionroms.c @@ -442,6 +442,8 @@ vgarom_setup(void) } =20 VgaROM =3D (void*)BUILD_ROM_START; + if (romfile_loadint("etc/sercon-enable", 0)) + sercon_setup(); enable_vga_console(); } =20 diff --git a/src/sercon.c b/src/sercon.c index f785aa8fd9..5699905f32 100644 --- a/src/sercon.c +++ b/src/sercon.c @@ -9,6 +9,7 @@ #include "stacks.h" // yield #include "output.h" // dprintf #include "util.h" // irqtimer_calc_ticks +#include "string.h" // memcpy #include "hw/serialio.h" // SEROFF_IER #include "cp437.h" =20 @@ -45,6 +46,9 @@ static void cursor_pos_set(u8 row, u8 col) ****************************************************************/ =20 VARLOW u16 sercon_port; +VARLOW u8 sercon_split; +VARLOW u8 sercon_enable; +VARFSEG struct segoff_s sercon_real_vga_handler; =20 /* * We have a small output buffer here, for lazy output. That allows @@ -64,6 +68,11 @@ VARLOW u8 sercon_attr =3D 0x07; =20 static VAR16 u8 sercon_cmap[8] =3D { '0', '4', '2', '6', '1', '5', '3', '7= ' }; =20 +static int sercon_splitmode(void) +{ + return GET_LOW(sercon_split); +} + static void sercon_putchar(u8 chr) { u16 addr =3D GET_LOW(sercon_port); @@ -174,6 +183,15 @@ static void sercon_print_utf8(u8 chr) } } =20 +static void sercon_cursor_pos_set(u8 row, u8 col) +{ + if (!sercon_splitmode()) { + cursor_pos_set(row, col); + } else { + /* let vgabios update cursor */ + } +} + static void sercon_lazy_cursor_sync(void) { u8 row =3D cursor_pos_row(); @@ -222,7 +240,7 @@ static void sercon_lazy_flush(void) =20 static void sercon_lazy_cursor_update(u8 row, u8 col) { - cursor_pos_set(row, col); + sercon_cursor_pos_set(row, col); SET_LOW(sercon_row_last, row); SET_LOW(sercon_col_last, col); } @@ -241,7 +259,7 @@ static void sercon_lazy_backspace(void) =20 static void sercon_lazy_cr(void) { - cursor_pos_set(cursor_pos_row(), 0); + sercon_cursor_pos_set(cursor_pos_row(), 0); } =20 static void sercon_lazy_lf(void) @@ -256,7 +274,7 @@ static void sercon_lazy_lf(void) SET_LOW(sercon_row_last, GET_LOW(sercon_row_last) - 1); } } - cursor_pos_set(row, cursor_pos_col()); + sercon_cursor_pos_set(row, cursor_pos_col()); } =20 static void sercon_lazy_move_cursor(void) @@ -268,7 +286,7 @@ static void sercon_lazy_move_cursor(void) sercon_lazy_cr(); sercon_lazy_lf(); } else { - cursor_pos_set(cursor_pos_row(), col); + sercon_cursor_pos_set(cursor_pos_row(), col); } } =20 @@ -293,23 +311,28 @@ static void sercon_1000(struct bregs *regs) u8 mode =3D regs->al & 0x7f; u8 rows, cols; =20 - switch (mode) { - case 0x03: - default: - cols =3D 80; - rows =3D 25; - regs->al =3D 0x30; + if (!sercon_splitmode()) { + switch (mode) { + case 0x03: + default: + cols =3D 80; + rows =3D 25; + regs->al =3D 0x30; + } + cursor_pos_set(0, 0); + SET_BDA(video_mode, mode); + SET_BDA(video_cols, cols); + SET_BDA(video_rows, rows-1); + SET_BDA(cursor_type, 0x0007); + } else { + SET_LOW(sercon_enable, (mode =3D=3D 0x03)); + /* let vgabios handle mode init */ } + SET_LOW(sercon_col_last, 0); SET_LOW(sercon_row_last, 0); SET_LOW(sercon_attr_last, 0); =20 - cursor_pos_set(0, 0); - SET_BDA(video_mode, mode); - SET_BDA(video_cols, cols); - SET_BDA(video_rows, rows-1); - SET_BDA(cursor_type, 0x0007); - sercon_term_reset(); sercon_term_no_linewrap(); if (clearscreen) @@ -326,10 +349,7 @@ static void sercon_1001(struct bregs *regs) /* Set cursor position */ static void sercon_1002(struct bregs *regs) { - u8 row =3D regs->dh; - u8 col =3D regs->dl; - - cursor_pos_set(row, col); + sercon_cursor_pos_set(regs->dh, regs->dl); } =20 /* Get cursor position */ @@ -427,7 +447,13 @@ static void sercon_100f(struct bregs *regs) /* VBE 2.0 */ static void sercon_104f(struct bregs *regs) { - regs->ax =3D 0x0100; + if (!sercon_splitmode()) { + regs->ax =3D 0x0100; + } else { + // Disable sercon entry point on any vesa modeset + if (regs->al =3D=3D 0x00) + SET_LOW(sercon_enable, 0); + } } =20 static void sercon_10XX(struct bregs *regs) @@ -458,6 +484,31 @@ sercon_10(struct bregs *regs) } } =20 +void VISIBLE16 +sercon_10_splitmode(struct bregs *regs) +{ + if (!CONFIG_SERCON) + return; + if (!GET_LOW(sercon_port)) + return; + + switch (regs->ah) { + case 0x01: + case 0x02: + case 0x03: + case 0x08: + case 0x0f: + /* nothing, vgabios did all work */ + break; + case 0x00: sercon_1000(regs); break; + case 0x06: sercon_1006(regs); break; + case 0x09: sercon_1009(regs); break; + case 0x0e: sercon_100e(regs); break; + case 0x4f: sercon_104f(regs); break; + default: sercon_10XX(regs); break; + } +} + void sercon_setup(void) { if (!CONFIG_SERCON) @@ -466,6 +517,19 @@ void sercon_setup(void) struct segoff_s seabios, vgabios; u16 addr =3D PORT_SERIAL1; =20 + vgabios =3D GET_IVT(0x10); + seabios =3D FUNC16(entry_10); + if (vgabios.seg !=3D seabios.seg || + vgabios.offset !=3D seabios.offset) { + dprintf(1, "%s:%d: using splitmode (vgabios %04x:%04x, hook %04x:%= 04x)\n", + __func__, __LINE__, + vgabios.seg, vgabios.offset, + seabios.seg, seabios.offset); + sercon_real_vga_handler =3D vgabios; + SET_IVT(0x10, FUNC16(entry_sercon)); + SET_LOW(sercon_split, 1); + } + SET_LOW(sercon_port, addr); outb(0x03, addr + SEROFF_LCR); // 8N1 outb(0x01, addr + 0x02); // enable fifo diff --git a/src/romlayout.S b/src/romlayout.S index 89b3784d60..1c9d56df1b 100644 --- a/src/romlayout.S +++ b/src/romlayout.S @@ -414,6 +414,52 @@ __csm_return: popfw lretw =20 +// Serial console "hooked vga" entry point + DECLFUNC entry_sercon +entry_sercon: + // Setup for chain loading to real vga handler + pushfw + pushl %cs:sercon_real_vga_handler + + // Set %ds to varlow segment + cli + cld + pushw %ds + pushl %eax + movl $_zonelow_seg, %eax + movl %eax, %ds + + // Test if the sercon handler can be called + movl %esp, %eax // Test for broken x86emu + pushl $1f + retl +1: cmpl %esp, %eax + jne 4f + cmpb $0, sercon_enable // Test that sercon is enabled + je 3f + +2: popl %eax + popw %ds + pushl $sercon_10_splitmode +#if CONFIG_ENTRY_EXTRASTACK + jmp irqentry_arg_extrastack +#else + jmp irqentry_arg +#endif + + // sercon disabled - verify not 0x03 modeset and otherwise exit +3: popl %eax + cmpw $0x0003, %ax + jne 5f + pushl %eax + jmp 2b + + // Running on broken x86emu - restore stack and exit +4: movl %eax, %esp + popl %eax +5: popw %ds + iretw + =20 /**************************************************************** * Interrupt entry points --=20 2.9.3 _______________________________________________ SeaBIOS mailing list SeaBIOS@seabios.org https://mail.coreboot.org/mailman/listinfo/seabios From nobody Thu May 2 08:32:01 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 80.81.252.135 is neither permitted nor denied by domain of seabios.org) client-ip=80.81.252.135; envelope-from=seabios-bounces@seabios.org; helo=mail.coreboot.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 80.81.252.135 is neither permitted nor denied by domain of seabios.org) smtp.mailfrom=seabios-bounces@seabios.org Return-Path: Received: from mail.coreboot.org (mail.coreboot.org [80.81.252.135]) by mx.zohomail.com with SMTPS id 1504851551811577.3165540157073; Thu, 7 Sep 2017 23:19:11 -0700 (PDT) Received: from [127.0.0.1] (helo=ra.coreboot.org) by mail.coreboot.org with esmtp (Exim 4.86_2) (envelope-from ) id 1dqCcg-0002Va-De; Fri, 08 Sep 2017 08:18:38 +0200 Received: from mx1.redhat.com ([209.132.183.28]) by mail.coreboot.org with esmtps (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.86_2) (envelope-from ) id 1dqCcR-0002TJ-3v for seabios@seabios.org; Fri, 08 Sep 2017 08:18:32 +0200 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1CD36883A0 for ; Fri, 8 Sep 2017 06:18:38 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-117-175.ams2.redhat.com [10.36.117.175]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9844F600C0; Fri, 8 Sep 2017 06:18:35 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 197E942302; Fri, 8 Sep 2017 08:18:28 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 1CD36883A0 Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx02.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=kraxel@redhat.com From: Gerd Hoffmann To: seabios@seabios.org Date: Fri, 8 Sep 2017 08:18:28 +0200 Message-Id: <20170908061828.13732-7-kraxel@redhat.com> In-Reply-To: <20170908061828.13732-1-kraxel@redhat.com> References: <20170908061828.13732-1-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Fri, 08 Sep 2017 06:18:38 +0000 (UTC) X-Spam-Score: -8.0 (--------) Subject: [SeaBIOS] [PATCH 6/6] [hack] ignore sgabios, enable sercon instead X-BeenThere: seabios@seabios.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: SeaBIOS mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gerd Hoffmann MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: seabios-bounces@seabios.org Sender: "SeaBIOS" X-Duff: Orig. Duff, Duff Lite, Duff Dry, Duff Dark, Raspberry Duff, Lady Duff, Red Duff, Tartar Control Duff X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Temporary, for testing convinience. --- src/optionroms.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/optionroms.c b/src/optionroms.c index 76a70ea686..7b1bc141eb 100644 --- a/src/optionroms.c +++ b/src/optionroms.c @@ -23,7 +23,7 @@ #include "tcgbios.h" // tpm_* =20 static int EnforceChecksum, S3ResumeVga, RunPCIroms; - +static int sgabios; =20 /**************************************************************** * Helper functions @@ -193,6 +193,12 @@ run_file_roms(const char *prefix, int isvga, u64 *sour= ces) file =3D romfile_findprefix(prefix, file); if (!file) break; + if (strcmp(file->name, "vgaroms/sgabios.bin") =3D=3D 0) { + dprintf(1, "sgabios.bin found -> ignoring, enabling sercon ins= tead.\n"); + dprintf(1, "hint: use '-machine graphics=3Dno' instead of '-de= vice sga'.\n"); + sgabios++; + continue; + } struct rom_header *rom =3D deploy_romfile(file); if (rom) { setRomSource(sources, rom, (u32)file); @@ -434,7 +440,7 @@ vgarom_setup(void) =20 if (rom_get_last() =3D=3D BUILD_ROM_START) { // No VGA rom found - if (romfile_loadint("etc/sercon-enable", 0)) { + if (romfile_loadint("etc/sercon-enable", 0) || sgabios) { sercon_setup(); enable_vga_console(); } @@ -442,7 +448,7 @@ vgarom_setup(void) } =20 VgaROM =3D (void*)BUILD_ROM_START; - if (romfile_loadint("etc/sercon-enable", 0)) + if (romfile_loadint("etc/sercon-enable", 0) || sgabios) sercon_setup(); enable_vga_console(); } --=20 2.9.3 _______________________________________________ SeaBIOS mailing list SeaBIOS@seabios.org https://mail.coreboot.org/mailman/listinfo/seabios From nobody Thu May 2 08:32:01 2024 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 80.81.252.135 is neither permitted nor denied by domain of seabios.org) client-ip=80.81.252.135; envelope-from=seabios-bounces@seabios.org; helo=mail.coreboot.org; Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 80.81.252.135 is neither permitted nor denied by domain of seabios.org) smtp.mailfrom=seabios-bounces@seabios.org Return-Path: Received: from mail.coreboot.org (mail.coreboot.org [80.81.252.135]) by mx.zohomail.com with SMTPS id 15051287372841022.6562144870588; Mon, 11 Sep 2017 04:18:57 -0700 (PDT) Received: from [127.0.0.1] (helo=ra.coreboot.org) by mail.coreboot.org with esmtp (Exim 4.86_2) (envelope-from ) id 1drMjh-0005Er-TZ; Mon, 11 Sep 2017 13:18:42 +0200 Received: from mx1.redhat.com ([209.132.183.28]) by mail.coreboot.org with esmtps (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.86_2) (envelope-from ) id 1drMjX-0005EN-Hp for seabios@seabios.org; Mon, 11 Sep 2017 13:18:39 +0200 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id D5D2B16C380 for ; Mon, 11 Sep 2017 11:18:28 +0000 (UTC) Received: from sirius.home.kraxel.org (ovpn-117-175.ams2.redhat.com [10.36.117.175]) by smtp.corp.redhat.com (Postfix) with ESMTP id E37B25F906; Mon, 11 Sep 2017 11:18:24 +0000 (UTC) Received: by sirius.home.kraxel.org (Postfix, from userid 1000) id 003E9ECC; Mon, 11 Sep 2017 13:18:22 +0200 (CEST) DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com D5D2B16C380 Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=kraxel@redhat.com From: Gerd Hoffmann To: seabios@seabios.org Date: Mon, 11 Sep 2017 13:18:15 +0200 Message-Id: <20170911111816.30819-1-kraxel@redhat.com> In-Reply-To: <20170908061828.13732-1-kraxel@redhat.com> References: <20170908061828.13732-1-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Mon, 11 Sep 2017 11:18:28 +0000 (UTC) X-Spam-Score: -8.0 (--------) Subject: [SeaBIOS] [PATCH 7/6] sercon: use a single entry point X-BeenThere: seabios@seabios.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: SeaBIOS mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Gerd Hoffmann MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: seabios-bounces@seabios.org Sender: "SeaBIOS" X-Duff: Orig. Duff, Duff Lite, Duff Dry, Duff Dark, Raspberry Duff, Lady Duff, Red Duff, Tartar Control Duff X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" --- src/config.h | 1 - src/misc.c | 9 --------- src/sercon.c | 49 ++++++++++++++++++------------------------------- src/romlayout.S | 5 +++-- 4 files changed, 21 insertions(+), 43 deletions(-) diff --git a/src/config.h b/src/config.h index baca029f0e..93c8dbc2d5 100644 --- a/src/config.h +++ b/src/config.h @@ -76,7 +76,6 @@ #define DEBUG_ISR_08 20 #define DEBUG_ISR_09 9 #define DEBUG_ISR_0e 9 -#define DEBUG_HDL_10 20 #define DEBUG_HDL_11 2 #define DEBUG_HDL_12 2 #define DEBUG_HDL_13 10 diff --git a/src/misc.c b/src/misc.c index f4b656dd35..387a3482c9 100644 --- a/src/misc.c +++ b/src/misc.c @@ -52,15 +52,6 @@ handle_05(struct bregs *regs) debug_enter(regs, DEBUG_HDL_05); } =20 -// INT 10h Video Support Service Entry Point -void VISIBLE16 -handle_10(struct bregs *regs) -{ - debug_enter(regs, DEBUG_HDL_10); - // don't do anything, since the VGA BIOS handles int10h requests - sercon_10(regs); -} - // NMI handler void VISIBLE16 handle_02(void) diff --git a/src/sercon.c b/src/sercon.c index 5699905f32..9c49a2fc4c 100644 --- a/src/sercon.c +++ b/src/sercon.c @@ -325,10 +325,10 @@ static void sercon_1000(struct bregs *regs) SET_BDA(video_rows, rows-1); SET_BDA(cursor_type, 0x0007); } else { - SET_LOW(sercon_enable, (mode =3D=3D 0x03)); /* let vgabios handle mode init */ } =20 + SET_LOW(sercon_enable, (mode =3D=3D 0x03)); SET_LOW(sercon_col_last, 0); SET_LOW(sercon_row_last, 0); SET_LOW(sercon_attr_last, 0); @@ -470,40 +470,26 @@ sercon_10(struct bregs *regs) return; =20 switch (regs->ah) { - case 0x00: sercon_1000(regs); break; - case 0x01: sercon_1001(regs); break; - case 0x02: sercon_1002(regs); break; - case 0x03: sercon_1003(regs); break; - case 0x06: sercon_1006(regs); break; - case 0x08: sercon_1008(regs); break; - case 0x09: sercon_1009(regs); break; - case 0x0e: sercon_100e(regs); break; - case 0x0f: sercon_100f(regs); break; - case 0x4f: sercon_104f(regs); break; - default: sercon_10XX(regs); break; - } -} - -void VISIBLE16 -sercon_10_splitmode(struct bregs *regs) -{ - if (!CONFIG_SERCON) - return; - if (!GET_LOW(sercon_port)) - return; - - switch (regs->ah) { case 0x01: case 0x02: case 0x03: case 0x08: case 0x0f: - /* nothing, vgabios did all work */ - break; + if (sercon_splitmode()) + /* nothing, vgabios handles it */ + return; + } + + switch (regs->ah) { case 0x00: sercon_1000(regs); break; + case 0x01: sercon_1001(regs); break; + case 0x02: sercon_1002(regs); break; + case 0x03: sercon_1003(regs); break; case 0x06: sercon_1006(regs); break; + case 0x08: sercon_1008(regs); break; case 0x09: sercon_1009(regs); break; case 0x0e: sercon_100e(regs); break; + case 0x0f: sercon_100f(regs); break; case 0x4f: sercon_104f(regs); break; default: sercon_10XX(regs); break; } @@ -521,15 +507,16 @@ void sercon_setup(void) seabios =3D FUNC16(entry_10); if (vgabios.seg !=3D seabios.seg || vgabios.offset !=3D seabios.offset) { - dprintf(1, "%s:%d: using splitmode (vgabios %04x:%04x, hook %04x:%= 04x)\n", - __func__, __LINE__, - vgabios.seg, vgabios.offset, - seabios.seg, seabios.offset); + dprintf(1, "sercon: configuring in splitmode (vgabios %04x:%04x)\n= ", + vgabios.seg, vgabios.offset); sercon_real_vga_handler =3D vgabios; - SET_IVT(0x10, FUNC16(entry_sercon)); SET_LOW(sercon_split, 1); + } else { + dprintf(1, "sercon: configuring as primary display\n"); + sercon_real_vga_handler =3D seabios; } =20 + SET_IVT(0x10, FUNC16(entry_sercon)); SET_LOW(sercon_port, addr); outb(0x03, addr + SEROFF_LCR); // 8N1 outb(0x01, addr + 0x02); // enable fifo diff --git a/src/romlayout.S b/src/romlayout.S index 1c9d56df1b..911a416d7f 100644 --- a/src/romlayout.S +++ b/src/romlayout.S @@ -440,7 +440,7 @@ entry_sercon: =20 2: popl %eax popw %ds - pushl $sercon_10_splitmode + pushl $sercon_10 #if CONFIG_ENTRY_EXTRASTACK jmp irqentry_arg_extrastack #else @@ -643,7 +643,8 @@ entry_10_0x0f: iretw =20 ORG 0xf065 - IRQ_ENTRY_ARG 10 +entry_10: + iretw =20 // 0xf0a4 - VideoParams in misc.c =20 --=20 2.9.3 _______________________________________________ SeaBIOS mailing list SeaBIOS@seabios.org https://mail.coreboot.org/mailman/listinfo/seabios