/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2007,2008,2009 Free Software Foundation, Inc.
*
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GRUB is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GRUB. If not, see <http://www.gnu.org/licenses/>.
*/
#ifdef GRUB_MACHINE_PCBIOS
#endif
#ifdef GRUB_MACHINE_EFI
#endif
#include <grub/multiboot.h>
#include <grub/partition.h>
#include <grub/relocator.h>
/* The bits in the required part of flags field we don't support. */
struct module
{
char *cmdline;
int cmdline_size;
};
static unsigned modcnt;
static int bootdev_set;
static unsigned elf_sec_shstrndx;
static void *elf_sections;
{
char *buffer;
if (!buffer)
return grub_errno;
if (len < 32)
{
}
/* Look for the multiboot header in the buffer. The header should
be at least 12 bytes and aligned on a 4-byte boundary. */
{
break;
}
if (header == 0)
{
}
{
return grub_error (GRUB_ERR_UNKNOWN_OS,
}
{
void *source;
if (header->bss_end_addr)
else
if (err)
{
return err;
}
{
return grub_errno;
}
if (grub_errno)
{
return grub_errno;
}
if (header->bss_end_addr)
}
else
{
if (err)
{
return err;
}
}
{
{
case 1:
0, 0, 0, 0);
break;
case 0:
break;
default:
"unsupported graphical mode type %d",
break;
}
}
else
0, 0, 0, 0);
return err;
}
#endif
static grub_size_t
grub_multiboot_get_mbi_size (void)
{
+ grub_get_multiboot_mmap_count () * sizeof (struct multiboot_mmap_entry)
+ 256 * sizeof (struct multiboot_color)
+ sizeof (struct grub_vbe_info_block)
+ sizeof (struct grub_vbe_mode_info_block)
#endif
{
break;
}
return ret;
}
/* Fill previously allocated Multiboot mmap. */
static void
{
{
switch (type)
{
case GRUB_MEMORY_AVAILABLE:
break;
case GRUB_MEMORY_ACPI:
break;
case GRUB_MEMORY_NVS:
break;
case GRUB_MEMORY_BADRAM:
break;
default:
break;
}
mmap_entry++;
return 0;
}
}
static grub_err_t
{
if (status != GRUB_VBE_STATUS_OK)
ptrorig += sizeof (struct grub_vbe_info_block);
ptrdest += sizeof (struct grub_vbe_info_block);
#else
mbi->vbe_control_info = 0;
#endif
if (status != GRUB_VBE_STATUS_OK)
#else
vbe_mode = 3;
#endif
/* get_mode_info isn't available for mode 3. */
if (vbe_mode == 3)
{
}
else
{
if (status != GRUB_VBE_STATUS_OK)
sizeof (struct grub_vbe_mode_info_block));
#endif
}
ptrorig += sizeof (struct grub_vbe_mode_info_block);
ptrdest += sizeof (struct grub_vbe_mode_info_block);
&mbi->vbe_interface_len);
#endif
{
}
return GRUB_ERR_NONE;
}
#endif
static grub_err_t
{
void *framebuffer;
if (err)
{
grub_print_error ();
}
if (driv_id == GRUB_VIDEO_DRIVER_NONE)
#else
if (driv_id == GRUB_VIDEO_DRIVER_NONE)
return GRUB_ERR_NONE;
#endif
if (err)
return err;
{
unsigned i;
for (i = 0; i < mbi->framebuffer_palette_num_colors; i++)
{
}
* sizeof (struct multiboot_color);
* sizeof (struct multiboot_color);
}
else
{
}
if (driv_id == GRUB_VIDEO_DRIVER_VBE)
#endif
return GRUB_ERR_NONE;
}
{
unsigned i;
bufsize, 4,
if (err)
return err;
#ifdef GRUB_MACHINE_PCBIOS
{
if (grub_apm_get_info (&info))
{
}
}
#endif
if (modcnt)
{
{
}
}
else
{
mbi->mods_count = 0;
}
* sizeof (struct multiboot_mmap_entry);
/* Convert from bytes to kilobytes. */
if (bootdev_set)
{
}
{
{
break;
}
}
if (elf_sec_num)
{
}
if (err)
{
grub_print_error ();
}
{
* sizeof (struct multiboot_color);
* sizeof (struct multiboot_color);
}
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
#ifdef GRUB_MACHINE_EFI
if (err)
return err;
#endif
return GRUB_ERR_NONE;
}
void
{
elf_sec_num = num;
elf_sections = data;
}
void
grub_multiboot_free_mbi (void)
{
cmdline_size = 0;
total_modcmd = 0;
modcnt = 0;
bootdev_set = 0;
{
}
modules_last = NULL;
elf_sections = NULL;
elf_sec_entsize = 0;
elf_sec_num = 0;
}
{
char *p;
int i;
for (i = 0; i < argc; i++)
if (len == 0)
len = 1;
if (! cmdline)
return grub_errno;
cmdline_size = len;
for (i = 0; i < argc; i++)
{
p = grub_stpcpy (p, argv[i]);
*(p++) = ' ';
}
/* Remove the space after the last word. */
if (p != cmdline)
p--;
*p = '\0';
return GRUB_ERR_NONE;
}
{
char *p;
int i;
if (!newmod)
return grub_errno;
for (i = 0; i < argc; i++)
if (len == 0)
len = 1;
{
return grub_errno;
}
for (i = 0; i < argc; i++)
{
p = grub_stpcpy (p, argv[i]);
*(p++) = ' ';
}
/* Remove the space after the last word. */
p--;
*p = '\0';
if (modules_last)
else
{
}
modcnt++;
return GRUB_ERR_NONE;
}
void
grub_multiboot_set_bootdev (void)
{
#ifdef GRUB_MACHINE_PCBIOS
#else
biosdev = 0xffffffff;
#endif
if (biosdev == 0xffffffff)
return;
dev = grub_device_open (0);
{
{
}
else
}
if (dev)
bootdev_set = 1;
}