~ubuntu-branches/ubuntu/wily/grub2/wily

« back to all changes in this revision

Viewing changes to grub-core/loader/i386/linux.c

  • Committer: Bazaar Package Importer
  • Author(s): Colin Watson
  • Date: 2011-01-11 17:11:44 UTC
  • mfrom: (1.15.12 upstream)
  • mto: This revision was merged to the branch mainline in revision 60.
  • Revision ID: james.westby@ubuntu.com-20110111171144-c4c3hc0jslqa1bxe
Tags: 1.99~20110111-1
* New Bazaar snapshot.
  - Don't check amount of low memory, as reportedly INT 12h can be broken
    and if low memory is too low we wouldn't have gotten into
    grub_machine_init anyway (closes: #588293, LP: #513528).
  - Submenu default support (LP: #691878).
  - Fix optimisation-dependent grub-mklayout crash (closes: #609584).
* branch_butter.patch: Don't free an uninitialised pointer if /proc is
  unmounted (LP: #697493).
* Add a po/LINGUAS file listing the translations we've synced from the TP
  (closes: #609671).

Show diffs side-by-side

added added

removed removed

Lines of Context:
33
33
#include <grub/command.h>
34
34
#include <grub/i386/relocator.h>
35
35
#include <grub/i18n.h>
 
36
#include <grub/lib/cmdline.h>
36
37
 
37
38
#ifdef GRUB_MACHINE_PCBIOS
38
39
#include <grub/i386/pc/vesa_modes_table.h>
312
313
  struct grub_video_mode_info mode_info;
313
314
  void *framebuffer;
314
315
  grub_err_t err;
 
316
  grub_video_driver_id_t driver_id;
 
317
  char *gfxlfbvar = grub_env_get ("gfxpayloadforcelfb");
 
318
 
 
319
  driver_id = grub_video_get_driver_id ();
 
320
 
 
321
  if (driver_id == GRUB_VIDEO_DRIVER_NONE)
 
322
    return 1;
315
323
 
316
324
  err = grub_video_get_info_and_fini (&mode_info, &framebuffer);
317
325
 
338
346
  params->reserved_mask_size = mode_info.reserved_mask_size;
339
347
  params->reserved_field_pos = mode_info.reserved_field_pos;
340
348
 
 
349
  if (gfxlfbvar && (gfxlfbvar[0] == '1' || gfxlfbvar[0] == 'y'))
 
350
    params->have_vga = GRUB_VIDEO_LINUX_TYPE_SIMPLE;
 
351
  else
 
352
    {
 
353
      switch (driver_id)
 
354
        {
 
355
        case GRUB_VIDEO_DRIVER_VBE:
 
356
          params->lfb_size >>= 16;
 
357
          params->have_vga = GRUB_VIDEO_LINUX_TYPE_VESA;
 
358
          break;
 
359
        
 
360
        case GRUB_VIDEO_DRIVER_EFI_UGA:
 
361
        case GRUB_VIDEO_DRIVER_EFI_GOP:
 
362
          params->have_vga = GRUB_VIDEO_LINUX_TYPE_EFIFB;
 
363
          break;
 
364
 
 
365
          /* FIXME: check if better id is available.  */
 
366
        case GRUB_VIDEO_DRIVER_SM712:
 
367
        case GRUB_VIDEO_DRIVER_VGA:
 
368
        case GRUB_VIDEO_DRIVER_CIRRUS:
 
369
        case GRUB_VIDEO_DRIVER_BOCHS:
 
370
          /* Make gcc happy. */
 
371
        case GRUB_VIDEO_DRIVER_SDL:
 
372
        case GRUB_VIDEO_DRIVER_NONE:
 
373
          params->have_vga = GRUB_VIDEO_LINUX_TYPE_SIMPLE;
 
374
          break;
 
375
        }
 
376
    }
341
377
 
342
378
#ifdef GRUB_MACHINE_PCBIOS
343
379
  /* VESA packed modes may come with zeroed mask sizes, which need
344
380
     to be set here according to DAC Palette width.  If we don't,
345
381
     this results in Linux displaying a black screen.  */
346
 
  if (mode_info.bpp <= 8)
 
382
  if (driver_id == GRUB_VIDEO_DRIVER_VBE && mode_info.bpp <= 8)
347
383
    {
348
384
      struct grub_vbe_info_block controller_info;
349
385
      int status;
456
492
      grub_errno = GRUB_ERR_NONE;
457
493
    }
458
494
 
459
 
  if (! grub_linux_setup_video (params))
460
 
    {
461
 
      /* Use generic framebuffer unless VESA is known to be supported.  */
462
 
      if (params->have_vga != GRUB_VIDEO_LINUX_TYPE_VESA)
463
 
        params->have_vga = GRUB_VIDEO_LINUX_TYPE_SIMPLE;
464
 
      else
465
 
        params->lfb_size >>= 16;
466
 
    }
467
 
  else
 
495
  if (grub_linux_setup_video (params))
468
496
    {
469
497
#if defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_COREBOOT) || defined (GRUB_MACHINE_QEMU)
470
498
      params->have_vga = GRUB_VIDEO_LINUX_TYPE_TEXT;
575
603
  grub_size_t real_size, prot_size;
576
604
  grub_ssize_t len;
577
605
  int i;
578
 
  char *dest;
579
606
 
580
607
  grub_dl_ref (my_mod);
581
608
 
771
798
                break;
772
799
              }
773
800
 
774
 
            /* We can't detect VESA, but user is implicitly telling us that it
775
 
               is built-in because `vga=' parameter was used.  */
776
 
            params->have_vga = GRUB_VIDEO_LINUX_TYPE_VESA;
777
 
 
778
801
            linux_mode = &grub_vesa_mode_table[vid_mode
779
802
                                               - GRUB_VESA_MODE_TABLE_START];
780
803
 
836
859
        params->loadflags |= GRUB_LINUX_FLAG_QUIET;
837
860
      }
838
861
 
839
 
 
840
 
  /* Specify the boot file.  */
841
 
  dest = grub_stpcpy ((char *) real_mode_mem + GRUB_LINUX_CL_OFFSET,
842
 
                      "BOOT_IMAGE=");
843
 
  dest = grub_stpcpy (dest, argv[0]);
844
 
 
845
 
  /* Copy kernel parameters.  */
846
 
  for (i = 1;
847
 
       i < argc
848
 
         && dest + grub_strlen (argv[i]) + 1 < ((char *) real_mode_mem
849
 
                                                + GRUB_LINUX_CL_END_OFFSET);
850
 
       i++)
851
 
    {
852
 
      *dest++ = ' ';
853
 
      dest = grub_stpcpy (dest, argv[i]);
854
 
    }
 
862
  /* Create kernel command line.  */
 
863
  grub_memcpy ((char *)real_mode_mem + GRUB_LINUX_CL_OFFSET, LINUX_IMAGE,
 
864
              sizeof (LINUX_IMAGE));
 
865
  grub_create_loader_cmdline (argc, argv,
 
866
                              (char *)real_mode_mem + GRUB_LINUX_CL_OFFSET
 
867
                              + sizeof (LINUX_IMAGE) - 1,
 
868
                              GRUB_LINUX_CL_END_OFFSET - GRUB_LINUX_CL_OFFSET
 
869
                              - (sizeof (LINUX_IMAGE) - 1));
855
870
 
856
871
  len = prot_size;
857
872
  if (grub_file_read (file, prot_mode_mem, len) != len)