--- /dev/null
-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
}
}
- 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[];
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)
#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;
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)