Hi,
as per Kevin`s suggestion, I am posting initialization log (mixed one)
from initialization of the GeodeLX board. As it could be clearly seen
from the log, VGA option ROM was never called and executed during the
initialization sequence, therefore issue with a lack of video output
during SeaBIOS stage on this board looks somehow logical. [1] suggests
that the problem existed long before, as most users of these boards
are Alix owners who do not care about existence of the video output :)
[1]. https://www.coreboot.org/pipermail/seabios/2012February/003186.html
The original "lgpl vgabios" had a special case for dh==0xff in its
int1013 (write string) code. There does not appear to be any VGABIOS
documentation supporting this as an externally available feature. It
appears this was for its own internal use when writing its strings to
the screen. SeaVGABIOS doesn't use this hack; this patch removes it
from the code.
Signedoffby: Kevin O'Connor <kevin(a)koconnor.net>

vgasrc/vgabios.c  8 +
1 file changed, 1 insertion(+), 7 deletions()
diff git a/vgasrc/vgabios.c b/vgasrc/vgabios.c
index f07e85b..8b50192 100644
 a/vgasrc/vgabios.c
+++ b/vgasrc/vgabios.c
@@ 1030,13 +1030,7 @@ handle_1012(struct bregs *regs)
static void noinline
handle_1013(struct bregs *regs)
{
 struct cursorpos cp;
 if (regs>dh == 0xff)
 // if row=0xff special case : use current cursor position
 cp = get_cursor_pos(regs>bh);
 else
 cp = (struct cursorpos) {regs>dl, regs>dh, regs>bh};

+ struct cursorpos cp = {regs>dl, regs>dh, regs>bh};
u16 count = regs>cx;
u8 *offset_far = (void*)(regs>bp + 0);
u8 attr = regs>bl;

2.5.5
On Tue, Jul 05, 2016 at 11:23:36PM +0200, Idwer Vollering wrote:
> 20160705 15:49 GMT+02:00 Roger Pau Monné <roger.pau(a)citrix.com>:
> > Hello,
> >
> > I'm seeing the following issue when building SeaBIOS with gcc > 4.8:
> >
>
> (..)
>
> >
> > This works fine when using gcc 4.8, but fails in the same way with gcc 5.4.
> > The assembler version used is:
> >
> > GNU assembler version 2.25.1 (x86_64portbldfreebsd11.0) using BFD version (GNU Binutils) 2.25.1
> >
> > What causes this issue seems to be the usage of the "m16" gcc flag, which
> > was introduced in gcc 4.9 AFAICT. The following workaround solves the issue,
> > but I would like to know if anyone else has seen this with newer gcc
> > versions, or if the gcc version from FreeBSD ports is broken.
>
> Are you experiencing issues on hardware too? As in: coreboot.rom for
> the mainboard asus/f2a85m built on FreeBSD 11.0ALPHA5 r302302,
> without gcc installed from 'pkg', with the coreboot crossgcc toolchain
> will not boot.
Oh, I'm sorry but I've never used coreboot (or SeaBIOS) on real hardware, I
only use it for Xen, so I cannot provide much feedback. All I can say is
that SeaBIOS compiled with gcc 4.8 from FreeBSD ports works fine inside of
Xen VMs.
Roger.
Hello,
I'm seeing the following issue when building SeaBIOS with gcc > 4.8:
Compiling whole program out/ccode32flat.o
Compiling whole program out/code32seg.o
Compiling whole program out/ccode16.o
/tmp//ccecsJuF.s: Assembler messages:
/tmp//ccecsJuF.s:539: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:545: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:966: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:1484: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:1813: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:1922: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:2626: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:2632: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:2793: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:3050: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:3056: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:3387: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:3649: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:3829: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:4111: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:4620: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:4626: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:5538: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:5544: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:6140: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:6146: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:7186: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:7192: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:7376: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:7382: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:7732: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:7799: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:7805: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:8001: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:8007: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:8932: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:10170: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:10176: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:10919: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:10925: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:11315: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:11321: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:11824: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:11830: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:12337: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:12343: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:12523: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:12647: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:12653: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:13019: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:13535: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:13671: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:13677: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:14363: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:14369: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:14862: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:14962: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:14968: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:15297: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:15303: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:15854: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:15860: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:16243: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:16249: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:16445: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:16451: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:16814: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:16820: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:17392: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:17503: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:17613: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:17706: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:17712: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:18306: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:18312: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:18450: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:18456: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:18802: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:18808: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:19122: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:19128: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:19372: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:19378: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:19692: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:19698: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:20491: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:20497: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:20603: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:20609: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:21003: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:21009: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:21658: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:21958: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:22162: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:22633: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:22848: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:22854: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:24399: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:24405: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:25008: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:25014: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:25412: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:26448: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:26454: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:27363: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:27597: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:27686: Error: register save offset not a multiple of 8
/tmp//ccecsJuF.s:27692: Error: register save offset not a multiple of 8
Makefile:154: recipe for target 'out/ccode16.o' failed
gmake: *** [out/ccode16.o] Error 1
This works fine when using gcc 4.8, but fails in the same way with gcc 5.4.
The assembler version used is:
GNU assembler version 2.25.1 (x86_64portbldfreebsd11.0) using BFD version (GNU Binutils) 2.25.1
What causes this issue seems to be the usage of the "m16" gcc flag, which
was introduced in gcc 4.9 AFAICT. The following workaround solves the issue,
but I would like to know if anyone else has seen this with newer gcc
versions, or if the gcc version from FreeBSD ports is broken.
Thanks, Roger.

diff git a/Makefile b/Makefile
index 4930b3a..19a1e7d 100644
 a/Makefile
+++ b/Makefile
@@ 73,8 +73,7 @@ CFLAGSSEG := $(COMMONCFLAGS) DMODESEGMENT=1
fnodeferpop \
$(call ccoption,$(CC),fnojumptables,DMANUAL_NO_JUMP_TABLE) \
$(call ccoption,$(CC),fnotreeswitchconversion,)
CFLAGS32SEG := $(CFLAGSSEG) DMODE16=0
CFLAGS16 := $(CFLAGSSEG) DMODE16=1 \
 $(call ccoption,$(CC),m16,Wa$(COMMA)src/code16gcc.s) \
+CFLAGS16 := $(CFLAGSSEG) DMODE16=1 Wa$(COMMA)src/code16gcc.s \
$(call ccoption,$(CC),param largestackframe=4,fnoinline)
# Run with "make V=1" to see the actual compile commands
Hi,
Next round of patches. Changes:
* Moved it all to a new sercon.c file.
* Code maps cp437 to utf8 now, giving a much nicer display. Compare
"Use the ↑ and ↓ keys to change the selection." (this series) with
"Use the ^ and v keys to change the selection." (sgabios) ;)
* Simplified keyboard code, using enqueue_key now.
* Restructed code, to cleanup things and to address review comments.
cheers,
Gerd
Gerd Hoffmann (3):
std: add cp437 to unicode map
kbd: make enqueue_key public, add ascii_to_keycode
add serial console support
Makefile  2 +
src/clock.c  1 +
src/kbd.c  17 +
src/misc.c  2 +
src/optionroms.c  4 +
src/sercon.c  545 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/std/cp437.h  258 ++++++++++++++++++++++++++
src/util.h  5 +
8 files changed, 831 insertions(+), 3 deletions()
create mode 100644 src/sercon.c
create mode 100644 src/std/cp437.h

1.8.3.1
Hi,
Ok folks, finally took the time to put serial console support into
seabios natively, without requiring sgabios. For now this will use the
first serial port in case no vgabios was found, i.e. use something along
the lines of "qemu vga none serial stdio" to check it out.
Design goal is to print as few control sequences as possible, so you
get readable logs when writing serial output to a file, but still allow
enough control that boot loader menus etc. can be used interactively.
The patches reached the first milestone now, you can boot into grub2
and use the builtin editor. And unlike sgabios it will not go crazy in
case you try to move around the cursor quickly by holding down keys and
let autorepeat kick in. ipxe command line editor worked too on a quick
test.
known issues / todo list:
* isolinux/pxelinux seems to have trouble with this.
* add support for sending output to both vga and serial.
* add compile time config option.
* add runtime config option.
* figure reasonable plan for transition from sgabios.
enjoy,
Gerd
Gerd Hoffmann (2):
serial console, output
serial console, input
src/clock.c  1 +
src/misc.c  2 +
src/optionroms.c  4 +
src/serial.c  595 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/util.h  3 +
5 files changed, 604 insertions(+), 1 deletion()

1.8.3.1