Fix coreboot compilation.

* grub-core/loader/i386/multiboot_mbi.c (grub_multiboot_get_mbi_size):
	Take VBE info into account even if only text is supported.
	(fill_vbe_info): Take into account the case when only VGA text
	is supported.
	* include/grub/multiboot.h (GRUB_MACHINE_HAS_VBE): Set to zero
	on coreboot, multiboot and qemu.
This commit is contained in:
Vladimir 'phcoder' Serbinenko 2010-09-29 23:51:12 +02:00
parent 2a4066114d
commit 579940128b
3 changed files with 42 additions and 10 deletions

View file

@ -1,3 +1,14 @@
2010-09-29 Vladimir Serbinenko <phcoder@gmail.com>
Fix coreboot compilation.
* grub-core/loader/i386/multiboot_mbi.c (grub_multiboot_get_mbi_size):
Take VBE info into account even if only text is supported.
(fill_vbe_info): Take into account the case when only VGA text
is supported.
* include/grub/multiboot.h (GRUB_MACHINE_HAS_VBE): Set to zero
on coreboot, multiboot and qemu.
2010-09-29 Vladimir Serbinenko <phcoder@gmail.com> 2010-09-29 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/lib/relocator.c (malloc_in_range): Trim too verbose * grub-core/lib/relocator.c (malloc_in_range): Trim too verbose

View file

