grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] Multiboot video support


From: Vladimir 'φ-coder/phcoder' Serbinenko
Subject: Re: [PATCH] Multiboot video support
Date: Fri, 15 Jan 2010 16:44:50 +0100
User-agent: Mozilla-Thunderbird 2.0.0.22 (X11/20091109)

Vladimir 'phi-coder/phcoder' Serbinenko wrote:
> Added EGA text support
>   
Non-VBE parts reviewed and comitted. Resending VBE parts.
>
>   


-- 
Regards
Vladimir 'φ-coder/phcoder' Serbinenko

=== added file 'ChangeLog.mbivid'
--- ChangeLog.mbivid    1970-01-01 00:00:00 +0000
+++ ChangeLog.mbivid    2010-01-15 15:35:51 +0000
@@ -0,0 +1,9 @@
+2010-01-14  Vladimir Serbinenko  <address@hidden>
+
+       VBE multiboot support.
+
+       * loader/i386/multiboot_mbi.c (HAS_VBE): New constant.
+       (grub_multiboot_get_mbi_size) [HAS_VBE]: Account for VBE structures.
+       (grub_multiboot_make_mbi) [HAS_VBE]: Likewise.
+       (fill_vbe_info) [HAS_VBE]: New function.
+       (retrieve_video_parameters) [HAS_VBE]: Call fill_vbe_info.

=== modified file 'loader/i386/multiboot.c'
--- loader/i386/multiboot.c     2010-01-15 15:30:57 +0000
+++ loader/i386/multiboot.c     2010-01-15 15:31:45 +0000
@@ -20,7 +20,6 @@
 /*
  *  FIXME: The following features from the Multiboot specification still
  *         need to be implemented:
- *  - VBE support
  *  - symbol table
  *  - drives table
  *  - ROM configuration table

=== modified file 'loader/i386/multiboot_mbi.c'
--- loader/i386/multiboot_mbi.c 2010-01-15 15:30:57 +0000
+++ loader/i386/multiboot_mbi.c 2010-01-15 15:32:50 +0000
@@ -35,9 +35,11 @@
 #include <grub/i386/pc/vbe.h>
 #define DEFAULT_VIDEO_MODE "text"
 #define HAS_VGA_TEXT 1
+#define HAS_VBE 1
 #else
 #define DEFAULT_VIDEO_MODE "auto"
 #define HAS_VGA_TEXT 0
+#define HAS_VBE 0
 #endif
 
 struct module
@@ -91,6 +93,10 @@
   return sizeof (struct multiboot_info) + ALIGN_UP (cmdline_size, 4)
     + modcnt * sizeof (struct multiboot_mod_list) + total_modcmd
     + ALIGN_UP (sizeof(PACKAGE_STRING), 4) + grub_get_multiboot_mmap_len ()
+#if HAS_VBE
+    + sizeof (struct grub_vbe_info_block)
+    + sizeof (struct grub_vbe_mode_info_block)
+#endif
     + 256 * sizeof (struct multiboot_color);
 }
 
@@ -153,6 +159,78 @@
   return err;
 }
 
+#if HAS_VBE
+static grub_err_t
+fill_vbe_info (struct multiboot_info *mbi, grub_uint8_t *ptrorig,
+              grub_uint32_t ptrdest, int fill_generic)
+{
+  grub_vbe_status_t status;
+  grub_uint32_t vbe_mode;
+  void *scratch = (void *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR;
+  struct grub_vbe_mode_info_block *mode_info;
+    
+  status = grub_vbe_bios_get_controller_info (scratch);
+  if (status != GRUB_VBE_STATUS_OK)
+    return grub_error (GRUB_ERR_IO, "Can't get controller info.");
+  
+  mbi->vbe_control_info = ptrdest;
+  grub_memcpy (ptrorig, scratch, sizeof (struct grub_vbe_info_block));
+  ptrorig += sizeof (struct grub_vbe_info_block);
+  ptrdest += sizeof (struct grub_vbe_info_block);
+  
+  status = grub_vbe_bios_get_mode (scratch);
+  vbe_mode = *(grub_uint32_t *) scratch;
+  if (status != GRUB_VBE_STATUS_OK)
+    return grub_error (GRUB_ERR_IO, "can't get VBE mode");
+  mbi->vbe_mode = vbe_mode;
+
+  mode_info = (struct grub_vbe_mode_info_block *) ptrorig;
+  mbi->vbe_mode_info = ptrdest;
+  /* get_mode_info isn't available for mode 3.  */
+  if (vbe_mode == 3)
+    {
+      grub_memset (mode_info, 0, sizeof (struct grub_vbe_mode_info_block));
+      mode_info->memory_model = GRUB_VBE_MEMORY_MODEL_TEXT;
+      mode_info->x_resolution = 80;
+      mode_info->y_resolution = 25;
+    }
+  else
+    {
+      status = grub_vbe_bios_get_mode_info (vbe_mode, scratch);
+      if (status != GRUB_VBE_STATUS_OK)
+       return grub_error (GRUB_ERR_IO, "can't get mode info");
+      grub_memcpy (mode_info, scratch,
+                  sizeof (struct grub_vbe_mode_info_block));
+    }
+  ptrorig += sizeof (struct grub_vbe_mode_info_block);
+  ptrdest += sizeof (struct grub_vbe_mode_info_block);
+      
+  /* FIXME: retrieve those.  */
+  mbi->vbe_interface_seg = 0;
+  mbi->vbe_interface_off = 0;
+  mbi->vbe_interface_len = 0;
+  
+  mbi->flags |= MULTIBOOT_INFO_VBE_INFO;
+
+  if (fill_generic && mode_info->memory_model == GRUB_VBE_MEMORY_MODEL_TEXT)
+    {
+      mbi->framebuffer_addr = 0xb8000;
+
+      mbi->framebuffer_pitch = 2 * mode_info->x_resolution;    
+      mbi->framebuffer_width = mode_info->x_resolution;
+      mbi->framebuffer_height = mode_info->y_resolution;
+
+      mbi->framebuffer_bpp = 16;
+
+      mbi->framebuffer_type = MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT;
+
+      mbi->flags |= MULTIBOOT_INFO_FRAMEBUFFER_INFO;
+    }
+
+  return GRUB_ERR_NONE;
+}
+#endif
+
 static grub_err_t
 retrieve_video_parameters (struct multiboot_info *mbi,
                           grub_uint8_t *ptrorig, grub_uint32_t ptrdest)
