Home | History | Annotate | Download | only in stage2
      1 /*
      2  *  GRUB  --  GRand Unified Bootloader
      3  *  Copyright (C) 2001,2002  Free Software Foundation, Inc.
      4  *
      5  *  This program is free software; you can redistribute it and/or modify
      6  *  it under the terms of the GNU General Public License as published by
      7  *  the Free Software Foundation; either version 2 of the License, or
      8  *  (at your option) any later version.
      9  *
     10  *  This program is distributed in the hope that it will be useful,
     11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13  *  GNU General Public License for more details.
     14  *
     15  *  You should have received a copy of the GNU General Public License
     16  *  along with this program; if not, write to the Free Software
     17  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
     18  */
     19 
     20 #include "shared.h"
     21 
     22 static int saved_sector = -1;
     23 
     24 static void
     25 disk_read_savesect_func (int sector, int offset, int length)
     26 {
     27   saved_sector = sector;
     28 }
     29 
     30 void
     31 cmain (void)
     32 {
     33   grub_printf ("\n\nGRUB loading, please wait...\n");
     34 
     35   /*
     36    *  Here load the true second-stage boot-loader.
     37    */
     38 
     39   if (grub_open (config_file))
     40     {
     41       int ret;
     42 
     43       disk_read_hook = disk_read_savesect_func;
     44       grub_read ((char *) 0x8000, SECTOR_SIZE * 2);
     45       disk_read_hook = NULL;
     46 
     47       /* Sanity check: catch an internal error.  */
     48       if (saved_sector == -1)
     49 	{
     50 	  grub_printf ("internal error: the second sector of Stage 2 is unknown.");
     51 	  stop ();
     52 	}
     53 
     54       ret = grub_read ((char *) 0x8000 + SECTOR_SIZE * 2, -1);
     55 
     56       grub_close ();
     57 
     58       if (ret)
     59 	chain_stage2 (0, 0x8200, saved_sector);
     60     }
     61 
     62   /*
     63    *  If not, then print error message and die.
     64    */
     65 
     66   print_error ();
     67 
     68   stop ();
     69 }
     70