3f0f0330f24731f1e3e963c174913c195713f329
[bootcensus] / src / vbe.c
1 #include <stdio.h>
2 #include <string.h>
3 #include <inttypes.h>
4 #include "vbe.h"
5 #include "asmops.h"
6 #include "int86.h"
7
8 #define SEG_ADDR(s)     ((uint32_t)(s) << 4)
9
10 #define MODE_LFB        (1 << 14)
11
12 extern unsigned char low_mem_buffer[];
13
14 struct vbe_info *vbe_get_info(void)
15 {
16         struct vbe_info *info;
17         struct int86regs regs;
18
19         info = (struct vbe_info*)low_mem_buffer;
20
21         memcpy(info->sig, "VBE2", 4);
22
23         memset(&regs, 0, sizeof regs);
24         regs.es = (uint32_t)info >> 4;
25         regs.eax = 0x4f00;
26         int86(0x10, &regs);
27
28         if((regs.eax & 0xffff) != 0x4f) {
29                 return 0;
30         }
31
32         return info;
33 }
34
35 struct vbe_mode_info *vbe_get_mode_info(int mode)
36 {
37         struct vbe_mode_info *mi;
38         struct int86regs regs;
39
40         mi = (struct vbe_mode_info*)(low_mem_buffer + 512);
41
42         memset(&regs, 0, sizeof regs);
43         regs.es = (uint32_t)mi >> 4;
44         regs.eax = 0x4f01;
45         regs.ecx = mode;
46         int86(0x10, &regs);
47
48         if((regs.eax & 0xffff) != 0x4f) {
49                 return 0;
50         }
51
52         return mi;
53 }
54
55 int vbe_set_mode(int mode)
56 {
57         struct int86regs regs;
58
59         memset(&regs, 0, sizeof regs);
60         regs.eax = 0x4f02;
61         regs.ebx = mode;
62         int86(0x10, &regs);
63
64         if(regs.eax == 0x100) {
65                 return -1;
66         }
67         return 0;
68 }
69
70 void print_mode_info(struct vbe_mode_info *mi)
71 {
72         static unsigned int maskbits[] = {0, 1, 3, 7, 0xf, 0x1f, 0x3f, 0x7f, 0xff};
73
74         printf("resolution: %dx%d\n", mi->xres, mi->yres);
75         printf("color depth: %d\n", mi->bpp);
76         printf("mode attributes: %x\n", mi->mode_attr);
77         printf("bytes per scanline: %d\n", mi->scanline_bytes);
78         printf("number of planes: %d\n", (int)mi->num_planes);
79         printf("number of banks: %d\n", (int)mi->num_banks);
80         printf("mem model: %d\n", (int)mi->mem_model);
81         printf("red bits: %d (mask: %x)\n", (int)mi->rmask_size, maskbits[mi->rmask_size] << mi->rpos);
82         printf("green bits: %d (mask: %x)\n", (int)mi->gmask_size, maskbits[mi->gmask_size] << mi->gpos);
83         printf("blue bits: %d (mask: %x)\n", (int)mi->bmask_size, maskbits[mi->bmask_size] << mi->bpos);
84         printf("framebuffer address: %x\n", (unsigned int)mi->fb_addr);
85 }