grub_err_t grub_video_get_active_render_target (struct grub_video_render_target **target);
grub_err_t grub_video_set_mode (const char *modestring,
- int NESTED_FUNC_ATTR (*hook) (grub_video_adapter_t p,
- struct grub_video_mode_info *mode_info));
- grub_video_driver_id_t grub_video_get_driver_id (void);
+ unsigned int modemask,
+ unsigned int modevalue);
+
+ static inline int
+ grub_video_check_mode_flag (unsigned int flags, unsigned int mask,
+ unsigned int flag, int def)
+ {
+ return (flag & mask) ? !! (flags & flag) : def;
+ }
+
++grub_video_driver_id_t
++grub_video_get_driver_id (void);
+
#endif /* ! GRUB_VIDEO_HEADER */
if (modevar && *modevar != 0)
{
tmp = grub_malloc (grub_strlen (modevar)
- + sizeof (";text"));
+ + sizeof (";" DEFAULT_VIDEO_MODE));
if (! tmp)
return grub_errno;
- grub_sprintf (tmp, "%s;text", modevar);
+ grub_sprintf (tmp, "%s;" DEFAULT_VIDEO_MODE, modevar);
- err = grub_video_set_mode (tmp, 0);
+ err = grub_video_set_mode (tmp, 0, 0);
grub_free (tmp);
}
else
- err = grub_video_set_mode (DEFAULT_VIDEO_MODE, 0);
- err = grub_video_set_mode ("text", 0, 0);
++ err = grub_video_set_mode (DEFAULT_VIDEO_MODE, 0, 0);
if (err)
{
#include <grub/term.h>
#include <grub/command.h>
#include <grub/gzio.h>
+#include <grub/i18n.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;
grub_uint32_t grub_xnu_entry_point, grub_xnu_arg1, grub_xnu_stack;
/* Aliases set for some tables. */
state.eip = grub_xnu_entry_point;
state.eax = grub_xnu_arg1;
- return grub_relocator32_boot (grub_xnu_heap_start, grub_xnu_heap_will_be_at,
- state);
+ return grub_relocator32_boot (grub_xnu_relocator, 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;
+ void *framebuffer;
+ grub_err_t err;
+
+ 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);
+ if (! tmp)
+ return grub_error (GRUB_ERR_OUT_OF_MEMORY,
+ "couldn't allocate temporary storag");
+ grub_sprintf (tmp, "%s;" DEFAULT_VIDEO_MODE, modevar);
+ 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;
+
+ if (grub_xnu_bitmap)
+ {
+ int x, y;
+
+ x = mode_info.width - grub_xnu_bitmap->mode_info.width;
+ x /= 2;
+ y = mode_info.height - grub_xnu_bitmap->mode_info.height;
+ y /= 2;
+ err = grub_video_blit_bitmap (grub_xnu_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,
+ mode_info.width),
+ min (grub_xnu_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;
+ }
+
+ 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;
+
+ return GRUB_ERR_NONE;
+ }
+
/* Boot xnu. */
grub_err_t
grub_xnu_boot (void)