• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <string.h>
2 #include <stdio.h>
3 #include <lib/sys/vesa/vesa.h>
4 #include "sysdump.h"
5 
dump_vesa_tables(struct upload_backend * be)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