stage1_5.c revision 1b8adde7ba7d5e04395c141c5400dc2cffd7d809
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki/*
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * GRUB -- GRand Unified Bootloader
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * Copyright (C) 2001,2002 Free Software Foundation, Inc.
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki *
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * This program is free software; you can redistribute it and/or modify
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * it under the terms of the GNU General Public License as published by
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * the Free Software Foundation; either version 2 of the License, or
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * (at your option) any later version.
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki *
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * This program is distributed in the hope that it will be useful,
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * but WITHOUT ANY WARRANTY; without even the implied warranty of
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * GNU General Public License for more details.
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki *
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * You should have received a copy of the GNU General Public License
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * along with this program; if not, write to the Free Software
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki#include "shared.h"
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic unsigned int saved_sector = (unsigned int)-1;
cb851c14591d546883d36d5a8c0d2d8cb55cce33fw
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkistatic void
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkidisk_read_savesect_func (unsigned int sector, int offset, int length)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki saved_sector = sector;
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki}
a90d965d832a5578dbfc2eadd1617e8cccf25264fw
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkivoid
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenkicmain (void)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki{
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki grub_printf ("\n\nGRUB loading, please wait...\n");
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /*
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw * Here load the true second-stage boot-loader.
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw */
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw if (grub_open (config_file))
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw {
cb851c14591d546883d36d5a8c0d2d8cb55cce33fw int ret;
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw disk_read_hook = disk_read_savesect_func;
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw grub_read ((char *) 0x8000, SECTOR_SIZE * 2);
a90d965d832a5578dbfc2eadd1617e8cccf25264fw disk_read_hook = NULL;
a90d965d832a5578dbfc2eadd1617e8cccf25264fw
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw /* Sanity check: catch an internal error. */
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw if (saved_sector == (unsigned int)-1)
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw {
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw grub_printf ("internal error: the second sector of Stage 2 is unknown.");
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki stop ();
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki ret = grub_read ((char *) 0x8000 + SECTOR_SIZE * 2, -1);
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki grub_close ();
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki if (ret)
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki chain_stage2 (0, 0x8200, saved_sector);
d2b9c6763c7b3aad7a4c2609ca71e0b02114bca9fw }
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki /*
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki * If not, then print error message and die.
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki */
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki print_error ();
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki stop ();
4c5e0fde93352f23abc94e445999402e38b91268vivek}
0d63ce2b32a9e1cc8ed71d4d92536c44d66a530avenki