Annotation of qemu/roms/sgabios/design.txt, revision 1.1.1.1

1.1       root        1: =============================================
                      2: Google Serial Graphics Adapter BIOS (SGABIOS)
                      3: 
                      4: Copyright 2007 Google Inc.
                      5: 
                      6: Licensed under the Apache License, Version 2.0 (the "License");
                      7: you may not use this file except in compliance with the License.
                      8: You may obtain a copy of the License at
                      9: 
                     10:      http://www.apache.org/licenses/LICENSE-2.0
                     11: 
                     12: Unless required by applicable law or agreed to in writing, software
                     13: distributed under the License is distributed on an "AS IS" BASIS,
                     14: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
                     15: See the License for the specific language governing permissions and
                     16: limitations under the License.
                     17: =============================================
                     18: Status: Implemented (as of 2007-08-08)
                     19: 
                     20: Nathan Laredo <[email protected]>
                     21: Modified: 2008-02-14 13:45 PDT
                     22: 
                     23: 
                     24: Objective
                     25: ---------
                     26: 
                     27: The Google Serial Graphics Adapter BIOS or SGABIOS provides a means
                     28: for legacy pc software to communicate with an attached serial console
                     29: as if a vga card is attached.
                     30: 
                     31: Background
                     32: ----------
                     33: 
                     34: The headless server problem
                     35: 
                     36: When building a lot of systems for data center use, it makes
                     37: no sense to install hardware that will rarely if ever be used.
                     38: Graphics adapters are not very useful even if they are installed
                     39: in a data center environment since often the person interested in
                     40: seeing the output is separated from the device by tens to thousands
                     41: of miles.
                     42: 
                     43: While it's possible to use remote management hardware that provides
                     44: a remotely accessible display and keyboard, this hardware is much
                     45: more expensive than the hardware that it replaces, and often this
                     46: hardware sends only images of the display rather than something
                     47: suitable for logging.
                     48: 
                     49: Since most systems already have a serial port, it's an obvious
                     50: target as a replacement for the primary display and keyboard.
                     51: The problem is that while an operating system like Linux can
                     52: support this arrangement, all of the output that would normally
                     53: appear on a graphics adapter before Linux boots is lost on modern
                     54: x86 hardware without modifications to the system firmware.
                     55: 
                     56: While some vendors provide firmware that enables the serial port to
                     57: be used as the primary display, this is usually a "premium" option
                     58: and isn't universally available for all x86 platforms.  Often such
                     59: services aren't implemented in a way that is friendly to saving logs
                     60: of boot activity.  One particularly ugly implementation might send
                     61: the same text hundreds of times as it tries to refresh the entire
                     62: display each timer tick.   Others have ansi control sequences
                     63: between every single character output which, while readable in a
                     64: terminal, is almost unusable when referring to serial log files.
                     65: Behavior like this slows down the serial output by up to fifteen
                     66: times in some cases, using sometimes that many extra characters
                     67: of control sequences for each character output.
                     68: 
                     69: The need for detailed system logs
                     70: 
                     71: None of the vendor-supplied serial redirection implementations
                     72: include facilities for logging boot message for later capture by
                     73: an operating system.  Being able to refer to the boot messages
                     74: after an operating system has loaded, or having a history of such
                     75: messages can be a useful debug, analysis, and management feature.
                     76: 
                     77: Even on systems with graphics adapters attached, once the display
                     78: is scrolled or refreshed with enough new text, the old messages
                     79: are only available in the user's own brain, which often isn't
                     80: very good at accurately recalling more than two or three items
                     81: that aren't grammatically meaningful in the user's native language.
                     82: 
                     83: Overview
                     84: ---------
                     85: SGABIOS is designed to be inserted into a bios as an option rom
                     86: to provide over a serial port the display and input capabilites
                     87: normally handled by a VGA adapter and a keyboard, and additionally
                     88: provide hooks for logging displayed characters for later collection
                     89: after an operating system boots.
                     90: 
                     91: It is designed to handle all text mode output sent to the legacy
                     92: bios int 10h service routine.  Int 10h is the most common method
                     93: for displaying characters in 16-bit legacy x86 code.
                     94: 
                     95: Occasionally some code may write directly to the vga memory in
                     96: the interest of "speed," and this output will be missed, but
                     97: it's rather uncommon for any code involved in booting a system
                     98: to be concerned with the speed of display output.  SGABIOS is not
                     99: designed to handle these cases since those applications that make
                    100: such assumptions generally write to an area of memory that typically
                    101: already in use for system management mode and unusable outside of
                    102: that mode.   Paging tricks could be used to capture such output,
                    103: but enabling paging requires protected mode to be enabled which
                    104: instantly breaks all segment loads in legacy 16-bit real- mode code
                    105: (which is the traditional boot environment).
                    106: 
                    107: Detailed Design
                    108: ----------------
                    109: 
                    110: VGA BIOS int 10h is hooked and chained to any existing handler or
                    111: the default handler that the BIOS previously setup.
                    112: 
                    113: During initialization, the option rom also probes the serial port
                    114: for reply from an attached terminal.  If the terminal replies to
                    115: a specific sequence, the terminal size is recorded and used for
                    116: all future display calculations.   If a VGA card is attached at
                    117: the same time, the width of the terminal is limited to 80 columns
                    118: in order to have sensible output on both the VGA card and on the
                    119: serial console.  If no reply comes from the serial terminal within
                    120: a very short timeout of about 8 milliseconds (or more accurately,
                    121: 65536 reads of the serial status port), a default size of 80x24
                    122: is used.  The detected size is displayed at the end of option rom
                    123: init to the serial console.
                    124: 
                    125: Because of the way the cursor is updated, if the cursor is never
                    126: moved upwards or more than one line down by int 10h calls, output
                    127: will still be appear completely appropriate for whatever sized
                    128: terminal is attached but failed to get detected.
                    129: 
                    130: Whenever int 10h is invoked, SGABIOS gets control first and decides
                    131: whether to act based on register state.   With the exception of
                    132: functions for getting current mode info or the current cursor
                    133: position, whether it acts or not, register state is ultimately
                    134: restored to the state on entry and a far jump is made to the
                    135: original handler.
                    136: 
                    137: SGABIOS maintains two active cursor positions.  One contains the
                    138: traditional VGA cursor position at the traditional location in
                    139: the BIOS Data Area, while the other maintains the position the
                    140: serial console's cursor is located.  The serial cursor position
                    141: is located in a BDA location that traditionally contains the
                    142: base io port address for LPT3, but since builtin printer ports are
                    143: disappearing over time, this location is reused. These two values
                    144: will often differ since serial terminal output will always move
                    145: the cursor to the next position on the screen while many VGA
                    146: operations don't update the cursor position at all, or some only
                    147: at the start of the string, but leave the old value at the end.
                    148: Keeping track of two active cursor positions means that SGABIOS
                    149: can collapse a string of "set cursor" calls into perhaps a single
                    150: one or none if the serial console cursor already happens to be at
                    151: the target location.    Cursor movements are further optimized
                    152: by sending newline characters to move the cursor down one row,
                    153: carriage return characters to move the cursor back to column 0,
                    154: and backspace characters to send the cursor back one or two spaces.
                    155: 
                    156: To avoid problems when a video card is connected, any Bios Data
                    157: Area location that would be updated by a VGA card is left alone
                    158: to be updated by the VGA card.  SGABIOS will update the cursor
                    159: position as usual, but just before chaining to an existing vga
                    160: card's handler, it will restore the values to those on entry,
                    161: and for those functions that return data, it will defer completely
                    162: to the chained routines rather than taking those over as it does
                    163: when no video card is detected.
                    164: 
                    165: Cursor position updates to serial console are deferred until the
                    166: next character of terminal output is available.   This collapses
                    167: the cases where the cursor is updated more than one time between
                    168: each character output (this is surprisingly common).
                    169: 
                    170: The goal of tracking the cursor so closely and minimizing the number
                    171: of characters required to update the cursor position is to both to
                    172: make the display of output as efficient and fast as possible and
                    173: to allow one to grep a raw log of serial console output for text
                    174: (which without such optimization may be impossible or extremely
                    175: difficult with movement escape sequences between every character).
                    176: 
                    177: In the same way cursor position is tracked, vga character attributes
                    178: are tracked so that it's possible to minimize the number of times
                    179: an attribute change escape sequence is sent to the serial console.
                    180: 
                    181: A BIOS Data Area location traditionally used for storing the
                    182: current palette value is used to store the last attribute sent to
                    183: the serial console.  As SGABIOS processes new calls, if the value
                    184: is the same, after masking off bright background colors which
                    185: aren't supported in ansi escape codes, then no attribute update
                    186: is sent to the serial console, else an escape sequence is sent
                    187: that gives the new background and foreground colors and whether
                    188: the foreground is bold or not.
                    189: 
                    190: Data communication
                    191: 
                    192: Whenever the call is made to output text, SGABIOS first updates
                    193: the serial terminal cursor to match the current position of
                    194: the vga cursor (if necessary), outputs any attribute change if
                    195: applicable to the particular int 10h call made, and finally sends
                    196: the text character (or characters) out to the serial port, and then
                    197: updates its own view of where the serial console cursor is located.
                    198: After the text is sent, a logging routine is called to store that
                    199: text in a private area of memory allocated at option rom init.
                    200: 
                    201: For keyboard/terminal input, SGABIOS hooks bios int 16h which is
                    202: typically called to poll for a keypress.  Before passing the call
                    203: along, SGABIOS looks for any pending input on the serial port and
                    204: stuffs the keyboard buffer with any pending byte after translating
                    205: it to a compatible keyboard scancode.   If the character received
                    206: is an escape, SGABIOS will continue to poll for up to four extra
                    207: characters of input for several milliseconds in order to detect
                    208: ANSI/VT100/xterm/etc cursor keys and function keys, looking up
                    209: appropriate scancodes in a table of escape sequences for all
                    210: known non-conflicting terminal types.
                    211: 
                    212: SGABIOS also hooks the serial port interrupts, and on receiving
                    213: an interrupt blocks out interrupts, calls the same polling
                    214: routines as above, following the same processing of multi-byte
                    215: input as well, stuffing the keyboard buffer as appropriate,
                    216: and finally acknowledging the interrupt and returning from the
                    217: handler. [ serial port interrupts are now DISABLED ]
                    218: 
                    219: Optionally the serial port input/output can be replaced with
                    220: a SMI trigger that calls into an EFI BIOS in order to tie into
                    221: its own console input and output routines rather than directly
                    222: hitting the serial port.   In this particular case it's assumed
                    223: that all logging is handled in the EFI module that will be called.
                    224: BIOS int 15h, ax = 0d042h is used to trigger SMI.  The parameters
                    225: passed will need to be changed to be specific to the EFI or SMI
                    226: handler put in place.   In the example in SMBIOS, for output,
                    227: ebx = 0xf00d0000 | (char << 8), and for input, ebx = 0xfeed0000,
                    228: with the character, if any, returned in the eax register with ZF
                    229: set and eax=0 if no character was available.
                    230: 
                    231: Summary of new enhancements
                    232: ---------------------------
                    233: SGABIOS now keeps a log of the last 256 characters written to
                    234: the screen and where they were written in the event an application
                    235: like lilo asks for the current character under the cursor.  These
                    236: are currently stored in a 1KB EBDA allocation which can be expanded
                    237: as needed.  This method avoids having to store a 64KB buffer for
                    238: the largest possible serial terminal supported (255x255).
                    239: 
                    240: When lilo 22.6 is detected, SGABIOS now knows how to disable
                    241: lilo's serial output in favor of its own.  This avoids having
                    242: double character output from both serial and VGABIOS interleaved.
                    243: 
                    244: Possible future enhancements
                    245: ----------------------------
                    246: Previous future ideas have now been implemented.
                    247: 
                    248: Known Bugs
                    249: ----------
                    250: With some versions of DOS, only the last character of every line
                    251: is displayed once dos boots since DOS will use direct access to
                    252: the VGA framebuffer until the end of line is reached, at which
                    253: point it will start using int 10h.  Dual cursor tracking might
                    254: fix this issue by maintaining positions for dos that look like
                    255: the end of line and another for internal use to know where to
                    256: output next.
                    257: 
                    258: Caveats
                    259: -------
                    260: It may be possible for someone to construct a terminal reply for
                    261: the terminal sizing code that is completely invalid and attempts
                    262: to either setup variables to overrun buffers or else overruns
                    263: the input buffer itself.   This situation is currently handled
                    264: by limiting the reply to between eight and fourteen characters
                    265: and ignoring any values outside the range from ten to two hundred
                    266: fifty-five for both the number of rows and the number of columns.
                    267: In these situations a default size of 80x24 is used (unless a
                    268: video card is present, in which case its size is used).   If the
                    269: resize code detects several unexpected characters during the
                    270: terminal size detection, it currently assumes that someone has
                    271: left a loopback device plugged into the serial port and redirects
                    272: the serial input and output to the fourth serial port at 0x2e8.
                    273: 
                    274: 
                    275: Security considerations
                    276: -----------------------
                    277: None.  This is already 16-bit real-mode x86 code.  The entire
                    278: system may be crashed or bent to do anyone's bidding at any time
                    279: by any other running code outside of SGABIOS.
                    280: 
                    281: 
                    282: Opensource Plan
                    283: ---------------
                    284: This source code was approved for release to the public for use under
                    285: the Apache License, Version 2.0 on http://code.google.com/p/sgabios
                    286: 
                    287: 
                    288: Document History
                    289: ----------------
                    290: Date           Author  Description
                    291: 2008-02-14     nil     fix for release
                    292: 2007-10-04     nil     new features
                    293: 2007-08-31     nil     sga+vga fixes
                    294: 2007-08-08     nil     Initial version
                    295: 
                    296: $Id$

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.