]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
merge mainline
authorColin Watson <cjwatson@ubuntu.com>
Sat, 12 Jun 2010 11:17:28 +0000 (12:17 +0100)
committerColin Watson <cjwatson@ubuntu.com>
Sat, 12 Jun 2010 11:17:28 +0000 (12:17 +0100)
1  2 
conf/i386-pc.rmk
conf/x86-efi.rmk
loader/i386/efi/linux.c
loader/i386/xnu.c

Simple merge
index 0000000000000000000000000000000000000000,f0f35ff8c8ba510db0241a2acfd92789b165887c..f9f07684e726e8a1b34625f3f900f9525def7e01
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,112 +1,112 @@@
 -xnu_mod_SOURCES = loader/xnu_resume.c loader/i386/xnu.c loader/i386/efi/xnu.c \
+ # -*- makefile -*-
+ # Scripts.
+ sbin_SCRIPTS = grub-install
+ # For grub-install.
+ grub_install_SOURCES = util/i386/efi/grub-install.in
+ bin_SCRIPTS += grub-mkrescue
+ grub_mkrescue_SOURCES = util/grub-mkrescue.in
+ # Modules.
+ pkglib_PROGRAMS = kernel.img
+ pkglib_MODULES = chain.mod appleldr.mod \
+       linux.mod halt.mod  \
+       datetime.mod loadbios.mod \
+       fixvideo.mod mmap.mod acpi.mod
+ # For kernel.img.
+ kernel_img_RELOCATABLE = yes
+ kernel_img_SOURCES = kern/$(target_cpu)/efi/startup.S kern/main.c kern/device.c \
+       kern/disk.c kern/dl.c kern/file.c kern/fs.c kern/err.c \
+       kern/misc.c kern/mm.c kern/term.c \
+       kern/rescue_parser.c kern/rescue_reader.c \
+       kern/$(target_cpu)/dl.c kern/i386/efi/init.c kern/parser.c kern/partition.c \
+       kern/env.c symlist.c kern/efi/efi.c kern/efi/init.c kern/efi/mm.c \
+       term/efi/console.c disk/efi/efidisk.c \
+       kern/time.c kern/list.c  kern/command.c kern/corecmd.c \
+       kern/i386/tsc.c kern/i386/pit.c \
+       kern/generic/rtc_get_time_ms.c \
+       kern/generic/millisleep.c
+ ifeq ($(target_cpu),x86_64)
+ kernel_img_SOURCES += kern/x86_64/efi/callwrap.S
+ endif
+ kernel_img_HEADERS += efi/efi.h efi/time.h efi/disk.h i386/pit.h
+ kernel_img_CFLAGS = $(COMMON_CFLAGS)
+ kernel_img_ASFLAGS = $(COMMON_ASFLAGS)
+ kernel_img_LDFLAGS += $(COMMON_LDFLAGS)
+ # For acpi.mod.
+ acpi_mod_SOURCES = commands/acpi.c commands/efi/acpi.c
+ acpi_mod_CFLAGS = $(COMMON_CFLAGS)
+ acpi_mod_LDFLAGS = $(COMMON_LDFLAGS)
+ # For mmap.mod.
+ mmap_mod_SOURCES = mmap/mmap.c mmap/i386/uppermem.c mmap/i386/mmap.c \
+                  mmap/efi/mmap.c
+ mmap_mod_CFLAGS = $(COMMON_CFLAGS)
+ mmap_mod_LDFLAGS = $(COMMON_LDFLAGS)
+ # For chain.mod.
+ chain_mod_SOURCES = loader/efi/chainloader.c
+ chain_mod_CFLAGS = $(COMMON_CFLAGS)
+ chain_mod_LDFLAGS = $(COMMON_LDFLAGS)
+ # For appleldr.mod.
+ appleldr_mod_SOURCES = loader/efi/appleloader.c
+ appleldr_mod_CFLAGS = $(COMMON_CFLAGS)
+ appleldr_mod_LDFLAGS = $(COMMON_LDFLAGS)
+ # For linux.mod.
+ ifeq ($(target_cpu), x86_64)
+ linux_mod_SOURCES = loader/i386/efi/linux.c loader/i386/linux_trampoline.S
+ linux_mod_CFLAGS = $(COMMON_CFLAGS)
+ linux_mod_ASFLAGS = $(COMMON_ASFLAGS)
+ linux_mod_LDFLAGS = $(COMMON_LDFLAGS)
+ else
+ linux_mod_SOURCES = loader/i386/efi/linux.c
+ linux_mod_CFLAGS = $(COMMON_CFLAGS)
+ linux_mod_ASFLAGS = $(COMMON_ASFLAGS)
+ linux_mod_LDFLAGS = $(COMMON_LDFLAGS)
+ endif
+ # For halt.mod.
+ halt_mod_SOURCES = commands/halt.c
+ halt_mod_CFLAGS = $(COMMON_CFLAGS)
+ halt_mod_LDFLAGS = $(COMMON_LDFLAGS)
+ # For datetime.mod
+ datetime_mod_SOURCES = lib/efi/datetime.c
+ datetime_mod_CFLAGS = $(COMMON_CFLAGS)
+ datetime_mod_LDFLAGS = $(COMMON_LDFLAGS)
+ # For loadbios.mod
+ loadbios_mod_SOURCES = commands/efi/loadbios.c
+ loadbios_mod_CFLAGS = $(COMMON_CFLAGS)
+ loadbios_mod_LDFLAGS = $(COMMON_LDFLAGS)
+ # For fixvideo.mod
+ fixvideo_mod_SOURCES = commands/efi/fixvideo.c
+ fixvideo_mod_CFLAGS = $(COMMON_CFLAGS)
+ fixvideo_mod_LDFLAGS = $(COMMON_LDFLAGS)
+ pkglib_MODULES += efi_uga.mod
+ efi_uga_mod_SOURCES = video/efi_uga.c
+ efi_uga_mod_CFLAGS = $(COMMON_CFLAGS)
+ efi_uga_mod_LDFLAGS = $(COMMON_LDFLAGS)
+ pkglib_MODULES += efi_gop.mod
+ efi_gop_mod_SOURCES = video/efi_gop.c
+ efi_gop_mod_CFLAGS = $(COMMON_CFLAGS)
+ efi_gop_mod_LDFLAGS = $(COMMON_LDFLAGS)
+ pkglib_MODULES += xnu.mod
++xnu_mod_SOURCES = loader/xnu_resume.c loader/i386/xnu.c \
+       loader/macho32.c loader/macho64.c loader/macho.c loader/xnu.c
+ xnu_mod_CFLAGS = $(COMMON_CFLAGS)
+ xnu_mod_LDFLAGS = $(COMMON_LDFLAGS)
+ xnu_mod_ASFLAGS = $(COMMON_ASFLAGS)
+ include $(srcdir)/conf/i386.mk
+ include $(srcdir)/conf/common.mk
index a4bf7f9119790fbfebb7d7d4b62868aa6210b835,a6db22e222e253c8916f2d0840ac0d7eb895ed0c..9d4db34408e60e9d0df9af78d2ddf0d06f9c6bb0
@@@ -287,66 -286,6 +287,67 @@@ grub_e820_add_region (struct grub_e820_
      }
  }
  
