Please try this one.

-- 
Robert Millan

  The DRM opt-in fallacy: "Your data belongs to us. We will decide when (and
  how) you may access your data; but nobody's threatening your freedom: we
  still allow you to remove your data and not access it at all."
Index: kern/i386/pc/startup.S
===================================================================
--- kern/i386/pc/startup.S	(revision 2439)
+++ kern/i386/pc/startup.S	(working copy)
@@ -1733,6 +1733,49 @@
 	ret
 
 /*
+ * grub_vbe_status_t grub_vbe_bios_getset_dac_palette_width (int set, int *dac_mask_size)
+ *
+ * Register allocations for parameters:
+ * %eax		set
+ * %edx		*dac_mask_size
+ */
+FUNCTION(grub_vbe_bios_getset_dac_palette_width)
+	pushl	%ebp
+	pushl	%ebx
+
+	xorl	%ebx, %ebx
+
+	testl	%eax, %eax
+	jne	1f
+	incb	%bl
+1:
+
+	movl	(%edx), %eax
+	movb	%al, %bh
+
+	call    prot_to_real
+	.code16
+
+	movw	$0x4f08, %ax
+	int	$0x10
+
+	movw	%ax, %dx	/* real_to_prot destroys %eax.  */
+
+	DATA32 call	real_to_prot
+	.code32
+
+	movb	%bh, %al
+	movl	%eax, (%edx)
+
+	/* Return value in %eax.  */
+	xorl	%eax, %eax
+	movw	%dx, %ax
+
+	popl	%ebx
+	popl	%ebp
+	ret
+
+/*
  * grub_vbe_status_t grub_vbe_bios_set_memory_window (grub_uint32_t window,
  *						      grub_uint32_t position);
  *
Index: video/i386/pc/vbe.c
===================================================================
--- video/i386/pc/vbe.c	(revision 2439)
+++ video/i386/pc/vbe.c	(working copy)
@@ -300,6 +300,23 @@
 
       /* Make copy of mode info block.  */
       grub_memcpy (mode_info, mi_tmp, sizeof (*mode_info));
+
+      if (mode_info->bits_per_pixel <= 8)
+	{
+	  int width = 8;
+	  status = 0;
+
+	  if (controller_info.capabilities & 0x00000001)
+	    status = grub_vbe_bios_set_dac_palette_width (& width);
+
+	  if (status != 0x004F)
+	    /* 6 is default after mode reset.  */
+	    width = 6;
+
+	  mode_info->red_mask_size = mode_info->green_mask_size
+	    = mode_info->blue_mask_size = mode_info->rsvd_mask_size
+	    = width;
+	}
     }
   else
     /* Just clear mode info block if it isn't a VESA mode.  */
Index: include/grub/i386/pc/vbe.h
===================================================================
--- include/grub/i386/pc/vbe.h	(revision 2439)
+++ include/grub/i386/pc/vbe.h	(working copy)
@@ -181,6 +181,11 @@
 grub_vbe_status_t EXPORT_FUNC(grub_vbe_bios_get_mode_info) (grub_uint32_t mode,
                                                             struct grub_vbe_mode_info_block *mode_info);
 
+grub_vbe_status_t EXPORT_FUNC(grub_vbe_bios_getset_dac_palette_width) (int set, int *width);
+
+#define grub_vbe_bios_get_dac_palette_width(width)	grub_vbe_bios_getset_dac_palette_width(0, (width))
+#define grub_vbe_bios_set_dac_palette_width(width)	grub_vbe_bios_getset_dac_palette_width(1, (width))
+
 /* Call VESA BIOS 0x4f02 to set video mode, return status.  */
 grub_vbe_status_t EXPORT_FUNC(grub_vbe_bios_set_mode) (grub_uint32_t mode,
                                                        struct grub_vbe_crtc_info_block *crtc_info);

Reply via email to