mirror of
https://git.savannah.gnu.org/git/grub.git
synced 2026-10-21 06:49:35 +00:00
2009-09-12 Robert Millan <rmh.grub@aybabtu.com>
* video/i386/pc/vbe.c (grub_vbe_get_video_mode_info): Move packed
mode special handling (grub_vbe_bios_set_dac_palette_width() call)
from here ...
* loader/i386/linux.c [GRUB_MACHINE_PCBIOS]
(grub_linux_setup_video): ... to here (with some adjustments).
This commit is contained in:
1 parent
5c9f8d8427
commit
6122955707
3 files changed
+36
-18
No files matched your search
@@ -1,3 +1,11 @@
|
|||||||
|
2009-09-12 Robert Millan <rmh.grub@aybabtu.com>
|
||||||
|
|
||||||
|
* video/i386/pc/vbe.c (grub_vbe_get_video_mode_info): Move packed
|
||||||
|
mode special handling (grub_vbe_bios_set_dac_palette_width() call)
|
||||||
|
from here ...
|
||||||
|
* loader/i386/linux.c [GRUB_MACHINE_PCBIOS]
|
||||||
|
(grub_linux_setup_video): ... to here (with some adjustments).
|
||||||
|
|
||||||
2009-09-12 Robert Millan <rmh.grub@aybabtu.com>
|
2009-09-12 Robert Millan <rmh.grub@aybabtu.com>
|
||||||
|
|
||||||
Fix memory corruption issue (spotted by Colin Watson).
|
Fix memory corruption issue (spotted by Colin Watson).
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
#include <grub/video.h>
|
#include <grub/video.h>
|
||||||
#include <grub/video_fb.h>
|
#include <grub/video_fb.h>
|
||||||
#include <grub/command.h>
|
#include <grub/command.h>
|
||||||
|
#include <grub/i386/pc/vbe.h>
|
||||||
|
|
||||||
#define GRUB_LINUX_CL_OFFSET 0x1000
|
#define GRUB_LINUX_CL_OFFSET 0x1000
|
||||||
#define GRUB_LINUX_CL_END_OFFSET 0x2000
|
#define GRUB_LINUX_CL_END_OFFSET 0x2000
|
||||||
@@ -416,6 +417,33 @@ grub_linux_setup_video (struct linux_kernel_params *params)
|
|||||||
params->reserved_mask_size = mode_info.reserved_mask_size;
|
params->reserved_mask_size = mode_info.reserved_mask_size;
|
||||||
params->reserved_field_pos = mode_info.reserved_field_pos;
|
params->reserved_field_pos = mode_info.reserved_field_pos;
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef GRUB_MACHINE_PCBIOS
|
||||||
|
/* VESA packed modes may come with zeroed mask sizes, which need
|
||||||
|
to be set here according to DAC Palette width. If we don't,
|
||||||
|
this results in Linux displaying a black screen. */
|
||||||
|
if (mode_info.bpp <= 8)
|
||||||
|
{
|
||||||
|
struct grub_vbe_info_block controller_info;
|
||||||
|
int status;
|
||||||
|
int width = 8;
|
||||||
|
|
||||||
|
status = grub_vbe_bios_get_controller_info (&controller_info);
|
||||||
|
|
||||||
|
if (status == GRUB_VBE_STATUS_OK &&
|
||||||
|
(controller_info.capabilities & GRUB_VBE_CAPABILITY_DACWIDTH))
|
||||||
|
status = grub_vbe_bios_set_dac_palette_width (&width);
|
||||||
|
|
||||||
|
if (status != GRUB_VBE_STATUS_OK)
|
||||||
|
/* 6 is default after mode reset. */
|
||||||
|
width = 6;
|
||||||
|
|
||||||
|
params->red_mask_size = params->green_mask_size
|
||||||
|
= params->blue_mask_size = width;
|
||||||
|
params->reserved_mask_size = 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -286,24 +286,6 @@ grub_vbe_get_video_mode_info (grub_uint32_t mode,
|
|||||||
|
|
||||||
/* Make copy of mode info block. */
|
/* Make copy of mode info block. */
|
||||||
grub_memcpy (mode_info, mi_tmp, sizeof (*mode_info));
|
grub_memcpy (mode_info, mi_tmp, sizeof (*mode_info));
|
||||||
|
|
||||||
/* Packed mode. Query DAC Palette width for color sizes. */
|
|
||||||
if (mode_info->bits_per_pixel <= 8)
|
|
||||||
{
|
|
||||||
int width = 8;
|
|
||||||
status = 0;
|
|
||||||
|
|
||||||
if (controller_info.capabilities & GRUB_VBE_CAPABILITY_DACWIDTH)
|
|
||||||
status = grub_vbe_bios_set_dac_palette_width (& width);
|
|
||||||
|
|
||||||
if (status != GRUB_VBE_STATUS_OK)
|
|
||||||
/* 6 is default after mode reset. */
|
|
||||||
width = 6;
|
|
||||||
|
|
||||||
mode_info->red_mask_size = mode_info->green_mask_size
|
|
||||||
= mode_info->blue_mask_size = width;
|
|
||||||
mode_info->rsvd_mask_size = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
/* Just clear mode info block if it isn't a VESA mode. */
|
/* Just clear mode info block if it isn't a VESA mode. */
|
||||||
|
|||||||
Reference in new issue
Block a user