-   params->lfb_size = (params->lfb_line_len * params->lfb_height + 65535) >> 16;
 +static grub_err_t
 +grub_linux_setup_video (struct linux_kernel_params *params)
 +{
 +  struct grub_video_mode_info mode_info;
 +  void *framebuffer;
 +  grub_err_t err;
 +
 +  err = grub_video_get_info_and_fini (&mode_info, &framebuffer);
 +
 +  if (err)
 +    return err;
 +
 +  params->lfb_width = mode_info.width;
 +  params->lfb_height = mode_info.height;
 +  params->lfb_depth = mode_info.bpp;
 +  params->lfb_line_len = mode_info.pitch;
 +
 +  params->lfb_base = (grub_size_t) framebuffer;
-   params->have_vga = GRUB_VIDEO_TYPE_EFI;
++  params->lfb_size = ALIGN_UP (params->lfb_line_len * params->lfb_height,
++                             65536);
 +
 +  params->red_mask_size = mode_info.red_mask_size;
 +  params->red_field_pos = mode_info.red_field_pos;
 +  params->green_mask_size = mode_info.green_mask_size;
 +  params->green_field_pos = mode_info.green_field_pos;
 +  params->blue_mask_size = mode_info.blue_mask_size;
 +  params->blue_field_pos = mode_info.blue_field_pos;
 +  params->reserved_mask_size = mode_info.reserved_mask_size;
 +  params->reserved_field_pos = mode_info.reserved_field_pos;
 +
++  params->have_vga = GRUB_VIDEO_LINUX_TYPE_SIMPLE;
 +
 +#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;
 +}
 +
  #ifdef __x86_64__
  extern grub_uint8_t grub_linux_trampoline_start[];
  extern grub_uint8_t grub_linux_trampoline_end[];
