15b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 25b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * GRUB -- GRand Unified Bootloader 35b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Copyright (C) 2001,2002 Free Software Foundation, Inc. 45b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 55b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This program is free software; you can redistribute it and/or modify 65b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * it under the terms of the GNU General Public License as published by 75b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * the Free Software Foundation; either version 2 of the License, or 85b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * (at your option) any later version. 95b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This program is distributed in the hope that it will be useful, 115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of 125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * GNU General Public License for more details. 145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * You should have received a copy of the GNU General Public License 165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * along with this program; if not, write to the Free Software 175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include "shared.h" 215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int saved_sector = -1; 235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void 255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectdisk_read_savesect_func (int sector, int offset, int length) 265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project saved_sector = sector; 285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectcmain (void) 325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project grub_printf ("\n\nGRUB loading, please wait...\n"); 345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* 365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Here load the true second-stage boot-loader. 375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (grub_open (config_file)) 405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int ret; 425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project disk_read_hook = disk_read_savesect_func; 445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project grub_read ((char *) 0x8000, SECTOR_SIZE * 2); 455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project disk_read_hook = NULL; 465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Sanity check: catch an internal error. */ 485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (saved_sector == -1) 495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project grub_printf ("internal error: the second sector of Stage 2 is unknown."); 515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project stop (); 525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ret = grub_read ((char *) 0x8000 + SECTOR_SIZE * 2, -1); 555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project grub_close (); 575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (ret) 595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project chain_stage2 (0, 0x8200, saved_sector); 605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* 635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * If not, then print error message and die. 645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project print_error (); 675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project stop (); 695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 70