=== modified file 'commands/i386/pc/vbeinfo.c' --- commands/i386/pc/vbeinfo.c 2007-07-21 22:32:33 +0000 +++ commands/i386/pc/vbeinfo.c 2008-08-31 16:26:53 +0000 @@ -26,6 +26,31 @@ #include #include +/* Bits from the VBE "mode_attributes" field in the mode info struct. */ +#define VBE_MODEATTR_SUPPORTED (1 << 0) +#define VBE_MODEATTR_RESERVED_1 (1 << 1) +#define VBE_MODEATTR_BIOS_TTY_OUTPUT_SUPPORT (1 << 2) +#define VBE_MODEATTR_COLOR (1 << 3) +#define VBE_MODEATTR_GRAPHICS (1 << 4) +#define VBE_MODEATTR_VGA_COMPATIBLE (1 << 5) +#define VBE_MODEATTR_VGA_WINDOWED_AVAIL (1 << 6) +#define VBE_MODEATTR_LINEAR_FB_AVAIL (1 << 7) +#define VBE_MODEATTR_DOUBLE_SCAN_AVAIL (1 << 8) +#define VBE_MODEATTR_INTERLACED_AVAIL (1 << 9) +#define VBE_MODEATTR_TRIPLE_BUF_AVAIL (1 << 10) +#define VBE_MODEATTR_STEREO_AVAIL (1 << 11) +#define VBE_MODEATTR_DUAL_DISPLAY_START (1 << 12) + +/* Values for the VBE memory_model field in the mode info struct. */ +#define VBE_MODE_MEMORY_MODEL_TEXT 0x00 +#define VBE_MODE_MEMORY_MODEL_CGA 0x01 +#define VBE_MODE_MEMORY_MODEL_HERCULES 0x02 +#define VBE_MODE_MEMORY_MODEL_PLANAR 0x03 +#define VBE_MODE_MEMORY_MODEL_PACKED_PIXEL 0x04 +#define VBE_MODE_MEMORY_MODEL_NONCHAIN4_256 0x05 +#define VBE_MODE_MEMORY_MODEL_DIRECT_COLOR 0x06 +#define VBE_MODE_MEMORY_MODEL_YUV 0x07 + static void * real2pm (grub_vbe_farptr_t ptr) { @@ -48,12 +73,19 @@ grub_err_t err; char *modevar; - grub_printf ("List of compatible video modes:\n"); - err = grub_vbe_probe (&controller_info); if (err != GRUB_ERR_NONE) return err; + grub_printf ("VBE info: version: %d.%d OEM software rev: %d.%d\n", + controller_info.version >> 8, + controller_info.version & 0xFF, + controller_info.oem_software_rev >> 8, + controller_info.oem_software_rev & 0xFF); + /* The total_memory field is in 64 KiB units. */ + grub_printf (" total memory: %d KiB\n", + (controller_info.total_memory << 16) / 1024); + /* Because the information on video modes is stored in a temporary place, it is better to copy it to somewhere safe. */ p = video_mode_list = real2pm (controller_info.video_mode_ptr); @@ -67,6 +99,10 @@ grub_memcpy (saved_video_mode_list, video_mode_list, video_mode_list_size); + grub_printf ("List of compatible video modes:\n"); + grub_printf ("Legend: P=Packed pixel, D=Direct color, " + "mask/pos=R/G/B/reserved\n"); + /* Walk through all video modes listed. */ for (p = saved_video_mode_list; *p != 0xFFFF; p++) { @@ -80,33 +116,33 @@ continue; } - if ((mode_info_tmp.mode_attributes & 0x001) == 0) + if ((mode_info_tmp.mode_attributes & VBE_MODEATTR_SUPPORTED) == 0) /* If not available, skip it. */ continue; - if ((mode_info_tmp.mode_attributes & 0x002) == 0) + if ((mode_info_tmp.mode_attributes & VBE_MODEATTR_RESERVED_1) == 0) /* Not enough information. */ continue; - if ((mode_info_tmp.mode_attributes & 0x008) == 0) + if ((mode_info_tmp.mode_attributes & VBE_MODEATTR_COLOR) == 0) /* Monochrome is unusable. */ continue; - if ((mode_info_tmp.mode_attributes & 0x080) == 0) + if ((mode_info_tmp.mode_attributes & VBE_MODEATTR_LINEAR_FB_AVAIL) == 0) /* We support only linear frame buffer modes. */ continue; - if ((mode_info_tmp.mode_attributes & 0x010) == 0) + if ((mode_info_tmp.mode_attributes & VBE_MODEATTR_GRAPHICS) == 0) /* We allow only graphical modes. */ continue; switch (mode_info_tmp.memory_model) { - case 0x04: - memory_model = "Packed Pixel"; + case VBE_MODE_MEMORY_MODEL_PACKED_PIXEL: + memory_model = "Packed"; break; - case 0x06: - memory_model = "Direct Color"; + case VBE_MODE_MEMORY_MODEL_DIRECT_COLOR: + memory_model = "Direct"; break; default: @@ -116,12 +152,23 @@ if (! memory_model) continue; - grub_printf ("0x%03x: %d x %d x %d bpp (%s)\n", - mode, + grub_printf ("0x%03x: %4d x %4d x %2d %s", + mode, mode_info_tmp.x_resolution, mode_info_tmp.y_resolution, mode_info_tmp.bits_per_pixel, - memory_model); + memory_model); + if (memory_model[0] == 'D') + grub_printf (", mask: %d/%d/%d/%d pos: %d/%d/%d/%d", + mode_info_tmp.red_mask_size, + mode_info_tmp.green_mask_size, + mode_info_tmp.blue_mask_size, + mode_info_tmp.rsvd_mask_size, + mode_info_tmp.red_field_position, + mode_info_tmp.green_field_position, + mode_info_tmp.blue_field_position, + mode_info_tmp.rsvd_field_position); + grub_printf ("\n"); } grub_free (saved_video_mode_list);