@@@ -423,37 -353,6 +424,35 @@@ grub_linux_boot (void
    grub_mmap_iterate (hook);
    params->mmap_size = e820_num;
  
-       tmp = grub_malloc (grub_strlen (modevar)
-                        + sizeof (";auto"));
 +  grub_printf ("Trampoline at %p. code32=%x, real_mode_mem=%p\n",
 +             ((char *) prot_mode_mem + (prot_mode_pages << 12)),
 +             (unsigned) params->code32_start, real_mode_mem);
 +
 +  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)
 +    {
-       grub_sprintf (tmp, "%s;auto", modevar);
++      tmp = grub_xasprintf ("%s;auto", modevar);
 +      if (! tmp)
 +      return grub_errno;
 +      err = grub_video_set_mode (tmp, GRUB_VIDEO_MODE_TYPE_PURE_TEXT, 0);
 +      grub_free (tmp);
 +    }
 +  else
 +    err = grub_video_set_mode ("auto", GRUB_VIDEO_MODE_TYPE_PURE_TEXT, 0);
 +
 +  if (!err)
 +    err = grub_linux_setup_video (params);
 +
 +  if (err)
 +    {
 +      grub_print_error ();
 +      grub_printf ("Booting however\n");
 +      grub_errno = GRUB_ERR_NONE;
 +    }
 +
    mmap_size = find_mmap_size ();
    if (grub_efi_get_memory_map (&mmap_size, mmap_buf, &map_key,
                               &desc_size, &desc_version) <= 0)
index 3de6e47d47a7ab56cecafed79c453ef3ce0eed83,8000579d00f8d01d6c8643dabace404bcd057d5d..5f18d744b880c0c4e41f9fcace122602f4b46711
  #include <grub/command.h>
  #include <grub/gzio.h>
  #include <grub/i18n.h>
++#include <grub/bitmap_scale.h>
 +
 +#define min(a,b) (((a) < (b)) ? (a) : (b))
 +#define max(a,b) (((a) > (b)) ? (a) : (b))
 +
 +#define DEFAULT_VIDEO_MODE "auto"
  
  char grub_xnu_cmdline[1024];
  grub_uint32_t grub_xnu_heap_will_be_at;
@@@ -841,84 -838,6 +844,98 @@@ grub_xnu_boot_resume (void
                                state); 
  }
  
