[e16e8f2] | 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 | } |
---|