15b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* asmstub.c - a version of shared_src/asm.S that works under Unix */ 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/* Try to use glibc's transparant LFS support. */ 225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define _LARGEFILE_SOURCE 1 235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* lseek becomes synonymous with lseek64. */ 245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define _FILE_OFFSET_BITS 64 255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Simulator entry point. */ 275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint grub_stage2 (void); 285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <stdlib.h> 305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <string.h> 315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <ctype.h> 325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <assert.h> 335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <stdio.h> 345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <sys/types.h> 355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <sys/stat.h> 365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <fcntl.h> 375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <time.h> 385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <errno.h> 395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <string.h> 405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <unistd.h> 415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <setjmp.h> 425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <sys/time.h> 435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <termios.h> 445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <signal.h> 455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef __linux__ 475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# include <sys/ioctl.h> /* ioctl */ 485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# if !defined(__GLIBC__) || \ 495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ((__GLIBC__ < 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ < 1))) 505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Maybe libc doesn't have large file support. */ 515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# include <linux/unistd.h> /* _llseek */ 525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# endif /* (GLIBC < 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR < 1)) */ 535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# ifndef BLKFLSBUF 545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# define BLKFLSBUF _IO (0x12,97) /* flush buffer cache */ 555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# endif /* ! BLKFLSBUF */ 565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif /* __linux__ */ 575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* We want to prevent any circularararity in our stubs, as well as 595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project libc name clashes. */ 605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define WITHOUT_LIBC_STUBS 1 615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <shared.h> 625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <device.h> 635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <serial.h> 645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#include <term.h> 655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Simulated memory sizes. */ 675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define EXTENDED_MEMSIZE (3 * 1024 * 1024) /* 3MB */ 685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define CONVENTIONAL_MEMSIZE (640 * 1024) /* 640kB */ 695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectunsigned long install_partition = 0x20000; 715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectunsigned long boot_drive = 0; 725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint saved_entryno = 0; 735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectchar version_string[] = VERSION; 745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectchar config_file[128] = "/boot/grub/menu.lst"; /* FIXME: arbitrary */ 755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectunsigned long linux_text_len = 0; 765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectchar *linux_data_tmp_addr = 0; 775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectchar *linux_data_real_addr = 0; 785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectunsigned short io_map[IO_MAP_SIZE]; 795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct apm_info apm_bios_info; 805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Emulation requirements. */ 825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectchar *grub_scratch_mem = 0; 835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstruct geometry *disks = 0; 855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* The map between BIOS drives and UNIX device file names. */ 875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectchar **device_map = 0; 885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* The jump buffer for exiting correctly. */ 905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic jmp_buf env_for_exit; 915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* The current color for console. */ 935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint console_current_color = A_NORMAL; 945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* The file descriptor for a serial device. */ 965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int serial_fd = -1; 975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* The file name of a serial device. */ 995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic char *serial_device = 0; 1005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef SIMULATE_SLOWNESS_OF_SERIAL 1025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* The speed of a serial device. */ 1035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic unsigned int serial_speed; 1045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif /* SIMULATE_SLOWNESS_OF_SERIAL */ 1055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* The main entry point into this mess. */ 1075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint 1085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgrub_stage2 (void) 1095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 1105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* These need to be static, because they survive our stack transitions. */ 1115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project static int status = 0; 1125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project static char *realstack; 1135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project char *scratch, *simstack; 1145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int i; 1155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project auto void doit (void); 1175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* We need a nested function so that we get a clean stack frame, 1195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project regardless of how the code is optimized. */ 1205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project void doit (void) 1215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 1225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Make sure our stack lives in the simulated memory area. */ 1235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project asm volatile ("movl %%esp, %0\n\tmovl %1, %%esp\n" 1245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project : "=&r" (realstack) : "r" (simstack)); 1255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Do a setjmp here for the stop command. */ 1275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (! setjmp (env_for_exit)) 1285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 1295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Actually enter the generic stage2 code. */ 1305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project status = 0; 1315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project init_bios_info (); 1325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 1335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else 1345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 1355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* If ERRNUM is non-zero, then set STATUS to non-zero. */ 1365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (errnum) 1375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project status = 1; 1385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 1395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Replace our stack before we use any local variables. */ 1415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project asm volatile ("movl %0, %%esp\n" : : "r" (realstack)); 1425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 1435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project assert (grub_scratch_mem == 0); 1455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project scratch = malloc (0x100000 + EXTENDED_MEMSIZE + 15); 1465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project assert (scratch); 1475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project grub_scratch_mem = (char *) ((((int) scratch) >> 4) << 4); 1485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* FIXME: simulate the memory holes using mprot, if available. */ 1505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project assert (disks == 0); 1525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project disks = malloc (NUM_DISKS * sizeof (*disks)); 1535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project assert (disks); 1545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Initialize DISKS. */ 1555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for (i = 0; i < NUM_DISKS; i++) 1565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project disks[i].flags = -1; 1575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (! init_device_map (&device_map, device_map_file, floppy_disks)) 1595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 1; 1605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Check some invariants. */ 1625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project assert ((SCRATCHSEG << 4) == SCRATCHADDR); 1635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project assert ((BUFFERSEG << 4) == BUFFERADDR); 1645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project assert (BUFFERADDR + BUFFERLEN == SCRATCHADDR); 1655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project assert (FSYS_BUF % 16 == 0); 1665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project assert (FSYS_BUF + FSYS_BUFLEN == BUFFERADDR); 1675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef HAVE_LIBCURSES 1695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Get into char-at-a-time mode. */ 1705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (use_curses) 1715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 1725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project initscr (); 1735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project cbreak (); 1745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project noecho (); 1755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project nonl (); 1765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project scrollok (stdscr, TRUE); 1775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project keypad (stdscr, TRUE); 1785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project wtimeout (stdscr, 100); 1795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project signal (SIGWINCH, SIG_IGN); 1805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 1815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 1825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Make sure that actual writing is done. */ 1845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project sync (); 1855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Set our stack, and go for it. */ 1875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project simstack = (char *) PROTSTACKINIT; 1885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project doit (); 1895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* I don't know if this is necessary really. */ 1915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project sync (); 1925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef HAVE_LIBCURSES 1945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (use_curses) 1955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project endwin (); 1965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 1975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 1985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Close off the file descriptors we used. */ 1995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for (i = 0; i < NUM_DISKS; i ++) 2005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (disks[i].flags != -1) 2015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 2025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef __linux__ 2035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* In Linux, invalidate the buffer cache. In other OSes, reboot 2045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project is one of the solutions... */ 2055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ioctl (disks[i].flags, BLKFLSBUF, 0); 2065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#else 2075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project# warning "In your operating system, the buffer cache will not be flushed." 2085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 2095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project close (disks[i].flags); 2105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 2115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (serial_fd >= 0) 2135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project close (serial_fd); 2145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Release memory. */ 2165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project restore_device_map (device_map); 2175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project device_map = 0; 2185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project free (disks); 2195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project disks = 0; 2205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project free (scratch); 2215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project grub_scratch_mem = 0; 2225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (serial_device) 2245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project free (serial_device); 2255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project serial_device = 0; 2265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Ahh... at last we're ready to return to caller. */ 2285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return status; 2295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 2305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Assign DRIVE to a device name DEVICE. */ 2325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 2335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectassign_device_name (int drive, const char *device) 2345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 2355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* If DRIVE is already assigned, free it. */ 2365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (device_map[drive]) 2375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project free (device_map[drive]); 2385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* If the old one is already opened, close it. */ 2405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (disks[drive].flags != -1) 2415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 2425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project close (disks[drive].flags); 2435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project disks[drive].flags = -1; 2445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 2455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Assign DRIVE to DEVICE. */ 2475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (! device) 2485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project device_map[drive] = 0; 2495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else 2505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project device_map[drive] = strdup (device); 2515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 2525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 2545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstop (void) 2555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 2565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef HAVE_LIBCURSES 2575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (use_curses) 2585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project endwin (); 2595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 2605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Jump to doit. */ 2625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project longjmp (env_for_exit, 1); 2635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 2645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 2665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgrub_reboot (void) 2675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 2685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project stop (); 2695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 2705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 2725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgrub_halt (int no_apm) 2735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 2745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project stop (); 2755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 2765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* calls for direct boot-loader chaining */ 2785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 2795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectchain_stage1 (unsigned long segment, unsigned long offset, 2805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned long part_table_addr) 2815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 2825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project stop (); 2835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 2845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 2875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectchain_stage2 (unsigned long segment, unsigned long offset, int second_sector) 2885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 2895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project stop (); 2905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 2915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 2935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* do some funky stuff, then boot linux */ 2945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 2955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectlinux_boot (void) 2965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 2975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project stop (); 2985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 2995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* For bzImage kernels. */ 3025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 3035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectbig_linux_boot (void) 3045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 3055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project stop (); 3065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 3075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* booting a multiboot executable */ 3105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 3115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectmulti_boot (int start, int mb_info) 3125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 3135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project stop (); 3145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 3155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* sets it to linear or wired A20 operation */ 3175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 3185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectgateA20 (int linear) 3195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 3205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Nothing to do in the simulator. */ 3215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 3225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Set up the int15 handler. */ 3245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 3255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectset_int15_handler (void) 3265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 3275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Nothing to do in the simulator. */ 3285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 3295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Restore the original int15 handler. */ 3315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 3325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectunset_int15_handler (void) 3335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 3345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Nothing to do in the simulator. */ 3355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 3365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* The key map. */ 3385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectunsigned short bios_key_map[KEY_MAP_SIZE + 1]; 3395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectunsigned short ascii_key_map[KEY_MAP_SIZE + 1]; 3405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Copy MAP to the drive map and set up the int13 handler. */ 3425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 3435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectset_int13_handler (unsigned short *map) 3445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 3455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Nothing to do in the simulator. */ 3465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 3475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint 3495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectget_code_end (void) 3505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 3515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Just return a little area for simulation. */ 3525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return BOOTSEC_LOCATION + (60 * 1024); 3535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 3545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* memory probe routines */ 3575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint 3585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectget_memsize (int type) 3595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 3605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (! type) 3615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return CONVENTIONAL_MEMSIZE >> 10; 3625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else 3635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return EXTENDED_MEMSIZE >> 10; 3645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 3655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* get_eisamemsize() : return packed EISA memory map, lower 16 bits is 3685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * memory between 1M and 16M in 1K parts, upper 16 bits is 3695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * memory above 16M in 64K parts. If error, return -1. 3705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 3715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint 3725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectget_eisamemsize (void) 3735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 3745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return (EXTENDED_MEMSIZE >> 10); 3755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 3765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MMAR_DESC_TYPE_AVAILABLE 1 /* available to OS */ 3795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MMAR_DESC_TYPE_RESERVED 2 /* not available */ 3805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MMAR_DESC_TYPE_ACPI_RECLAIM 3 /* usable by OS after reading ACPI */ 3815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MMAR_DESC_TYPE_ACPI_NVS 4 /* required to save between NVS sessions */ 3825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MMAR_DESC_LENGTH 20 3845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 3855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Fetch the next entry in the memory map and return the continuation 3865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project value. DESC is a pointer to the descriptor buffer, and CONT is the 3875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project previous continuation value (0 to get the first entry in the 3885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project map). */ 3895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint 3905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectget_mmap_entry (struct mmar_desc *desc, int cont) 3915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 3925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Record the memory map statically. */ 3935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project static struct mmar_desc desc_table[] = 3945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 3955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* The conventional memory. */ 3965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 3975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project MMAR_DESC_LENGTH, 3985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 0, 3995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project CONVENTIONAL_MEMSIZE, 4005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project MMAR_DESC_TYPE_AVAILABLE 4015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project }, 4025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* BIOS RAM and ROM (such as video memory). */ 4035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 4045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project MMAR_DESC_LENGTH, 4055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project CONVENTIONAL_MEMSIZE, 4065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 0x100000 - CONVENTIONAL_MEMSIZE, 4075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project MMAR_DESC_TYPE_RESERVED 4085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project }, 4095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* The extended memory. */ 4105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 4115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project MMAR_DESC_LENGTH, 4125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 0x100000, 4135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project EXTENDED_MEMSIZE, 4145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project MMAR_DESC_TYPE_AVAILABLE 4155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 4165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project }; 4175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int num = sizeof (desc_table) / sizeof (*desc_table); 4195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (cont < 0 || cont >= num) 4215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 4225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Should not happen. */ 4235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project desc->desc_len = 0; 4245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 4255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else 4265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 4275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Copy the entry. */ 4285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *desc = desc_table[cont++]; 4295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* If the next entry exists, return the index. */ 4315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (cont < num) 4325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return cont; 4335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 4345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 0; 4365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 4375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Track the int13 handler. */ 4395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 4405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecttrack_int13 (int drive) 4415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 4425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Nothing to do in the simulator. */ 4435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 4445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Get the ROM configuration table. */ 4465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectunsigned long 4475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectget_rom_config_table (void) 4485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 4495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 0; 4505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 4515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Get APM BIOS information. */ 4535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 4545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectget_apm_info (void) 4555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 4565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Nothing to do in the simulator. */ 4575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 4585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Get VBE controller information. */ 4605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint 4615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectget_vbe_controller_info (struct vbe_controller *controller) 4625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 4635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Always fails. */ 4645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 0; 4655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 4665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Get VBE mode information. */ 4685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint 4695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectget_vbe_mode_info (int mode_number, struct vbe_mode *mode) 4705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 4715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Always fails. */ 4725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 0; 4735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 4745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Set VBE mode. */ 4765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint 4775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectset_vbe_mode (int mode_number) 4785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 4795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Always fails. */ 4805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 0; 4815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 4825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* low-level timing info */ 4845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint 4855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectgetrtsecs (void) 4865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 4875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* FIXME: exact value is not important, so just return time_t for now. */ 4885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return time (0); 4895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 4905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint 4925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectcurrticks (void) 4935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 4945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct timeval tv; 4955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project long csecs; 4965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int ticks_per_csec, ticks_per_usec; 4975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 4985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Note: 18.2 ticks/sec. */ 4995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 5005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Get current time. */ 5015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project gettimeofday (&tv, 0); 5025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 5035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Compute centiseconds. */ 5045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project csecs = tv.tv_sec / 10; 5055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 5065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Ticks per centisecond. */ 5075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ticks_per_csec = csecs * 182; 5085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 5095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Ticks per microsecond. */ 5105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ticks_per_usec = (((tv.tv_sec - csecs * 10) * 1000000 + tv.tv_usec) 5115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 182 / 10000000); 5125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 5135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Sum them. */ 5145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return ticks_per_csec + ticks_per_usec; 5155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 5165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 5175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* displays an ASCII character. IBM displays will translate some 5185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project characters to special graphical ones */ 5195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 5205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectconsole_putchar (int c) 5215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 5225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Curses doesn't have VGA fonts. */ 5235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project switch (c) 5245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 5255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case DISP_UL: 5265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project c = ACS_ULCORNER; 5275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 5285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case DISP_UR: 5295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project c = ACS_URCORNER; 5305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 5315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case DISP_LL: 5325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project c = ACS_LLCORNER; 5335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 5345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case DISP_LR: 5355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project c = ACS_LRCORNER; 5365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 5375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case DISP_HORIZ: 5385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project c = ACS_HLINE; 5395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 5405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case DISP_VERT: 5415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project c = ACS_VLINE; 5425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 5435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case DISP_LEFT: 5445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project c = ACS_LARROW; 5455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 5465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case DISP_RIGHT: 5475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project c = ACS_RARROW; 5485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 5495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case DISP_UP: 5505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project c = ACS_UARROW; 5515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 5525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case DISP_DOWN: 5535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project c = ACS_DARROW; 5545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 5555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project default: 5565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 5575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 5585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 5595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef HAVE_LIBCURSES 5605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (use_curses) 5615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 5625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* In ncurses, a newline is treated badly, so we emulate it in our 5635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project own way. */ 5645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (c == '\n') 5655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 5665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int x, y; 5675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 5685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project getyx (stdscr, y, x); 5695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (y + 1 == LINES) 5705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project scroll (stdscr); 5715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else 5725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project move (y + 1, x); 5735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 5745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else if (isprint (c)) 5755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 5765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int x, y; 5775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 5785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project getyx (stdscr, y, x); 5795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (x + 1 == COLS) 5805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 5815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project console_putchar ('\r'); 5825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project console_putchar ('\n'); 5835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 5845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project addch (c | console_current_color); 5855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 5865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else 5875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 5885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project addch (c); 5895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 5905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 5915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef REFRESH_IMMEDIATELY 5925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project refresh (); 5935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 5945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 5955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else 5965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 5975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 5985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* CR is not used in Unix. */ 5995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (c != '\r') 6005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project putchar (c); 6015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 6025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 6035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 6045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* The store for ungetch simulation. This is necessary, because 6055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ncurses-1.9.9g is still used in the world and its ungetch is 6065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project completely broken. */ 6075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef HAVE_LIBCURSES 6085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int save_char = ERR; 6095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 6105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 6115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int 6125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectconsole_translate_key (int c) 6135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 6145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project switch (c) 6155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 6165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case KEY_LEFT: 6175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 2; 6185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case KEY_RIGHT: 6195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 6; 6205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case KEY_UP: 6215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 16; 6225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case KEY_DOWN: 6235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 14; 6245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case KEY_DC: 6255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 4; 6265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case KEY_BACKSPACE: 6275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 8; 6285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case KEY_HOME: 6295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 1; 6305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case KEY_END: 6315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 5; 6325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case KEY_PPAGE: 6335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 7; 6345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case KEY_NPAGE: 6355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 3; 6365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project default: 6375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 6385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 6395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 6405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return c; 6415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 6425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 6435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* like 'getkey', but doesn't wait, returns -1 if nothing available */ 6445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint 6455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectconsole_checkkey (void) 6465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 6475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef HAVE_LIBCURSES 6485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (use_curses) 6495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 6505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int c; 6515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 6525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Check for SAVE_CHAR. This should not be true, because this 6535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project means checkkey is called twice continuously. */ 6545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (save_char != ERR) 6555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return save_char; 6565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 6575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project c = getch (); 6585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* If C is not ERR, then put it back in the input queue. */ 6595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (c != ERR) 6605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project save_char = c; 6615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return console_translate_key (c); 6625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 6635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 6645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 6655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Just pretend they hit the space bar, then read the real key when 6665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project they call getkey. */ 6675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return ' '; 6685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 6695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 6705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* returns packed BIOS/ASCII code */ 6715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint 6725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectconsole_getkey (void) 6735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 6745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int c; 6755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 6765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef HAVE_LIBCURSES 6775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (use_curses) 6785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 6795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* If checkkey has already got a character, then return it. */ 6805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (save_char != ERR) 6815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 6825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project c = save_char; 6835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project save_char = ERR; 6845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return console_translate_key (c); 6855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 6865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 6875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project wtimeout (stdscr, -1); 6885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project c = getch (); 6895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project wtimeout (stdscr, 100); 6905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 6915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else 6925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 6935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project c = getchar (); 6945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 6955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Quit if we get EOF. */ 6965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (c == -1) 6975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project stop (); 6985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 6995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return console_translate_key (c); 7005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 7015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 7025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* returns packed values, LSB+1 is x, LSB is y */ 7035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint 7045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectconsole_getxy (void) 7055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 7065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int y, x; 7075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef HAVE_LIBCURSES 7085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (use_curses) 7095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project getyx (stdscr, y, x); 7105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else 7115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 7125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project y = x = 0; 7135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return (x << 8) | (y & 0xff); 7145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 7155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 7165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 7175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectconsole_gotoxy (int x, int y) 7185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 7195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef HAVE_LIBCURSES 7205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (use_curses) 7215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project move (y, x); 7225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 7235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 7245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 7255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* low-level character I/O */ 7265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 7275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectconsole_cls (void) 7285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 7295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef HAVE_LIBCURSES 7305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (use_curses) 7315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project clear (); 7325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 7335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 7345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 7355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 7365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectconsole_setcolorstate (color_state state) 7375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 7385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project console_current_color = 7395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project (state == COLOR_STATE_HIGHLIGHT) ? A_REVERSE : A_NORMAL; 7405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 7415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 7425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 7435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectconsole_setcolor (int normal_color, int highlight_color) 7445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 7455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Nothing to do. */ 7465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 7475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 7485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint 7495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectconsole_setcursor (int on) 7505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 7515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 1; 7525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 7535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 7545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Low-level disk I/O. Our stubbed version just returns a file 7555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project descriptor, not the actual geometry. */ 7565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint 7575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectget_diskinfo (int drive, struct geometry *geometry) 7585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 7595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* FIXME: this function is truly horrid. We try opening the device, 7605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project then severely abuse the GEOMETRY->flags field to pass a file 7615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project descriptor to biosdisk. Thank God nobody's looking at this comment, 7625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project or my reputation would be ruined. --Gord */ 7635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 7645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* See if we have a cached device. */ 7655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (disks[drive].flags == -1) 7665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 7675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* The unpartitioned device name: /dev/XdX */ 7685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project char *devname = device_map[drive]; 7695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project char buf[512]; 7705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 7715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (! devname) 7725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return -1; 7735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 7745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (verbose) 7755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project grub_printf ("Attempt to open drive 0x%x (%s)\n", 7765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project drive, devname); 7775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 7785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Open read/write, or read-only if that failed. */ 7795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (! read_only) 7805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project disks[drive].flags = open (devname, O_RDWR); 7815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 7825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (disks[drive].flags == -1) 7835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 7845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (read_only || errno == EACCES || errno == EROFS || errno == EPERM) 7855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 7865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project disks[drive].flags = open (devname, O_RDONLY); 7875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (disks[drive].flags == -1) 7885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 7895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project assign_device_name (drive, 0); 7905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return -1; 7915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 7925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 7935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else 7945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 7955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project assign_device_name (drive, 0); 7965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return -1; 7975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 7985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 7995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Attempt to read the first sector. */ 8015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (read (disks[drive].flags, buf, 512) != 512) 8025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 8035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project close (disks[drive].flags); 8045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project disks[drive].flags = -1; 8055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project assign_device_name (drive, 0); 8065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return -1; 8075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 8085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (disks[drive].flags != -1) 8105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project get_drive_geometry (&disks[drive], device_map, drive); 8115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 8125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (disks[drive].flags == -1) 8145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return -1; 8155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef __linux__ 8175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* In Linux, invalidate the buffer cache, so that left overs 8185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project from other program in the cache are flushed and seen by us */ 8195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ioctl (disks[drive].flags, BLKFLSBUF, 0); 8205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 8215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project *geometry = disks[drive]; 8235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 0; 8245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 8255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Read LEN bytes from FD in BUF. Return less than or equal to zero if an 8275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project error occurs, otherwise return LEN. */ 8285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int 8295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectnread (int fd, char *buf, size_t len) 8305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 8315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int size = len; 8325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project while (len) 8345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 8355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int ret = read (fd, buf, len); 8365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (ret <= 0) 8385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 8395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (errno == EINTR) 8405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project continue; 8415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else 8425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return ret; 8435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 8445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project len -= ret; 8465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project buf += ret; 8475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 8485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return size; 8505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 8515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Write LEN bytes from BUF to FD. Return less than or equal to zero if an 8535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project error occurs, otherwise return LEN. */ 8545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic int 8555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectnwrite (int fd, char *buf, size_t len) 8565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 8575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int size = len; 8585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project while (len) 8605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 8615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int ret = write (fd, buf, len); 8625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (ret <= 0) 8645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 8655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (errno == EINTR) 8665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project continue; 8675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else 8685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return ret; 8695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 8705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project len -= ret; 8725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project buf += ret; 8735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 8745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return size; 8765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 8775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Dump BUF in the format of hexadecimal numbers. */ 8795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic void 8805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthex_dump (void *buf, size_t size) 8815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 8825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* FIXME: How to determine which length is readable? */ 8835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#define MAX_COLUMN 70 8845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* use unsigned char for numerical computations */ 8865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project unsigned char *ptr = buf; 8875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* count the width of the line */ 8885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int column = 0; 8895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* how many bytes written */ 8905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int count = 0; 8915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project while (size > 0) 8935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 8945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* high 4 bits */ 8955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int hi = *ptr >> 4; 8965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* low 4 bits */ 8975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int low = *ptr & 0xf; 8985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 8995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* grub_printf does not handle prefix number, such as %2x, so 9005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project format the number by hand... */ 9015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project grub_printf ("%x%x", hi, low); 9025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project column += 2; 9035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project count++; 9045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ptr++; 9055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project size--; 9065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 9075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Insert space or newline with the interval 4 bytes. */ 9085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (size != 0 && (count % 4) == 0) 9095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 9105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (column < MAX_COLUMN) 9115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 9125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project grub_printf (" "); 9135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project column++; 9145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 9155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project else 9165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 9175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project grub_printf ("\n"); 9185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project column = 0; 9195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 9205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 9215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 9225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 9235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Add a newline at the end for readability. */ 9245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project grub_printf ("\n"); 9255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 9265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 9275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint 9285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectbiosdisk (int subfunc, int drive, struct geometry *geometry, 9295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int sector, int nsec, int segment) 9305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 9315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project char *buf; 9325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int fd = geometry->flags; 9335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 9345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Get the file pointer from the geometry, and make sure it matches. */ 9355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (fd == -1 || fd != disks[drive].flags) 9365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return BIOSDISK_ERROR_GEOMETRY; 9375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 9385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Seek to the specified location. */ 9395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#if defined(__linux__) && (!defined(__GLIBC__) || \ 9405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ((__GLIBC__ < 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ < 1)))) 9415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Maybe libc doesn't have large file support. */ 9425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 9435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project loff_t offset, result; 9445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project static int _llseek (uint filedes, ulong hi, ulong lo, 9455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project loff_t *res, uint wh); 9465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project _syscall5 (int, _llseek, uint, filedes, ulong, hi, ulong, lo, 9475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project loff_t *, res, uint, wh); 9485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 9495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project offset = (loff_t) sector * (loff_t) SECTOR_SIZE; 9505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (_llseek (fd, offset >> 32, offset & 0xffffffff, &result, SEEK_SET)) 9515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return -1; 9525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 9535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#else 9545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 9555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project off_t offset = (off_t) sector * (off_t) SECTOR_SIZE; 9565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 9575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (lseek (fd, offset, SEEK_SET) != offset) 9585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return -1; 9595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 9605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 9615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 9625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project buf = (char *) (segment << 4); 9635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 9645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project switch (subfunc) 9655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 9665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case BIOSDISK_READ: 9675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef __linux__ 9685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (sector == 0 && nsec > 1) 9695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 9705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Work around a bug in linux's ez remapping. Linux remaps all 9715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project sectors that are read together with the MBR in one read. It 9725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project should only remap the MBR, so we split the read in two 9735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project parts. -jochen */ 9745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (nread (fd, buf, SECTOR_SIZE) != SECTOR_SIZE) 9755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return -1; 9765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project buf += SECTOR_SIZE; 9775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project nsec--; 9785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 9795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 9805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (nread (fd, buf, nsec * SECTOR_SIZE) != nsec * SECTOR_SIZE) 9815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return -1; 9825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 9835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 9845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case BIOSDISK_WRITE: 9855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (verbose) 9865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 9875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project grub_printf ("Write %d sectors starting from %d sector" 9885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project " to drive 0x%x (%s)\n", 9895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project nsec, sector, drive, device_map[drive]); 9905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project hex_dump (buf, nsec * SECTOR_SIZE); 9915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 9925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (! read_only) 9935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (nwrite (fd, buf, nsec * SECTOR_SIZE) != nsec * SECTOR_SIZE) 9945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return -1; 9955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 9965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 9975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project default: 9985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project grub_printf ("unknown subfunc %d\n", subfunc); 9995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 10005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 10015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 0; 10035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 10045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 10075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstop_floppy (void) 10085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 10095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* NOTUSED */ 10105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 10115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Fetch a key from a serial device. */ 10135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint 10145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectserial_hw_fetch (void) 10155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 10165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project fd_set fds; 10175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct timeval to; 10185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project char c; 10195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Wait only for the serial device. */ 10215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project FD_ZERO (&fds); 10225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project FD_SET (serial_fd, &fds); 10235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project to.tv_sec = 0; 10255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project to.tv_usec = 0; 10265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (select (serial_fd + 1, &fds, 0, 0, &to) > 0) 10285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 10295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (nread (serial_fd, &c, 1) != 1) 10305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project stop (); 10315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return c; 10335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 10345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return -1; 10365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 10375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Put a character to a serial device. */ 10395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 10405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectserial_hw_put (int c) 10415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 10425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project char ch = (char) c; 10435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (nwrite (serial_fd, &ch, 1) != 1) 10455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project stop (); 10465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 10475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 10495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectserial_hw_delay (void) 10505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 10515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef SIMULATE_SLOWNESS_OF_SERIAL 10525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct timeval otv, tv; 10535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project gettimeofday (&otv, 0); 10555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project while (1) 10575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 10585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project long delta; 10595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project gettimeofday (&tv, 0); 10615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project delta = tv.tv_usec - otv.tv_usec; 10625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (delta < 0) 10635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project delta += 1000000; 10645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (delta >= 1000000 / (serial_speed >> 3)) 10665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 10675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 10685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif /* SIMULATE_SLOWNESS_OF_SERIAL */ 10695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 10705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectstatic speed_t 10725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectget_termios_speed (int speed) 10735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 10745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project switch (speed) 10755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 10765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case 2400: return B2400; 10775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case 4800: return B4800; 10785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case 9600: return B9600; 10795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case 19200: return B19200; 10805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case 38400: return B38400; 10815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef B57600 10825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case 57600: return B57600; 10835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 10845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef B115200 10855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case 115200: return B115200; 10865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 10875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 10885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return B0; 10905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 10915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 10925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Get the port number of the unit UNIT. In the grub shell, this doesn't 10935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project make sense. */ 10945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectunsigned short 10955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectserial_hw_get_port (int unit) 10965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 10975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 0; 10985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 10995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Initialize a serial device. In the grub shell, PORT is unused. */ 11015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint 11025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectserial_hw_init (unsigned short port, unsigned int speed, 11035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int word_len, int parity, int stop_bit_len) 11045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 11055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project struct termios termios; 11065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project speed_t termios_speed; 11075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project int i; 11085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Check if the file name is specified. */ 11105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (! serial_device) 11115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 0; 11125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* If a serial device is already opened, close it first. */ 11145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (serial_fd >= 0) 11155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project close (serial_fd); 11165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Open the device file. */ 11185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project serial_fd = open (serial_device, 11195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project O_RDWR | O_NOCTTY 11205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#if defined(O_SYNC) 11215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* O_SYNC is used in Linux (and some others?). */ 11225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project | O_SYNC 11235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#elif defined(O_FSYNC) 11245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* O_FSYNC is used in FreeBSD. */ 11255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project | O_FSYNC 11265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif 11275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project ); 11285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (serial_fd < 0) 11295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 0; 11305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Get the termios parameters. */ 11325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (tcgetattr (serial_fd, &termios)) 11335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project goto fail; 11345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Raw mode. */ 11365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project cfmakeraw (&termios); 11375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Set the speed. */ 11395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project termios_speed = get_termios_speed (speed); 11405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (termios_speed == B0) 11415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project goto fail; 11425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project cfsetispeed (&termios, termios_speed); 11445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project cfsetospeed (&termios, termios_speed); 11455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Set the word length. */ 11475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project termios.c_cflag &= ~CSIZE; 11485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project switch (word_len) 11495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 11505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case UART_5BITS_WORD: 11515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project termios.c_cflag |= CS5; 11525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 11535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case UART_6BITS_WORD: 11545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project termios.c_cflag |= CS6; 11555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 11565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case UART_7BITS_WORD: 11575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project termios.c_cflag |= CS7; 11585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 11595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case UART_8BITS_WORD: 11605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project termios.c_cflag |= CS8; 11615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 11625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project default: 11635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project goto fail; 11645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 11655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Set the parity. */ 11675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project switch (parity) 11685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 11695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case UART_NO_PARITY: 11705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project termios.c_cflag &= ~PARENB; 11715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 11725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case UART_ODD_PARITY: 11735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project termios.c_cflag |= PARENB; 11745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project termios.c_cflag |= PARODD; 11755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 11765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case UART_EVEN_PARITY: 11775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project termios.c_cflag |= PARENB; 11785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project termios.c_cflag &= ~PARODD; 11795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 11805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project default: 11815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project goto fail; 11825b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 11835b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11845b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Set the length of stop bit. */ 11855b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project switch (stop_bit_len) 11865b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 11875b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case UART_1_STOP_BIT: 11885b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project termios.c_cflag &= ~CSTOPB; 11895b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 11905b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project case UART_2_STOP_BITS: 11915b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project termios.c_cflag |= CSTOPB; 11925b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 11935b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project default: 11945b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project goto fail; 11955b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 11965b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 11975b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Set the parameters. */ 11985b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (tcsetattr (serial_fd, TCSANOW, &termios)) 11995b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project goto fail; 12005b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 12015b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#ifdef SIMULATE_SLOWNESS_OF_SERIAL 12025b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project serial_speed = speed; 12035b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project#endif /* SIMUATE_SLOWNESS_OF_SERIAL */ 12045b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 12055b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project /* Get rid of the flag TERM_NEED_INIT from the serial terminal. */ 12065b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project for (i = 0; term_table[i].name; i++) 12075b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 12085b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (strcmp (term_table[i].name, "serial") == 0) 12095b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project { 12105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project term_table[i].flags &= ~(TERM_NEED_INIT); 12115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project break; 12125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 12135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project } 12145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 12155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 1; 12165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 12175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project fail: 12185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project close (serial_fd); 12195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project serial_fd = -1; 12205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 0; 12215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 12225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 12235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* Set the file name of a serial device (or a pty device). This is a 12245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project function specific to the grub shell. */ 12255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 12265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectserial_set_device (const char *device) 12275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 12285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project if (serial_device) 12295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project free (serial_device); 12305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 12315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project serial_device = strdup (device); 12325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 12335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 12345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* There is no difference between console and hercules in the grub shell. */ 12355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 12365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthercules_putchar (int c) 12375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 12385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project console_putchar (c); 12395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 12405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 12415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint 12425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthercules_getxy (void) 12435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 12445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return console_getxy (); 12455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 12465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 12475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 12485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthercules_gotoxy (int x, int y) 12495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 12505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project console_gotoxy (x, y); 12515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 12525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 12535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 12545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthercules_cls (void) 12555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 12565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project console_cls (); 12575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 12585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 12595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 12605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthercules_setcolorstate (color_state state) 12615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 12625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project console_setcolorstate (state); 12635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 12645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 12655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectvoid 12665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthercules_setcolor (int normal_color, int highlight_color) 12675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 12685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project console_setcolor (normal_color, highlight_color); 12695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 12705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 12715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projectint 12725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Projecthercules_setcursor (int on) 12735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project{ 12745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project return 1; 12755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project} 1276