#include <string.h> #include <stdio.h> #include <lib/sys/vesa/vesa.h> #include "sysdump.h" void dump_vesa_tables(struct upload_backend *be) { com32sys_t rm; struct vesa_info *vip; struct vesa_general_info *gip, gi; struct vesa_mode_info *mip, mi; uint16_t mode, *mode_ptr; char modefile[64]; printf("Scanning VESA BIOS... "); /* Allocate space in the bounce buffer for these structures */ vip = lmalloc(sizeof *vip); gip = &vip->gi; mip = &vip->mi; memset(&rm, 0, sizeof rm); memset(gip, 0, sizeof *gip); gip->signature = VBE2_MAGIC; /* Get VBE2 extended data */ rm.eax.w[0] = 0x4F00; /* Get SVGA general information */ rm.edi.w[0] = OFFS(gip); rm.es = SEG(gip); __intcall(0x10, &rm, &rm); memcpy(&gi, gip, sizeof gi); if (rm.eax.w[0] != 0x004F) return; /* Function call failed */ if (gi.signature != VESA_MAGIC) return; /* No magic */ cpio_mkdir(be, "vesa"); cpio_writefile(be, "vesa/global.bin", &gi, sizeof gi); mode_ptr = GET_PTR(gi.video_mode_ptr); while ((mode = *mode_ptr++) != 0xFFFF) { memset(mip, 0, sizeof *mip); memset(&rm, 0, sizeof rm); rm.eax.w[0] = 0x4F01; /* Get SVGA mode information */ rm.ecx.w[0] = mode; rm.edi.w[0] = OFFS(mip); rm.es = SEG(mip); __intcall(0x10, &rm, &rm); /* Must be a supported mode */ if (rm.eax.w[0] != 0x004f) continue; memcpy(&mi, mip, sizeof mi); sprintf(modefile, "vesa/mode%04x.bin", mode); cpio_writefile(be, modefile, &mi, sizeof mi); } lfree(vip); printf("done.\n"); }