@ -187,6 +187,10 @@ grub_multiboot_load (grub_file_t file)
return err; return err;
} }
#if GRUB_MACHINE_HAS_VBE || GRUB_MACHINE_HAS_VGA_TEXT
#include <grub/i386/pc/vbe.h>
#endif
static grub_size_t static grub_size_t
grub_multiboot_get_mbi_size (void) grub_multiboot_get_mbi_size (void)
{ {
@ -196,7 +200,7 @@ grub_multiboot_get_mbi_size (void)
+ grub_get_multiboot_mmap_count () * sizeof (struct multiboot_mmap_entry) + grub_get_multiboot_mmap_count () * sizeof (struct multiboot_mmap_entry)
+ elf_sec_entsize * elf_sec_num + elf_sec_entsize * elf_sec_num
+ 256 * sizeof (struct multiboot_color) + 256 * sizeof (struct multiboot_color)
#if GRUB_MACHINE_HAS_VBE #if GRUB_MACHINE_HAS_VBE || GRUB_MACHINE_HAS_VGA_TEXT
+ sizeof (struct grub_vbe_info_block) + sizeof (struct grub_vbe_info_block)
+ sizeof (struct grub_vbe_mode_info_block) + sizeof (struct grub_vbe_mode_info_block)
#endif #endif
@ -247,15 +251,17 @@ grub_fill_multiboot_mmap (struct multiboot_mmap_entry *first_entry)
grub_mmap_iterate (hook); grub_mmap_iterate (hook);
} }
#if GRUB_MACHINE_HAS_VBE #if GRUB_MACHINE_HAS_VBE || GRUB_MACHINE_HAS_VGA_TEXT
static grub_err_t static grub_err_t
fill_vbe_info (struct multiboot_info *mbi, grub_uint8_t *ptrorig, fill_vbe_info (struct multiboot_info *mbi, grub_uint8_t *ptrorig,
grub_uint32_t ptrdest, int fill_generic) grub_uint32_t ptrdest, int fill_generic)
{ {
grub_vbe_status_t status;
grub_uint32_t vbe_mode; grub_uint32_t vbe_mode;
void *scratch = (void *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR;
struct grub_vbe_mode_info_block *mode_info; struct grub_vbe_mode_info_block *mode_info;
#if GRUB_MACHINE_HAS_VBE
grub_vbe_status_t status;
void *scratch = (void *) GRUB_MEMORY_MACHINE_SCRATCH_ADDR;
status = grub_vbe_bios_get_controller_info (scratch); status = grub_vbe_bios_get_controller_info (scratch);
if (status != GRUB_VBE_STATUS_OK) if (status != GRUB_VBE_STATUS_OK)
@ -265,11 +271,18 @@ fill_vbe_info (struct multiboot_info *mbi, grub_uint8_t *ptrorig,
grub_memcpy (ptrorig, scratch, sizeof (struct grub_vbe_info_block)); grub_memcpy (ptrorig, scratch, sizeof (struct grub_vbe_info_block));
ptrorig += sizeof (struct grub_vbe_info_block); ptrorig += sizeof (struct grub_vbe_info_block);
ptrdest += sizeof (struct grub_vbe_info_block); ptrdest += sizeof (struct grub_vbe_info_block);
#else
mbi->vbe_control_info = 0;
#endif
#if GRUB_MACHINE_HAS_VBE
status = grub_vbe_bios_get_mode (scratch); status = grub_vbe_bios_get_mode (scratch);
vbe_mode = *(grub_uint32_t *) scratch; vbe_mode = *(grub_uint32_t *) scratch;
if (status != GRUB_VBE_STATUS_OK) if (status != GRUB_VBE_STATUS_OK)
return grub_error (GRUB_ERR_IO, "can't get VBE mode"); return grub_error (GRUB_ERR_IO, "can't get VBE mode");
#else
vbe_mode = 3;
#endif
mbi->vbe_mode = vbe_mode; mbi->vbe_mode = vbe_mode;
mode_info = (struct grub_vbe_mode_info_block *) ptrorig; mode_info = (struct grub_vbe_mode_info_block *) ptrorig;
@ -284,18 +297,22 @@ fill_vbe_info (struct multiboot_info *mbi, grub_uint8_t *ptrorig,
} }
else else
{ {
#if GRUB_MACHINE_HAS_VBE
status = grub_vbe_bios_get_mode_info (vbe_mode, scratch); status = grub_vbe_bios_get_mode_info (vbe_mode, scratch);
if (status != GRUB_VBE_STATUS_OK) if (status != GRUB_VBE_STATUS_OK)
return grub_error (GRUB_ERR_IO, "can't get mode info"); return grub_error (GRUB_ERR_IO, "can't get mode info");
grub_memcpy (mode_info, scratch, grub_memcpy (mode_info, scratch,
sizeof (struct grub_vbe_mode_info_block)); sizeof (struct grub_vbe_mode_info_block));
#endif
} }
ptrorig += sizeof (struct grub_vbe_mode_info_block); ptrorig += sizeof (struct grub_vbe_mode_info_block);
ptrdest += sizeof (struct grub_vbe_mode_info_block); ptrdest += sizeof (struct grub_vbe_mode_info_block);
#if GRUB_MACHINE_HAS_VBE
grub_vbe_bios_get_pm_interface (&mbi->vbe_interface_seg, grub_vbe_bios_get_pm_interface (&mbi->vbe_interface_seg,
&mbi->vbe_interface_off, &mbi->vbe_interface_off,
&mbi->vbe_interface_len); &mbi->vbe_interface_len);
#endif
mbi->flags |= MULTIBOOT_INFO_VBE_INFO; mbi->flags |= MULTIBOOT_INFO_VBE_INFO;

View file

@ -53,15 +53,19 @@ grub_multiboot_add_elfsyms (grub_size_t num, grub_size_t entsize,
grub_uint32_t grub_get_multiboot_mmap_count (void); grub_uint32_t grub_get_multiboot_mmap_count (void);
grub_err_t grub_multiboot_set_video_mode (void); grub_err_t grub_multiboot_set_video_mode (void);
#if defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_COREBOOT) || defined (GRUB_MACHINE_MULTIBOOT) || defined (GRUB_MACHINE_QEMU) /* FIXME: support coreboot as well. */
#include <grub/i386/pc/vbe.h> #if defined (GRUB_MACHINE_PCBIOS)
#define GRUB_MACHINE_HAS_VGA_TEXT 1
#define GRUB_MACHINE_HAS_VBE 1 #define GRUB_MACHINE_HAS_VBE 1
#else #else
#define GRUB_MACHINE_HAS_VGA_TEXT 0
#define GRUB_MACHINE_HAS_VBE 0 #define GRUB_MACHINE_HAS_VBE 0
#endif #endif
#if defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_COREBOOT) || defined (GRUB_MACHINE_MULTIBOOT) || defined (GRUB_MACHINE_QEMU)
#define GRUB_MACHINE_HAS_VGA_TEXT 1
#else
#define GRUB_MACHINE_HAS_VGA_TEXT 0
#endif
#if defined (GRUB_MACHINE_EFI) || defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_COREBOOT) || defined (GRUB_MACHINE_MULTIBOOT) #if defined (GRUB_MACHINE_EFI) || defined (GRUB_MACHINE_PCBIOS) || defined (GRUB_MACHINE_COREBOOT) || defined (GRUB_MACHINE_MULTIBOOT)
#define GRUB_MACHINE_HAS_ACPI 1 #define GRUB_MACHINE_HAS_ACPI 1
#else #else