[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