1 #include <string.h> 2 #include <stdio.h> 3 #include <lib/sys/vesa/vesa.h> 4 #include "sysdump.h" 5 6 void dump_vesa_tables(struct upload_backend *be) 7 { 8 com32sys_t rm; 9 struct vesa_info *vip; 10 struct vesa_general_info *gip, gi; 11 struct vesa_mode_info *mip, mi; 12 uint16_t mode, *mode_ptr; 13 char modefile[64]; 14 15 printf("Scanning VESA BIOS... "); 16 17 /* Allocate space in the bounce buffer for these structures */ 18 vip = lmalloc(sizeof *vip); 19 gip = &vip->gi; 20 mip = &vip->mi; 21 22 memset(&rm, 0, sizeof rm); 23 memset(gip, 0, sizeof *gip); 24 25 gip->signature = VBE2_MAGIC; /* Get VBE2 extended data */ 26 rm.eax.w[0] = 0x4F00; /* Get SVGA general information */ 27 rm.edi.w[0] = OFFS(gip); 28 rm.es = SEG(gip); 29 __intcall(0x10, &rm, &rm); 30 memcpy(&gi, gip, sizeof gi); 31 32 if (rm.eax.w[0] != 0x004F) 33 return; /* Function call failed */ 34 if (gi.signature != VESA_MAGIC) 35 return; /* No magic */ 36 37 cpio_mkdir(be, "vesa"); 38 39 cpio_writefile(be, "vesa/global.bin", &gi, sizeof gi); 40 41 mode_ptr = GET_PTR(gi.video_mode_ptr); 42 while ((mode = *mode_ptr++) != 0xFFFF) { 43 memset(mip, 0, sizeof *mip); 44 memset(&rm, 0, sizeof rm); 45 rm.eax.w[0] = 0x4F01; /* Get SVGA mode information */ 46 rm.ecx.w[0] = mode; 47 rm.edi.w[0] = OFFS(mip); 48 rm.es = SEG(mip); 49 __intcall(0x10, &rm, &rm); 50 51 /* Must be a supported mode */ 52 if (rm.eax.w[0] != 0x004f) 53 continue; 54 55 memcpy(&mi, mip, sizeof mi); 56 57 sprintf(modefile, "vesa/mode%04x.bin", mode); 58 cpio_writefile(be, modefile, &mi, sizeof mi); 59 } 60 61 lfree(vip); 62 printf("done.\n"); 63 } 64