@@ -173,8 +251,13 @@
   grub_video_get_palette (0, ARRAY_SIZE (palette), palette);
 
   driv_id = grub_video_get_driver_id ();
+#if HAS_VGA_TEXT
+  if (driv_id == GRUB_VIDEO_DRIVER_NONE)
+    return fill_vbe_info (mbi, ptrorig, ptrdest, 1);
+#else
   if (driv_id == GRUB_VIDEO_DRIVER_NONE)
     return GRUB_ERR_NONE;
+#endif
 
   err = grub_video_get_info_and_fini (&mode_info, &framebuffer);
   if (err)
@@ -222,6 +305,11 @@
 
   mbi->flags |= MULTIBOOT_INFO_FRAMEBUFFER_INFO;
 
+#if HAS_VBE
+  if (driv_id == GRUB_VIDEO_DRIVER_VBE)
+    return fill_vbe_info (mbi, ptrorig, ptrdest, 0);
+#endif
+
   return GRUB_ERR_NONE;
 }
 
@@ -308,6 +396,12 @@
       grub_print_error ();
       grub_errno = GRUB_ERR_NONE;
     }
+#if HAS_VBE
+  ptrorig += sizeof (struct grub_vbe_info_block);
+  ptrdest += sizeof (struct grub_vbe_info_block);
+  ptrorig += sizeof (struct grub_vbe_mode_info_block);
+  ptrdest += sizeof (struct grub_vbe_mode_info_block);
+#endif
 
   return GRUB_ERR_NONE;
 }

Attachment: signature.asc
Description: OpenPGP digital signature


reply via email to

[Prev in Thread] Current Thread [Next in Thread]