+++ /dev/null
-2010-01-14 Vladimir Serbinenko <phcoder@gmail.com>
-
- VBE multiboot support.
-
- * loader/i386/multiboot_mbi.c (HAS_VBE): New constant.
- (grub_multiboot_get_mbi_size) [HAS_VBE]: Account for VBE structures.
- (grub_multiboot_make_mbi) [HAS_VBE]: Likewise.
- (fill_vbe_info) [HAS_VBE]: New function.
- (retrieve_video_parameters) [HAS_VBE]: Call fill_vbe_info.
(grub_get_multiboot_mmap_count): New proto.
(grub_fill_multiboot_mmap): Likewise.
(grub_multiboot_set_video_mode): Likewise.
- (grub_multiboot_fill_vbe_info_real): Likewise.
(grub_multiboot_set_console): Likewise.
(grub_multiboot_load): Likewise.
(grub_multiboot_load_elf): Likewise.
* loader/i386/multiboot_mbi.c (HAS_VGA_TEXT): Moved from here ..
* include/grub/multiboot.h (GRUB_MACHINE_HAS_VGA_TEXT): ... here. All
users updated.
- * loader/i386/multiboot_mbi.c (HAS_VBE): Moved from here ..
- * include/grub/multiboot.h (GRUB_MACHINE_HAS_VBE): ... here. All
- users updated.
* loader/i386/multiboot_mbi.c (accepts_video): Moved from here...
* loader/i386/multiboot.c (accepts_video): ... here. All users updated.
* loader/i386/multiboot_mbi.c (grub_multiboot_set_accepts_video):
* loader/i386/multiboot_mbi.c (set_video_mode): Moved from here...
* loader/i386/multiboot.c (grub_multiboot_set_video_mode): ... here.
All users updated.
- * loader/i386/multiboot_mbi.c (fill_vbe_info): Moved generic parts
- from here...
- * loader/i386/multiboot.c (grub_multiboot_fill_vbe_info_real): ... here.
- All users updated.
* loader/i386/multiboot_mbi2.c: New file.
#if defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_COREBOOT) || defined (GRUB_MACHINE_QEMU)
#include <grub/i386/pc/vbe.h>
-grub_err_t
-grub_multiboot_fill_vbe_info_real (struct grub_vbe_info_block *vbe_control_info,
- struct grub_vbe_mode_info_block *vbe_mode_info,
- multiboot_uint16_t *vbe_mode,
- multiboot_uint16_t *vbe_interface_seg,
- multiboot_uint16_t *vbe_interface_off,
- multiboot_uint16_t *vbe_interface_len);
-#define GRUB_MACHINE_HAS_VBE 1
#define GRUB_MACHINE_HAS_VGA_TEXT 1
#else
-#define GRUB_MACHINE_HAS_VBE 0
#define GRUB_MACHINE_HAS_VGA_TEXT 0
#endif
/*
* FIXME: The following features from the Multiboot specification still
* need to be implemented:
+ * - VBE support
* - symbol table
* - drives table
* - ROM configuration table
return err;
}
-#if GRUB_MACHINE_HAS_VBE
-grub_err_t
-grub_multiboot_fill_vbe_info_real (struct grub_vbe_info_block *vbe_control_info,
- struct grub_vbe_mode_info_block *vbe_mode_info,
- multiboot_uint16_t *vbe_mode,
- multiboot_uint16_t *vbe_interface_seg,
- multiboot_uint16_t *vbe_interface_off,
- multiboot_uint16_t *vbe_interface_len)
-{
- grub_vbe_status_t status;
- void *scratch = (void *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR;
-
- status = grub_vbe_bios_get_controller_info (scratch);
- if (status != GRUB_VBE_STATUS_OK)
- return grub_error (GRUB_ERR_IO, "Can't get controller info.");
- grub_memcpy (vbe_control_info, scratch, sizeof (struct grub_vbe_info_block));
-
- status = grub_vbe_bios_get_mode (scratch);
- *vbe_mode = *(grub_uint32_t *) scratch;
- if (status != GRUB_VBE_STATUS_OK)
- return grub_error (GRUB_ERR_IO, "can't get VBE mode");
-
- /* get_mode_info isn't available for mode 3. */
- if (*vbe_mode == 3)
- {
- grub_memset (vbe_mode_info, 0, sizeof (struct grub_vbe_mode_info_block));
- vbe_mode_info->memory_model = GRUB_VBE_MEMORY_MODEL_TEXT;
- vbe_mode_info->x_resolution = 80;
- vbe_mode_info->y_resolution = 25;
- }
- else
- {
- status = grub_vbe_bios_get_mode_info (*vbe_mode, scratch);
- if (status != GRUB_VBE_STATUS_OK)
- return grub_error (GRUB_ERR_IO, "can't get mode info");
- grub_memcpy (vbe_mode_info, scratch,
- sizeof (struct grub_vbe_mode_info_block));
- }
-
- /* FIXME: retrieve those. */
- *vbe_interface_seg = 0;
- *vbe_interface_off = 0;
- *vbe_interface_len = 0;
-
- return GRUB_ERR_NONE;
-}
-#endif
-
static grub_err_t
grub_multiboot_boot (void)
{
+ modcnt * sizeof (struct multiboot_mod_list) + total_modcmd
+ ALIGN_UP (sizeof(PACKAGE_STRING), 4)
+ grub_get_multiboot_mmap_count () * sizeof (struct multiboot_mmap_entry)
-#if GRUB_MACHINE_HAS_VBE
- + sizeof (struct grub_vbe_info_block)
- + sizeof (struct grub_vbe_mode_info_block)
-#endif
+ 256 * sizeof (struct multiboot_color);
}
grub_print_error ();
grub_errno = GRUB_ERR_NONE;
}
-#if GRUB_MACHINE_HAS_VBE
- ptrorig += sizeof (struct grub_vbe_info_block);
- ptrdest += sizeof (struct grub_vbe_info_block);
- ptrorig += sizeof (struct grub_vbe_mode_info_block);
- ptrdest += sizeof (struct grub_vbe_mode_info_block);
-#endif
return GRUB_ERR_NONE;
}
case MULTIBOOT_TAG_TYPE_BASIC_MEMINFO:
case MULTIBOOT_TAG_TYPE_BOOTDEV:
case MULTIBOOT_TAG_TYPE_MMAP:
- case MULTIBOOT_TAG_TYPE_VBE:
case MULTIBOOT_TAG_TYPE_FRAMEBUFFER:
break;
+ case MULTIBOOT_TAG_TYPE_VBE:
case MULTIBOOT_TAG_TYPE_ELF_SECTIONS:
case MULTIBOOT_TAG_TYPE_APM:
default:
+ sizeof (struct multiboot_tag_vbe) + MULTIBOOT_TAG_ALIGN - 1;
}
-#ifdef GRUB_MACHINE_HAS_VBE
-
-static grub_err_t
-fill_vbe_info (struct grub_vbe_mode_info_block **vbe_mode_info_out,
- grub_uint8_t **ptrorig)
-{
- struct multiboot_tag_vbe *tag = (struct multiboot_tag_vbe *) *ptrorig;
- grub_err_t err;
-
- tag->type = MULTIBOOT_TAG_TYPE_VBE;
- tag->size = 0;
- err = grub_multiboot_fill_vbe_info_real ((struct grub_vbe_info_block *)
- &(tag->vbe_control_info),
- (struct grub_vbe_mode_info_block *)
- &(tag->vbe_mode_info),
- &(tag->vbe_mode),
- &(tag->vbe_interface_seg),
- &(tag->vbe_interface_off),
- &(tag->vbe_interface_len));
- if (err)
- return err;
- if (vbe_mode_info_out)
- *vbe_mode_info_out = (struct grub_vbe_mode_info_block *)
- &(tag->vbe_mode_info);
- tag->size = sizeof (struct multiboot_tag_vbe);
- *ptrorig += ALIGN_UP (tag->size, MULTIBOOT_TAG_ALIGN);
- return GRUB_ERR_NONE;
-}
-
-#endif
-
/* Fill previously allocated Multiboot mmap. */
static void
grub_fill_multiboot_mmap (struct multiboot_tag_mmap *tag)
#if HAS_VGA_TEXT
if (driv_id == GRUB_VIDEO_DRIVER_NONE)
{
- struct grub_vbe_mode_info_block *vbe_mode_info;
- err = fill_vbe_info (&vbe_mode_info, ptrorig);
- if (err)
- return err;
- if (vbe_mode_info->memory_model == GRUB_VBE_MEMORY_MODEL_TEXT)
+ struct grub_vbe_mode_info_block vbe_mode_info;
+ grub_vbe_status_t status;
+ grub_uint32_t vbe_mode;
+ void *scratch = (void *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR;
+
+ status = grub_vbe_bios_get_mode (scratch);
+ vbe_mode = *(grub_uint32_t *) scratch;
+ if (status != GRUB_VBE_STATUS_OK)
+ return GRUB_ERR_NONE;
+
+ /* get_mode_info isn't available for mode 3. */
+ if (vbe_mode == 3)
+ {
+ grub_memset (&vbe_mode_info, 0,
+ sizeof (struct grub_vbe_mode_info_block));
+ vbe_mode_info.memory_model = GRUB_VBE_MEMORY_MODEL_TEXT;
+ vbe_mode_info.x_resolution = 80;
+ vbe_mode_info.y_resolution = 25;
+ }
+ else
+ {
+ status = grub_vbe_bios_get_mode_info (vbe_mode, scratch);
+ if (status != GRUB_VBE_STATUS_OK)
+ return GRUB_ERR_NONE;
+ grub_memcpy (&vbe_mode_info, scratch,
+ sizeof (struct grub_vbe_mode_info_block));
+ }
+
+ if (vbe_mode_info.memory_model == GRUB_VBE_MEMORY_MODEL_TEXT)
{
tag = (struct multiboot_tag_framebuffer *) *ptrorig;
tag->common.type = MULTIBOOT_TAG_TYPE_FRAMEBUFFER;
tag->common.framebuffer_addr = 0xb8000;
- tag->common.framebuffer_pitch = 2 * vbe_mode_info->x_resolution;
- tag->common.framebuffer_width = vbe_mode_info->x_resolution;
- tag->common.framebuffer_height = vbe_mode_info->y_resolution;
+ tag->common.framebuffer_pitch = 2 * vbe_mode_info.x_resolution;
+ tag->common.framebuffer_width = vbe_mode_info.x_resolution;
+ tag->common.framebuffer_height = vbe_mode_info.y_resolution;
tag->common.framebuffer_bpp = 16;
}
*ptrorig += ALIGN_UP (tag->common.size, MULTIBOOT_TAG_ALIGN);
-#if HAS_VBE
- if (driv_id == GRUB_VIDEO_DRIVER_VBE)
- {
- err = fill_vbe_info (NULL, ptrorig);
- if (err)
- return err;
- }
-#endif
-
return GRUB_ERR_NONE;
}