[U-Boot] [PATCH 05/10] bios_emulator: Add some VESA interface debugging

Simon Glass sjg at chromium.org
Thu Aug 1 16:51:44 UTC 2019


Hi Heinrich,

On Tue, 30 Jul 2019 at 14:52, Heinrich Schuchardt <xypron.glpk at gmx.de> wrote:
>
> On 12/30/14 3:32 AM, Simon Glass wrote:
> > Allow the supported modes to be listed when in debug mode.
> >
> > Signed-off-by: Simon Glass <sjg at chromium.org>
> > ---
> >
> >   drivers/bios_emulator/atibios.c | 161 +++++++++++++++++++++++++++++++++++-----
> >   include/vbe.h                   |   9 ++-
> >   2 files changed, 148 insertions(+), 22 deletions(-)
> >
> > diff --git a/drivers/bios_emulator/atibios.c b/drivers/bios_emulator/atibios.c
> > index 93b815c..7ea5fa6 100644
> > --- a/drivers/bios_emulator/atibios.c
> > +++ b/drivers/bios_emulator/atibios.c
> > @@ -62,40 +62,158 @@ static u32 saveBaseAddress14;
> >   static u32 saveBaseAddress18;
> >   static u32 saveBaseAddress20;
> >
> > -static void atibios_set_vesa_mode(RMREGS *regs, int vesa_mode,
> > -                               struct vbe_mode_info *mode_info)
> > +/* Addres im memory of VBE region */
> > +const int vbe_offset = 0x2000;
> > +
> > +static const void *bios_ptr(const void *buf, BE_VGAInfo *vga_info,
> > +                         u32 x86_dword_ptr)
> > +{
> > +     u32 seg_ofs, flat;
> > +
> > +     seg_ofs = le32_to_cpu(x86_dword_ptr);
> > +     flat = ((seg_ofs & 0xffff0000) >> 12) | (seg_ofs & 0xffff);
> > +     if (flat >= 0xc0000)
> > +             return vga_info->BIOSImage + flat - 0xc0000;
> > +     else
> > +             return buf + (flat - vbe_offset);
> > +}
> > +
> > +static int atibios_debug_mode(BE_VGAInfo *vga_info, RMREGS *regs,
> > +                           int vesa_mode, struct vbe_mode_info *mode_info)
> > +{
> > +     void *buffer = (void *)(M.mem_base + vbe_offset);
> > +     u16 buffer_seg = (((unsigned long)vbe_offset) >> 4) & 0xff00;
> > +     u16 buffer_adr = ((unsigned long)vbe_offset) & 0xffff;
> > +     struct vesa_mode_info *vm;
> > +     struct vbe_info *info;
> > +     const u16 *modes_bios, *ptr;
> > +     u16 *modes;
> > +     int size;
> > +
> > +     debug("VBE: Getting information\n");
> > +     regs->e.eax = VESA_GET_INFO;
> > +     regs->e.esi = buffer_seg;
> > +     regs->e.edi = buffer_adr;
> > +     info = buffer;
> > +     memset(info, '\0', sizeof(*info));
> > +     strcpy(info->signature, "VBE2");
> > +     BE_int86(0x10, regs, regs);
> > +     if (regs->e.eax != 0x4f) {
> > +             debug("VESA_GET_INFO: error %x\n", regs->e.eax);
> > +             return -ENOSYS;
> > +     }
> > +     debug("version %x\n", le16_to_cpu(info->version));
> > +     debug("oem '%s'\n", (char *)bios_ptr(buffer, vga_info,
> > +                                          info->oem_string_ptr));
> > +     debug("vendor '%s'\n", (char *)bios_ptr(buffer, vga_info,
> > +                                             info->vendor_name_ptr));
> > +     debug("product '%s'\n", (char *)bios_ptr(buffer, vga_info,
> > +                                              info->product_name_ptr));
> > +     debug("rev '%s'\n", (char *)bios_ptr(buffer, vga_info,
> > +                                          info->product_rev_ptr));
> > +     modes_bios = bios_ptr(buffer, vga_info, info->modes_ptr);
> > +     debug("Modes: ");
> > +     for (ptr = modes_bios; *ptr != 0xffff; ptr++)
> > +             debug("%x ", le16_to_cpu(*ptr));
> > +     debug("\nmemory %dMB\n", le16_to_cpu(info->total_memory) >> 4);
> > +     size = (ptr - modes_bios) * sizeof(u16) + 2;
> > +     modes = malloc(size);
> > +     if (!modes)
> > +             return -ENOMEM;
> > +     memcpy(modes, modes_bios, size);
> > +
> > +     regs->e.eax = VESA_GET_CUR_MODE;
> > +     BE_int86(0x10, regs, regs);
> > +     if (regs->e.eax != 0x4f) {
> > +             debug("VESA_GET_CUR_MODE: error %x\n", regs->e.eax);
> > +             return -ENOSYS;
> > +     }
> > +     debug("Current mode %x\n", regs->e.ebx);
> > +
> > +     for (ptr = modes; *ptr != 0xffff; ptr++) {
> > +             int mode = le16_to_cpu(*ptr);
> > +             bool linear_ok;
> > +             int attr;
> > +
> > +             break;
>
> There is a lot of dead code following. Has this break been left over
> from debugging? Or should the whole loop be eliminated?

Yes the break should be removed. This is debug code for printing out the modes.

Regards,
Simon


More information about the U-Boot mailing list