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