On 11.06.2012 22:10, stuart_ha...@dell.com wrote:

>>
>> It looks like the problem is that we set video mode. Other than that we
>> do only mmap iterating and allocating the memory in question. How about
>> this patch (not tested):
>> === modified file 'grub-core/loader/i386/linux.c'
>> --- grub-core/loader/i386/linux.c    2012-05-31 12:06:11 +0000
>> +++ grub-core/loader/i386/linux.c    2012-06-11 19:27:48 +0000
>> @@ -383,6 +383,103 @@
>>    grub_size_t real_size, mmap_size;
>>    grub_size_t cl_offset;
>>
>> +  modevar = grub_env_get ("gfxpayload");
>> +
>> +  /* Now all graphical modes are acceptable.
>> +     May change in future if we have modes without framebuffer.  */
>> +  if (modevar && *modevar != 0)
>> +    {
>> +      tmp = grub_xasprintf ("%s;" DEFAULT_VIDEO_MODE, modevar);
>> +      if (! tmp)
>> +    return grub_errno;
>> +#if ACCEPTS_PURE_TEXT
>> +      err = grub_video_set_mode (tmp, 0, 0); #else
>> +      err = grub_video_set_mode (tmp, GRUB_VIDEO_MODE_TYPE_PURE_TEXT,
>> +0); #endif
>> +      grub_free (tmp);
>> +    }
>> +  else
>> +    {
>> +#if ACCEPTS_PURE_TEXT
>> +      err = grub_video_set_mode (DEFAULT_VIDEO_MODE, 0, 0); #else
>> +      err = grub_video_set_mode (DEFAULT_VIDEO_MODE,
>> +                             GRUB_VIDEO_MODE_TYPE_PURE_TEXT, 0); #endif
>> +    }
>> +  if (err)
>> +    {
>> +      grub_print_error ();
>> +      grub_puts_ (N_("Booting in blind mode"));
>> +      grub_errno = GRUB_ERR_NONE;
>> +    }
>> +
>> +#ifdef GRUB_MACHINE_IEEE1275
>> +  {
>> +    const char *bootpath;
>> +    grub_ssize_t len;
>> +
>> +    bootpath = grub_env_get ("root");
>> +    if (bootpath)
>> +      grub_ieee1275_set_property (grub_ieee1275_chosen,
>> +                              "bootpath", bootpath,
>> +                              grub_strlen (bootpath) + 1,
>> +                              &len);
>> +  }
>> +#endif
>> +
>> +  if (grub_linux_setup_video (&linux_params))
>> +    {
>> +#if defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_COREBOOT)
>> || defined (GRUB_MACHINE_QEMU)
>> +      linux_params.have_vga = GRUB_VIDEO_LINUX_TYPE_TEXT;
>> +      linux_params.video_mode = 0x3;
>> +#else
>> +      linux_params.have_vga = 0;
>> +      linux_params.video_mode = 0;
>> +      linux_params.video_width = 0;
>> +      linux_params.video_height = 0;
>> +#endif
>> +    }
>> +
>> +  /* Initialize these last, because terminal position could be
>> affected
>> +by printfs above.  */ #ifndef GRUB_MACHINE_IEEE1275
>> +  if (linux_params.have_vga == GRUB_VIDEO_LINUX_TYPE_TEXT) #endif
>> +    {
>> +      grub_term_output_t term;
>> +      int found = 0;
>> +      FOR_ACTIVE_TERM_OUTPUTS(term)
>> +    if (grub_strcmp (term->name, "vga_text") == 0
>> +        || grub_strcmp (term->name, "console") == 0
>> +        || grub_strcmp (term->name, "ofconsole") == 0)
>> +      {
>> +        grub_uint16_t pos = grub_term_getxy (term);
>> +        linux_params.video_cursor_x = pos >> 8;
>> +        linux_params.video_cursor_y = pos & 0xff;
>> +        linux_params.video_width = grub_term_width (term);
>> +        linux_params.video_height = grub_term_height (term);
>> +        found = 1;
>> +        break;
>> +      }
>> +      if (!found)
>> +    {
>> +      linux_params.video_cursor_x = 0;
>> +      linux_params.video_cursor_y = 0;
>> +      linux_params.video_width = 80;
>> +      linux_params.video_height = 25;
>> +    }
>> +    }
>> +
>> +#ifdef GRUB_MACHINE_IEEE1275
>> +  {
>> +    linux_params.ofw_signature = GRUB_LINUX_OFW_SIGNATURE;
>> +    linux_params.ofw_num_items = 1;
>> +    linux_params.ofw_cif_handler = (grub_uint32_t)
>> grub_ieee1275_entry_fn;
>> +    linux_params.ofw_idt = 0;
>> +  }
>> +#endif
>> +
>>    mmap_size = find_mmap_size ();
>>    /* Make sure that each size is aligned to a page boundary.  */
>>    cl_offset = ALIGN_UP (mmap_size + sizeof (*params), 4096); @@ -
>> 466,20 +563,6 @@
>>    grub_memcpy ((char *) params + cl_offset, linux_cmdline,
>>             maximal_cmdline_size);
>>
>> -#ifdef GRUB_MACHINE_IEEE1275
>> -  {
>> -    const char *bootpath;
>> -    grub_ssize_t len;
>> -
>> -    bootpath = grub_env_get ("root");
>> -    if (bootpath)
>> -      grub_ieee1275_set_property (grub_ieee1275_chosen,
>> -                              "bootpath", bootpath,
>> -                              grub_strlen (bootpath) + 1,
>> -                              &len);
>> -  }
>> -#endif
>> -
>>    grub_dprintf ("linux", "code32_start = %x\n",
>>              (unsigned) params->code32_start);
>>
>> @@ -522,89 +605,6 @@
>>      return grub_errno;
>>    params->mmap_size = e820_num;
>>
>> -  modevar = grub_env_get ("gfxpayload");
>> -
>> -  /* Now all graphical modes are acceptable.
>> -     May change in future if we have modes without framebuffer.  */
>> -  if (modevar && *modevar != 0)
>> -    {
>> -      tmp = grub_xasprintf ("%s;" DEFAULT_VIDEO_MODE, modevar);
>> -      if (! tmp)
>> -    return grub_errno;
>> -#if ACCEPTS_PURE_TEXT
>> -      err = grub_video_set_mode (tmp, 0, 0);
>> -#else
>> -      err = grub_video_set_mode (tmp, GRUB_VIDEO_MODE_TYPE_PURE_TEXT,
>> 0);
>> -#endif
>> -      grub_free (tmp);
>> -    }
>> -  else
>> -    {
>> -#if ACCEPTS_PURE_TEXT
>> -      err = grub_video_set_mode (DEFAULT_VIDEO_MODE, 0, 0);
>> -#else
>> -      err = grub_video_set_mode (DEFAULT_VIDEO_MODE,
>> -                             GRUB_VIDEO_MODE_TYPE_PURE_TEXT, 0);
>> -#endif
>> -    }
>> -  if (err)
>> -    {
>> -      grub_print_error ();
>> -      grub_puts_ (N_("Booting in blind mode"));
>> -      grub_errno = GRUB_ERR_NONE;
>> -    }
>> -
>> -  if (grub_linux_setup_video (params))
>> -    {
>> -#if defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_COREBOOT)
>> || defined (GRUB_MACHINE_QEMU)
>> -      params->have_vga = GRUB_VIDEO_LINUX_TYPE_TEXT;
>> -      params->video_mode = 0x3;
>> -#else
>> -      params->have_vga = 0;
>> -      params->video_mode = 0;
>> -      params->video_width = 0;
>> -      params->video_height = 0;
>> -#endif
>> -    }
>> -
>> -  /* Initialize these last, because terminal position could be
>> affected by printfs above.  */ -#ifndef GRUB_MACHINE_IEEE1275
>> -  if (params->have_vga == GRUB_VIDEO_LINUX_TYPE_TEXT) -#endif
>> -    {
>> -      grub_term_output_t term;
>> -      int found = 0;
>> -      FOR_ACTIVE_TERM_OUTPUTS(term)
>> -    if (grub_strcmp (term->name, "vga_text") == 0
>> -        || grub_strcmp (term->name, "console") == 0
>> -        || grub_strcmp (term->name, "ofconsole") == 0)
>> -      {
>> -        grub_uint16_t pos = grub_term_getxy (term);
>> -        params->video_cursor_x = pos >> 8;
>> -        params->video_cursor_y = pos & 0xff;
>> -        params->video_width = grub_term_width (term);
>> -        params->video_height = grub_term_height (term);
>> -        found = 1;
>> -        break;
>> -      }
>> -      if (!found)
>> -    {
>> -      params->video_cursor_x = 0;
>> -      params->video_cursor_y = 0;
>> -      params->video_width = 80;
>> -      params->video_height = 25;
>> -    }
>> -    }
>> -
>> -#ifdef GRUB_MACHINE_IEEE1275
>> -  {
>> -    params->ofw_signature = GRUB_LINUX_OFW_SIGNATURE;
>> -    params->ofw_num_items = 1;
>> -    params->ofw_cif_handler = (grub_uint32_t) grub_ieee1275_entry_fn;
>> -    params->ofw_idt = 0;
>> -  }
>> -#endif
>> -
>>  #ifdef GRUB_MACHINE_EFI
>>    {
>>      grub_efi_uintn_t efi_desc_size;
>>
>>
> 
> Grub crashed with a GPF (13) when I tried to boot with that patch.
> 

There was a bug in that patch. Try this one please.

> 
> _______________________________________________
> Bug-grub mailing list
> Bug-grub@gnu.org
> https://lists.gnu.org/mailman/listinfo/bug-grub
> 



-- 
Regards
Vladimir 'φ-coder/phcoder' Serbinenko
=== modified file 'grub-core/loader/i386/linux.c'
--- grub-core/loader/i386/linux.c	2012-05-31 12:06:11 +0000
+++ grub-core/loader/i386/linux.c	2012-06-15 21:16:39 +0000
@@ -372,7 +372,6 @@
 static grub_err_t
 grub_linux_boot (void)
 {
-  struct linux_kernel_params *params;
   int e820_num;
   grub_err_t err = 0;
   const char *modevar;
@@ -383,11 +382,104 @@
   grub_size_t real_size, mmap_size;
   grub_size_t cl_offset;
 
+#ifdef GRUB_MACHINE_IEEE1275
+  {
+    const char *bootpath;
+    grub_ssize_t len;
+
+    bootpath = grub_env_get ("root");
+    if (bootpath)
+      grub_ieee1275_set_property (grub_ieee1275_chosen,
+				  "bootpath", bootpath,
+				  grub_strlen (bootpath) + 1,
+				  &len);
+    linux_params.ofw_signature = GRUB_LINUX_OFW_SIGNATURE;
+    linux_params.ofw_num_items = 1;
+    linux_params.ofw_cif_handler = (grub_uint32_t) grub_ieee1275_entry_fn;
+    linux_params.ofw_idt = 0;
+  }
+#endif
+
+  modevar = grub_env_get ("gfxpayload");
+
+  /* Now all graphical modes are acceptable.
+     May change in future if we have modes without framebuffer.  */
+  if (modevar && *modevar != 0)
+    {
+      tmp = grub_xasprintf ("%s;" DEFAULT_VIDEO_MODE, modevar);
+      if (! tmp)
+	return grub_errno;
+#if ACCEPTS_PURE_TEXT
+      err = grub_video_set_mode (tmp, 0, 0);
+#else
+      err = grub_video_set_mode (tmp, GRUB_VIDEO_MODE_TYPE_PURE_TEXT, 0);
+#endif
+      grub_free (tmp);
+    }
+  else
+    {
+#if ACCEPTS_PURE_TEXT
+      err = grub_video_set_mode (DEFAULT_VIDEO_MODE, 0, 0);
+#else
+      err = grub_video_set_mode (DEFAULT_VIDEO_MODE,
+				 GRUB_VIDEO_MODE_TYPE_PURE_TEXT, 0);
+#endif
+    }
+
+  if (err)
+    {
+      grub_print_error ();
+      grub_puts_ (N_("Booting in blind mode"));
+      grub_errno = GRUB_ERR_NONE;
+    }
+
+  if (grub_linux_setup_video (&linux_params))
+    {
+#if defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_COREBOOT) || defined (GRUB_MACHINE_QEMU)
+      linux_params.have_vga = GRUB_VIDEO_LINUX_TYPE_TEXT;
+      linux_params.video_mode = 0x3;
+#else
+      linux_params.have_vga = 0;
+      linux_params.video_mode = 0;
+      linux_params.video_width = 0;
+      linux_params.video_height = 0;
+#endif
+    }
+
+
+#ifndef GRUB_MACHINE_IEEE1275
+  if (linux_params.have_vga == GRUB_VIDEO_LINUX_TYPE_TEXT)
+#endif
+    {
+      grub_term_output_t term;
+      int found = 0;
+      FOR_ACTIVE_TERM_OUTPUTS(term)
+	if (grub_strcmp (term->name, "vga_text") == 0
+	    || grub_strcmp (term->name, "console") == 0
+	    || grub_strcmp (term->name, "ofconsole") == 0)
+	  {
+	    grub_uint16_t pos = grub_term_getxy (term);
+	    linux_params.video_cursor_x = pos >> 8;
+	    linux_params.video_cursor_y = pos & 0xff;
+	    linux_params.video_width = grub_term_width (term);
+	    linux_params.video_height = grub_term_height (term);
+	    found = 1;
+	    break;
+	  }
+      if (!found)
+	{
+	  linux_params.video_cursor_x = 0;
+	  linux_params.video_cursor_y = 0;
+	  linux_params.video_width = 80;
+	  linux_params.video_height = 25;
+	}
+    }
+
   mmap_size = find_mmap_size ();
   /* Make sure that each size is aligned to a page boundary.  */
-  cl_offset = ALIGN_UP (mmap_size + sizeof (*params), 4096);
-  if (cl_offset < ((grub_size_t) params->setup_sects << GRUB_DISK_SECTOR_BITS))
-    cl_offset = ALIGN_UP ((grub_size_t) (params->setup_sects
+  cl_offset = ALIGN_UP (mmap_size + sizeof (linux_params), 4096);
+  if (cl_offset < ((grub_size_t) linux_params.setup_sects << GRUB_DISK_SECTOR_BITS))
+    cl_offset = ALIGN_UP ((grub_size_t) (linux_params.setup_sects
 					 << GRUB_DISK_SECTOR_BITS), 4096);
   real_size = ALIGN_UP (cl_offset + maximal_cmdline_size, 4096);
 
@@ -459,6 +551,9 @@
 
   grub_dprintf ("linux", "real_mode_mem = %lx\n",
                 (unsigned long) real_mode_mem);
+
+  struct linux_kernel_params *params;
+
   params = real_mode_mem;
 
   *params = linux_params;
@@ -466,20 +561,6 @@
   grub_memcpy ((char *) params + cl_offset, linux_cmdline,
 	       maximal_cmdline_size);
 
-#ifdef GRUB_MACHINE_IEEE1275
-  {
-    const char *bootpath;
-    grub_ssize_t len;
-
-    bootpath = grub_env_get ("root");
-    if (bootpath)
-      grub_ieee1275_set_property (grub_ieee1275_chosen,
-				  "bootpath", bootpath,
-				  grub_strlen (bootpath) + 1,
-				  &len);
-  }
-#endif
-
   grub_dprintf ("linux", "code32_start = %x\n",
 		(unsigned) params->code32_start);
 
@@ -522,89 +603,6 @@
     return grub_errno;
   params->mmap_size = e820_num;
 
-  modevar = grub_env_get ("gfxpayload");
-
-  /* Now all graphical modes are acceptable.
-     May change in future if we have modes without framebuffer.  */
-  if (modevar && *modevar != 0)
-    {
-      tmp = grub_xasprintf ("%s;" DEFAULT_VIDEO_MODE, modevar);
-      if (! tmp)
-	return grub_errno;
-#if ACCEPTS_PURE_TEXT
-      err = grub_video_set_mode (tmp, 0, 0);
-#else
-      err = grub_video_set_mode (tmp, GRUB_VIDEO_MODE_TYPE_PURE_TEXT, 0);
-#endif
-      grub_free (tmp);
-    }
-  else
-    {
-#if ACCEPTS_PURE_TEXT
-      err = grub_video_set_mode (DEFAULT_VIDEO_MODE, 0, 0);
-#else
-      err = grub_video_set_mode (DEFAULT_VIDEO_MODE,
-				 GRUB_VIDEO_MODE_TYPE_PURE_TEXT, 0);
-#endif
-    }
-  if (err)
-    {
-      grub_print_error ();
-      grub_puts_ (N_("Booting in blind mode"));
-      grub_errno = GRUB_ERR_NONE;
-    }
-
-  if (grub_linux_setup_video (params))
-    {
-#if defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_COREBOOT) || defined (GRUB_MACHINE_QEMU)
-      params->have_vga = GRUB_VIDEO_LINUX_TYPE_TEXT;
-      params->video_mode = 0x3;
-#else
-      params->have_vga = 0;
-      params->video_mode = 0;
-      params->video_width = 0;
-      params->video_height = 0;
-#endif
-    }
-
-  /* Initialize these last, because terminal position could be affected by printfs above.  */
-#ifndef GRUB_MACHINE_IEEE1275
-  if (params->have_vga == GRUB_VIDEO_LINUX_TYPE_TEXT)
-#endif
-    {
-      grub_term_output_t term;
-      int found = 0;
-      FOR_ACTIVE_TERM_OUTPUTS(term)
-	if (grub_strcmp (term->name, "vga_text") == 0
-	    || grub_strcmp (term->name, "console") == 0
-	    || grub_strcmp (term->name, "ofconsole") == 0)
-	  {
-	    grub_uint16_t pos = grub_term_getxy (term);
-	    params->video_cursor_x = pos >> 8;
-	    params->video_cursor_y = pos & 0xff;
-	    params->video_width = grub_term_width (term);
-	    params->video_height = grub_term_height (term);
-	    found = 1;
-	    break;
-	  }
-      if (!found)
-	{
-	  params->video_cursor_x = 0;
-	  params->video_cursor_y = 0;
-	  params->video_width = 80;
-	  params->video_height = 25;
-	}
-    }
-
-#ifdef GRUB_MACHINE_IEEE1275
-  {
-    params->ofw_signature = GRUB_LINUX_OFW_SIGNATURE;
-    params->ofw_num_items = 1;
-    params->ofw_cif_handler = (grub_uint32_t) grub_ieee1275_entry_fn;
-    params->ofw_idt = 0;
-  }
-#endif
-
 #ifdef GRUB_MACHINE_EFI
   {
     grub_efi_uintn_t efi_desc_size;

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Bug-grub mailing list
Bug-grub@gnu.org
https://lists.gnu.org/mailman/listinfo/bug-grub

Reply via email to