15b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* common.c - miscellaneous shared variables and routines */ 25b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 35b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * GRUB -- GRand Unified Bootloader 45b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Copyright (C) 1999,2000,2001,2002,2004 Free Software Foundation, Inc. 55b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 65b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This program is free software; you can redistribute it and/or modify 75b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * it under the terms of the GNU General Public License as published by 85b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * the Free Software Foundation; either version 2 of the License, or 95b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * (at your option) any later version. 105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This program is distributed in the hope that it will be useful, 125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of 135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * GNU General Public License for more details. 155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * You should have received a copy of the GNU General Public License 175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * along with this program; if not, write to the Free Software 185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <shared.h> 225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef SUPPORT_DISKLESS 245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# define GRUB 1 255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# include <etherboot.h> 265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Shared BIOS/boot data. 305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct multiboot_info mbi; 335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectunsigned long saved_drive; 345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectunsigned long saved_partition; 355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectunsigned long cdrom_drive; 365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifndef STAGE1_5 375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectunsigned long saved_mem_upper; 385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* This saves the maximum size of extended memory (in KB). */ 405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectunsigned long extended_memory; 415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Error code stuff. 455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgrub_error_t errnum = ERR_NONE; 485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifndef STAGE1_5 505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectchar *err_list[] = 525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_NONE] = 0, 545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_BAD_ARGUMENT] = "Invalid argument", 555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_BAD_FILENAME] = 565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project "Filename must be either an absolute pathname or blocklist", 575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_BAD_FILETYPE] = "Bad file or directory type", 585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_BAD_GZIP_DATA] = "Bad or corrupt data while decompressing file", 595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_BAD_GZIP_HEADER] = "Bad or incompatible header in compressed file", 605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_BAD_PART_TABLE] = "Partition table invalid or corrupt", 615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_BAD_VERSION] = "Mismatched or corrupt version of stage1/stage2", 625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_BELOW_1MB] = "Loading below 1MB is not supported", 635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_BOOT_COMMAND] = "Kernel must be loaded before booting", 645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_BOOT_FAILURE] = "Unknown boot failure", 655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_BOOT_FEATURES] = "Unsupported Multiboot features requested", 665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_DEV_FORMAT] = "Unrecognized device string", 675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_DEV_NEED_INIT] = "Device not initialized yet", 685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_DEV_VALUES] = "Invalid device requested", 695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_EXEC_FORMAT] = "Invalid or unsupported executable format", 705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_FILELENGTH] = 715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project "Filesystem compatibility error, cannot read whole file", 725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_FILE_NOT_FOUND] = "File not found", 735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_FSYS_CORRUPT] = "Inconsistent filesystem structure", 745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_FSYS_MOUNT] = "Cannot mount selected partition", 755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_GEOM] = "Selected cylinder exceeds maximum supported by BIOS", 765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_NEED_LX_KERNEL] = "Linux kernel must be loaded before initrd", 775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_NEED_MB_KERNEL] = "Multiboot kernel must be loaded before modules", 785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_NO_DISK] = "Selected disk does not exist", 795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_NO_DISK_SPACE] = "No spare sectors on the disk", 805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_NO_PART] = "No such partition", 815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_NUMBER_OVERFLOW] = "Overflow while parsing number", 825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_NUMBER_PARSING] = "Error while parsing number", 835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_OUTSIDE_PART] = "Attempt to access block outside partition", 845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_PRIVILEGED] = "Must be authenticated", 855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_READ] = "Disk read error", 865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_SYMLINK_LOOP] = "Too many symbolic links", 875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_UNALIGNED] = "File is not sector aligned", 885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_UNRECOGNIZED] = "Unrecognized command", 895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_WONT_FIT] = "Selected item cannot fit into memory", 905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project [ERR_WRITE] = "Disk write error", 915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}; 925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* static for BIOS memory map fakery */ 955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic struct AddrRangeDesc fakemap[3] = 965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project {20, 0, 0, MB_ARD_MEMORY}, 985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project {20, 0x100000, 0, MB_ARD_MEMORY}, 995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project {20, 0x1000000, 0, MB_ARD_MEMORY} 1005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project}; 1015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* A big problem is that the memory areas aren't guaranteed to be: 1035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project (1) contiguous, (2) sorted in ascending order, or (3) non-overlapping. 1045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project Thus this kludge. */ 1055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic unsigned long 1065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectmmap_avail_at (unsigned long bottom) 1075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 1085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned long long top; 1095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned long addr; 1105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int cont; 1115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project top = bottom; 1135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project do 1145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 1155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for (cont = 0, addr = mbi.mmap_addr; 1165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project addr < mbi.mmap_addr + mbi.mmap_length; 1175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project addr += *((unsigned long *) addr) + 4) 1185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 1195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct AddrRangeDesc *desc = (struct AddrRangeDesc *) addr; 1205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (desc->Type == MB_ARD_MEMORY 1225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project && desc->BaseAddr <= top 1235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project && desc->BaseAddr + desc->Length > top) 1245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 1255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project top = desc->BaseAddr + desc->Length; 1265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project cont++; 1275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 1285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 1295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 1305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project while (cont); 1315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* For now, GRUB assumes 32bits addresses, so... */ 1335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (top > 0xFFFFFFFF) 1345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project top = 0xFFFFFFFF; 1355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return (unsigned long) top - bottom; 1375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 1385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif /* ! STAGE1_5 */ 1395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* This queries for BIOS information. */ 1415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 1425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectinit_bios_info (void) 1435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 1445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifndef STAGE1_5 1455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned long cont, memtmp, addr; 1465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int drive; 1475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 1485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* 1505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Get information from BIOS on installed RAM. 1515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 1525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mbi.mem_lower = get_memsize (0); 1545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mbi.mem_upper = get_memsize (1); 1555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifndef STAGE1_5 1575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* 1585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * We need to call this somewhere before trying to put data 1595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * above 1 MB, since without calling it, address line 20 will be wired 1605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * to 0. Not too desirable. 1615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 1625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project gateA20 (1); 1645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Store the size of extended memory in EXTENDED_MEMORY, in order to 1665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project tell it to non-Multiboot OSes. */ 1675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project extended_memory = mbi.mem_upper; 1685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* 1705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * The "mbi.mem_upper" variable only recognizes upper memory in the 1715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * first memory region. If there are multiple memory regions, 1725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * the rest are reported to a Multiboot-compliant OS, but otherwise 1735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * unused by GRUB. 1745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 1755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project addr = get_code_end (); 1775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mbi.mmap_addr = addr; 1785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mbi.mmap_length = 0; 1795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project cont = 0; 1805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project do 1825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 1835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project cont = get_mmap_entry ((void *) addr, cont); 1845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* If the returned buffer's length is zero, quit. */ 1865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (! *((unsigned long *) addr)) 1875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 1885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mbi.mmap_length += *((unsigned long *) addr) + 4; 1905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project addr += *((unsigned long *) addr) + 4; 1915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 1925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project while (cont); 1935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (mbi.mmap_length) 1955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 1965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned long long max_addr; 1975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* 1995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This is to get the lower memory, and upper memory (up to the 2005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * first memory hole), into the "mbi.mem_{lower,upper}" 2015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * elements. This is for OS's that don't care about the memory 2025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * map, but might care about total RAM available. 2035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 2045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mbi.mem_lower = mmap_avail_at (0) >> 10; 2055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mbi.mem_upper = mmap_avail_at (0x100000) >> 10; 2065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Find the maximum available address. Ignore any memory holes. */ 2085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for (max_addr = 0, addr = mbi.mmap_addr; 2095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project addr < mbi.mmap_addr + mbi.mmap_length; 2105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project addr += *((unsigned long *) addr) + 4) 2115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 2125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct AddrRangeDesc *desc = (struct AddrRangeDesc *) addr; 2135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (desc->Type == MB_ARD_MEMORY && desc->Length > 0 2155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project && desc->BaseAddr + desc->Length > max_addr) 2165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project max_addr = desc->BaseAddr + desc->Length; 2175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 2185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project extended_memory = (max_addr - 0x100000) >> 10; 2205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 2215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else if ((memtmp = get_eisamemsize ()) != -1) 2225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 2235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project cont = memtmp & ~0xFFFF; 2245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project memtmp = memtmp & 0xFFFF; 2255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (cont != 0) 2275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project extended_memory = (cont >> 10) + 0x3c00; 2285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else 2295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project extended_memory = memtmp; 2305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (!cont || (memtmp == 0x3c00)) 2325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project memtmp += (cont >> 10); 2335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else 2345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 2355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* XXX should I do this at all ??? */ 2365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mbi.mmap_addr = (unsigned long) fakemap; 2385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mbi.mmap_length = sizeof (fakemap); 2395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project fakemap[0].Length = (mbi.mem_lower << 10); 2405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project fakemap[1].Length = (memtmp << 10); 2415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project fakemap[2].Length = cont; 2425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 2435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mbi.mem_upper = memtmp; 2455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 2465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project saved_mem_upper = mbi.mem_upper; 2485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Get the drive info. */ 2505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* FIXME: This should be postponed until a Multiboot kernel actually 2515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project requires it, because this could slow down the start-up 2525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unreasonably. */ 2535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mbi.drives_length = 0; 2545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mbi.drives_addr = addr; 2555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* For now, GRUB doesn't probe floppies, since it is trivial to map 2575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project floppy drives to BIOS drives. */ 2585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for (drive = 0x80; drive < 0x88; drive++) 2595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 2605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct geometry geom; 2615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct drive_info *info = (struct drive_info *) addr; 2625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned short *port; 2635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Get the geometry. This ensures that the drive is present. */ 2655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (get_diskinfo (drive, &geom)) 2665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 2675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Clean out the I/O map. */ 2695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project grub_memset ((char *) io_map, 0, 2705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project IO_MAP_SIZE * sizeof (unsigned short)); 2715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Disable to probe I/O ports temporarily, because this doesn't 2735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project work with some BIOSes (maybe they are too buggy). */ 2745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#if 0 2755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Track the int13 handler. */ 2765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project track_int13 (drive); 2775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 2785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Set the information. */ 2805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project info->drive_number = drive; 2815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project info->drive_mode = ((geom.flags & BIOSDISK_FLAG_LBA_EXTENSION) 2825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ? MB_DI_LBA_MODE : MB_DI_CHS_MODE); 2835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project info->drive_cylinders = geom.cylinders; 2845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project info->drive_heads = geom.heads; 2855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project info->drive_sectors = geom.sectors; 2865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project addr += sizeof (struct drive_info); 2885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for (port = io_map; *port; port++, addr += sizeof (unsigned short)) 2895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *((unsigned short *) addr) = *port; 2905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project info->size = addr - (unsigned long) info; 2925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mbi.drives_length += info->size; 2935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 2945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Get the ROM configuration table by INT 15, AH=C0h. */ 2965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mbi.config_table = get_rom_config_table (); 2975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Set the boot loader name. */ 2995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mbi.boot_loader_name = (unsigned long) "GNU GRUB " VERSION; 3005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Get the APM BIOS table. */ 3025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project get_apm_info (); 3035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (apm_bios_info.version) 3045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mbi.apm_table = (unsigned long) &apm_bios_info; 3055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* 3075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Initialize other Multiboot Info flags. 3085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 3095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mbi.flags = (MB_INFO_MEMORY | MB_INFO_CMDLINE | MB_INFO_BOOTDEV 3115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project | MB_INFO_DRIVE_INFO | MB_INFO_CONFIG_TABLE 3125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project | MB_INFO_BOOT_LOADER_NAME); 3135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (apm_bios_info.version) 3155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project mbi.flags |= MB_INFO_APM_TABLE; 3165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif /* STAGE1_5 */ 3185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Set boot drive and partition. */ 3205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project saved_drive = boot_drive; 3215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project saved_partition = install_partition; 3225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Set cdrom drive. */ 3245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 3255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct geometry geom; 3265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Get the geometry. */ 3285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (get_diskinfo (boot_drive, &geom) 3295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project || ! (geom.flags & BIOSDISK_FLAG_CDROM)) 3305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project cdrom_drive = GRUB_INVALID_DRIVE; 3315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else 3325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project cdrom_drive = boot_drive; 3335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 3345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Start main routine here. */ 3365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project cmain (); 3375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 338