[SeaBIOS] [PATCH 0/3] SeaVGABIOS serial console test

Kevin O'Connor kevin at koconnor.net
Tue Sep 5 05:01:29 CEST 2017


On Mon, Sep 04, 2017 at 04:02:08PM +0200, Gerd Hoffmann wrote:
> > I was thinking a few instructions to test if calll worked would be
> > sufficient to catch the x86emu case - something like:
> > 
> >   pushl $0xffffffff
> >   calll 1f
> > 1:popl %eax
> >   cmpl %eax, $1b
> >   jne running_on_broken_x86emu
> 
> Ok, finally picked this up again.
> 
> Rebased the branch, added a patch for x86emu detection.
> https://www.kraxel.org/cgit/seabios/log/?h=serial
> 
> --- a/src/romlayout.S
> +++ b/src/romlayout.S
> @@ -531,12 +531,31 @@ entry_10_hooked:
>          pushfw
>          pushl %cs:sercon_int10_hook_resume
>  
> +       // Detect broken x86emu versions
> +       pushl %eax
> +       pushl %ebx
> +       pushl $0xffffffff
> +       calll 1f
> +1:     popl %eax
> +       movl $1b, %ebx
> +       cmpl %eax, %ebx
> +       jne running_on_broken_x86emu
> +       popl %ebx  // $0xffffffff
> +       popl %ebx
> +       popl %eax
> +
>          pushl $sercon_10_splitmode
>  #if CONFIG_ENTRY_EXTRASTACK
>          jmp irqentry_arg_extrastack
>  #else
>          jmp irqentry_arg
>  #endif
> +running_on_broken_x86emu:
> +       popw %bx
> +       popl %ebx
> +       popl %eax
> +       // skip sercon code, jump straight to vgabios
> +       iretw
>  
>          // int 18/19 are special - they reset stack and call into
> 32bit mode.
>          DECLFUNC entry_19
> 
> How is x86emu broken?  I'm assuming it ignores the prefix for call, so
> it'll push a 16bit return address instead of a 32bit return address to
> the stack?

I think so.  Might be safer to save/restore %esp though.  This
sequence might be simpler:

        pushl %eax
        movl %esp, %eax
        pushl $1f
        retl
1:      cmpl %esp, %eax
        jne broken_x86emu
        popl %eax

...

broken_x86emu:
        movl %eax, %esp
        popl %eax
        iretw

Note, though, in addition to checking for broken x86emu, the assembler
entry code would also have to check that the last mode was not set via
a vesa call (to avoid the "skifree" bug).

-Kevin



More information about the SeaBIOS mailing list