[SeaBIOS] [PATCH v2 6/6] cbvga_set_mode: disable clearmem in windows x86 emulator.

Patrick Rudolph siro at das-labor.org
Fri Jun 22 17:21:33 CEST 2018


On Fri, 2018-06-22 at 10:14 -0400, Kevin O'Connor wrote:
> On Fri, Jun 22, 2018 at 08:42:50AM +0200, Gerd Hoffmann wrote:
> > On Wed, Jun 20, 2018 at 08:00:28PM +0200, Patrick Rudolph wrote:
> > > This commit breaks SeaBIOS' menu when used with coreboot's native
> > > graphic init in text mode. Payloads are not affacted (tested NTLDR and
> > > coreinfo).
> > > Everything works fine with native graphic init in high resolution
> > > framebuffer mode. I've got no debug log at hand, but I'll investigate
> > > asap.
> > > Tested on Lenovo T500 using libgfxinit with latest coreboot master.
> > 
> > Hmm, no clue what could cause this.  But clearing the memory is only
> > problematic for the framebuffer case, so maybe the patch below helps?
> > 
> > diff --git a/vgasrc/cbvga.c b/vgasrc/cbvga.c
> > index f6ebe71242..a48f4dc885 100644
> > --- a/vgasrc/cbvga.c
> > +++ b/vgasrc/cbvga.c
> > @@ -201,18 +201,20 @@ cbvga_set_mode(struct vgamode_s *vmode_g, int flags)
> >       */
> >      u8 extra_stack = GET_BDA_EXT(flags) & BF_EXTRA_STACK;
> >      MASK_BDA_EXT(flags, BF_EMULATE_TEXT, emul ? BF_EMULATE_TEXT : 0);
> > -    if (!(flags & MF_NOCLEARMEM) && extra_stack) {
> > +    if (!(flags & MF_NOCLEARMEM)) {
> >          if (GET_GLOBAL(CBmodeinfo.memmodel) == MM_TEXT) {
> >              memset16_far(SEG_CTEXT, (void*)0, 0x0720, 80*25*2);
> >              return 0;
> >          }
> > -        struct gfx_op op;
> > -        init_gfx_op(&op, &CBmodeinfo);
> > -        op.x = op.y = 0;
> > -        op.xlen = GET_GLOBAL(CBmodeinfo.width);
> > -        op.ylen = GET_GLOBAL(CBmodeinfo.height);
> > -        op.op = GO_MEMSET;
> > -        handle_gfx_op(&op);
> > +        if (extra_stack) {
> 
> I'm also not sure on the cause, but I think it should be safe to
> change this to:
> 
>     if (extra_stack || flags & MF_LEGACY) {
> 
Seems to be the correct solution, as BF_EXTRA_STACK is set after
cbvga_set_mode and thus extra_stack is 0 on first cbvga_set_mode call.

> because if this is a legacy call then it should be safe to write to
> highmem even if the last call was a vesa modeset.
> 
> -Kevin



More information about the SeaBIOS mailing list