
Hi Heinrich,
On Tue, 30 Jul 2019 at 14:52, Heinrich Schuchardt xypron.glpk@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@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