-   char *tmp, *modevar;
 +/* Setup video for xnu. */
 +static grub_err_t
 +grub_xnu_set_video (struct grub_xnu_boot_params *params)
 +{
 +  struct grub_video_mode_info mode_info;
 +  int ret;
-       tmp = grub_malloc (grub_strlen (modevar)
-                        + sizeof (DEFAULT_VIDEO_MODE) + 1);
++  char *tmp;
++  const char *modevar;
 +  void *framebuffer;
 +  grub_err_t err;
++  struct grub_video_bitmap *bitmap = NULL;
 +
 +  modevar = grub_env_get ("gfxpayload");
 +  /* Consider only graphical 32-bit deep modes.  */
 +  if (! modevar || *modevar == 0)
 +    err = grub_video_set_mode (DEFAULT_VIDEO_MODE,
 +                             GRUB_VIDEO_MODE_TYPE_PURE_TEXT
 +                             | GRUB_VIDEO_MODE_TYPE_DEPTH_MASK,
 +                             32 << GRUB_VIDEO_MODE_TYPE_DEPTH_POS);
 +  else
 +    {
-       return grub_error (GRUB_ERR_OUT_OF_MEMORY,
-                          "couldn't allocate temporary storag");
-       grub_sprintf (tmp, "%s;" DEFAULT_VIDEO_MODE, modevar);
++      tmp = grub_xasprintf ("%s;" DEFAULT_VIDEO_MODE, modevar);
 +      if (! tmp)
-       x = mode_info.width - grub_xnu_bitmap->mode_info.width;
++      return grub_errno;
 +      err = grub_video_set_mode (tmp,
 +                               GRUB_VIDEO_MODE_TYPE_PURE_TEXT
 +                               | GRUB_VIDEO_MODE_TYPE_DEPTH_MASK,
 +                               32 << GRUB_VIDEO_MODE_TYPE_DEPTH_POS);
 +      grub_free (tmp);
 +    }
 +
 +  if (err)
 +    return err;
 +
++  ret = grub_video_get_info (&mode_info);
++  if (ret)
++    return grub_error (GRUB_ERR_IO, "couldn't retrieve video parameters");
++
 +  if (grub_xnu_bitmap)
++    {
++      if (grub_xnu_bitmap_mode == GRUB_XNU_BITMAP_STRETCH)
++      err = grub_video_bitmap_create_scaled (&bitmap,
++                                             mode_info.width,
++                                             mode_info.height,
++                                             grub_xnu_bitmap,
++                                             GRUB_VIDEO_BITMAP_SCALE_METHOD_BEST);
++      else
++      bitmap = grub_xnu_bitmap;
++    }
++
++  if (bitmap)
 +    {
 +      int x, y;
 +
-       y = mode_info.height - grub_xnu_bitmap->mode_info.height;
++      x = mode_info.width - bitmap->mode_info.width;
 +      x /= 2;
-       err = grub_video_blit_bitmap (grub_xnu_bitmap,
++      y = mode_info.height - bitmap->mode_info.height;
 +      y /= 2;
-                                   min (grub_xnu_bitmap->mode_info.width,
++      err = grub_video_blit_bitmap (bitmap,
 +                                  GRUB_VIDEO_BLIT_REPLACE,
 +                                  x > 0 ? x : 0,
 +                                  y > 0 ? y : 0,
 +                                  x < 0 ? -x : 0,
 +                                  y < 0 ? -y : 0,
-                                   min (grub_xnu_bitmap->mode_info.height,
++                                  min (bitmap->mode_info.width,
 +                                       mode_info.width),
-       if (err)
-       {
-         grub_print_error ();
-         grub_errno = GRUB_ERR_NONE;
-         grub_xnu_bitmap = 0;
-       }
-       err = GRUB_ERR_NONE;
++                                  min (bitmap->mode_info.height,
 +                                       mode_info.height));
-   params->lfb_mode = grub_xnu_bitmap
-     ? GRUB_XNU_VIDEO_SPLASH : GRUB_XNU_VIDEO_TEXT_IN_VIDEO;
++    }
++  if (err)
++    {
++      grub_print_error ();
++      grub_errno = GRUB_ERR_NONE;
++      bitmap = 0;
 +    }
 +
 +  ret = grub_video_get_info_and_fini (&mode_info, &framebuffer);
 +  if (ret)
 +    return grub_error (GRUB_ERR_IO, "couldn't retrieve video parameters");
 +
 +  params->lfb_width = mode_info.width;
 +  params->lfb_height = mode_info.height;
 +  params->lfb_depth = mode_info.bpp;
 +  params->lfb_line_len = mode_info.pitch;
 +
 +  params->lfb_base = PTR_TO_UINT32 (framebuffer);
++  params->lfb_mode = bitmap ? GRUB_XNU_VIDEO_SPLASH 
++    : GRUB_XNU_VIDEO_TEXT_IN_VIDEO;
 +
 +  return GRUB_ERR_NONE;
 +}
 +
  /* Boot xnu. */
  grub_err_t
  grub_xnu_boot (void)