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 * Copyright 2016 Nexenta Systems, Inc.
21 */
22
23 #include "shared.h"
24
25 static unsigned long long saved_sector = (unsigned long long)-1;
26
27 static void
disk_read_savesect_func(unsigned long long sector,int offset,int length)28 disk_read_savesect_func (unsigned long long sector, int offset, int length)
29 {
30 saved_sector = sector;
31 }
32
33 void
cmain(void)34 cmain (void)
35 {
36 grub_printf ("\n\nGRUB loading, please wait...\n");
37
38 /*
39 * Here load the true second-stage boot-loader.
40 */
41
42 if (grub_open (config_file))
43 {
44 int ret;
45
46 disk_read_hook = disk_read_savesect_func;
47 grub_read ((char *) 0x8000, SECTOR_SIZE * 2);
48 disk_read_hook = NULL;
49
50 /* Sanity check: catch an internal error. */
51 if (saved_sector == (unsigned int)-1)
52 {
53 grub_printf ("internal error: the second sector of Stage 2 is unknown.");
54 stop ();
55 }
56
57 ret = grub_read ((char *) 0x8000 + SECTOR_SIZE * 2, -1);
58
59 grub_close ();
60
61 if (ret)
62 chain_stage2 (0, 0x8200, saved_sector);
63 }
64
65 /*
66 * If not, then print error message and die.
67 */
68
69 print_error ();
70
71 stop ();
72 }
73