From: Colin Watson Date: Sat, 12 Jun 2010 11:17:28 +0000 (+0100) Subject: merge mainline X-Git-Tag: 1.99~804^2~6 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=934302d00b8ff550412877e9401d368ee360b17b;p=thirdparty%2Fgrub.git merge mainline --- 934302d00b8ff550412877e9401d368ee360b17b diff --cc conf/x86-efi.rmk index 000000000,f0f35ff8c..f9f07684e mode 000000,100644..100644 --- a/conf/x86-efi.rmk +++ b/conf/x86-efi.rmk @@@ -1,0 -1,112 +1,112 @@@ + # -*- 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/i386/efi/xnu.c \ ++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 diff --cc loader/i386/efi/linux.c index a4bf7f911,a6db22e22..9d4db3440 --- a/loader/i386/efi/linux.c +++ b/loader/i386/efi/linux.c @@@ -287,66 -286,6 +287,67 @@@ grub_e820_add_region (struct grub_e820_ } } +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->lfb_size = (params->lfb_line_len * params->lfb_height + 65535) >> 16; ++ 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_TYPE_EFI; ++ 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; + 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) + { - tmp = grub_malloc (grub_strlen (modevar) - + sizeof (";auto")); ++ tmp = grub_xasprintf ("%s;auto", modevar); + if (! tmp) + return grub_errno; - grub_sprintf (tmp, "%s;auto", modevar); + 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) diff --cc loader/i386/xnu.c index 3de6e47d4,8000579d0..5f18d744b --- a/loader/i386/xnu.c +++ b/loader/i386/xnu.c @@@ -33,11 -33,6 +33,12 @@@ #include #include #include ++#include + +#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); } +/* 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; - char *tmp, *modevar; ++ 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 + { - tmp = grub_malloc (grub_strlen (modevar) - + sizeof (DEFAULT_VIDEO_MODE) + 1); ++ tmp = grub_xasprintf ("%s;" DEFAULT_VIDEO_MODE, modevar); + if (! tmp) - return grub_error (GRUB_ERR_OUT_OF_MEMORY, - "couldn't allocate temporary storag"); - grub_sprintf (tmp, "%s;" DEFAULT_VIDEO_MODE, modevar); ++ 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; + - x = mode_info.width - grub_xnu_bitmap->mode_info.width; ++ x = mode_info.width - bitmap->mode_info.width; + x /= 2; - y = mode_info.height - grub_xnu_bitmap->mode_info.height; ++ y = mode_info.height - bitmap->mode_info.height; + y /= 2; - err = grub_video_blit_bitmap (grub_xnu_bitmap, ++ 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.width, ++ min (bitmap->mode_info.width, + mode_info.width), - min (grub_xnu_bitmap->mode_info.height, ++ min (bitmap->mode_info.height, + mode_info.height)); - if (err) - { - grub_print_error (); - grub_errno = GRUB_ERR_NONE; - grub_xnu_bitmap = 0; - } - err = GRUB_ERR_NONE; ++ } ++ 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 = grub_xnu_bitmap - ? GRUB_XNU_VIDEO_SPLASH : GRUB_XNU_VIDEO_TEXT_IN_VIDEO; ++ 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)