/* linux.c - boot Linux zImage or bzImage */
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2007,2008,2009,2010 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/>.
*/
GRUB_MOD_LICENSE ("GPLv3+");
static int loaded;
static char *grub_linux_real_chunk;
static grub_err_t
grub_linux16_boot (void)
{
grub_video_set_mode ("text", 0, 0);
grub_stop_floppy ();
}
static grub_err_t
grub_linux_unload (void)
{
loaded = 0;
return GRUB_ERR_NONE;
}
static grub_err_t
{
int i;
char *grub_linux_prot_chunk;
if (argc == 0)
{
goto fail;
}
if (! file)
goto fail;
{
if (!grub_errno)
argv[0]);
goto fail;
}
{
goto fail;
}
{
goto fail;
}
linux_mem_size = 0;
maximal_cmdline_size = 256;
{
/* Put the real mode part at as a high location as possible. */
/* But it must not exceed the traditional area. */
{
}
else
{
}
}
else
{
/* Your kernel is quite old... */
}
/* If SETUP_SECTS is not set, set it to the default (4). */
if (! setup_sects)
if (! grub_linux_is_bzimage
{
(char *) GRUB_LINUX_ZIMAGE_ADDR + grub_linux16_prot_size,
goto fail;
}
> grub_mmap_get_lower ())
{
"too small lower memory (0x%x > 0x%x)",
(int) grub_mmap_get_lower ());
goto fail;
}
grub_printf (" [Linux-%s, setup=0x%x, size=0x%x]\n",
relocator = grub_relocator_new ();
if (!relocator)
goto fail;
for (i = 1; i < argc; i++)
{
/* Video mode selection support. */
else
if (grub_errno)
goto fail;
}
{
if (grub_errno)
{
linux_mem_size = 0;
}
else
{
int shift = 0;
switch (grub_tolower (val[0]))
{
case 'g':
shift += 10;
case 'm':
shift += 10;
case 'k':
shift += 10;
default:
break;
}
/* Check an overflow. */
linux_mem_size = 0;
else
}
}
{
if (err)
return err;
}
/* Put the real mode code at the temporary address. */
{
if (!grub_errno)
argv[0]);
goto fail;
}
/* Clear the heap space. */
0,
<< GRUB_DISK_SECTOR_BITS));
/* Create kernel command line. */
LINUX_IMAGE, sizeof (LINUX_IMAGE));
(char *)grub_linux_real_chunk
- (sizeof (LINUX_IMAGE) - 1));
else
{
if (err)
return err;
}
argv[0]);
if (grub_errno == GRUB_ERR_NONE)
{
loaded = 1;
}
fail:
if (file)
if (grub_errno != GRUB_ERR_NONE)
{
loaded = 0;
}
return grub_errno;
}
static grub_err_t
{
int i, nfiles = 0;
if (argc == 0)
{
goto fail;
}
if (!loaded)
{
goto fail;
}
{
goto fail;
}
/* Get the highest address available for the initrd. */
{
/* XXX in reality, Linux specifies a bogus value, so
it is necessary to make sure that ADDR_MAX does not exceed
0x3fffffff. */
}
else
/* Linux 2.3.xx has a bug in the memory range check, so avoid
the last page.
Linux 2.2.xx has a bug in the memory range check, which is
worse than that of Linux 2.3.xx, so avoid the last 64kb. */
addr_max -= 0x10000;
if (!files)
goto fail;
for (i = 0; i < argc; i++)
{
if (! files[i])
goto fail;
nfiles++;
}
{
size, 0x1000,
if (err)
return err;
}
ptr = initrd_chunk;
for (i = 0; i < nfiles; i++)
{
{
if (!grub_errno)
argv[i]);
goto fail;
}
}
fail:
for (i = 0; i < nfiles; i++)
grub_file_close (files[i]);
return grub_errno;
}
{
0, N_("Load Linux."));
0, N_("Load initrd."));
}
{
}