usr/src/grub/grub-0.97/stage2/builtins.c
author William Kucharski <William.Kucharski@Sun.COM>
Fri, 07 Nov 2008 21:36:41 -0700
changeset 8044 b3af80bbf173
parent 7701 usr/src/grub/grub-0.95/stage2/builtins.c@e32275805af8
child 8242 e46e4b2f0a03
permissions -rw-r--r--
6731552 GRUB should have the ability to overlay a logo on the graphical splash screen 6762035 GRUB needs to understand new ext3 256 Byte inodes 6762243 GRUB should be updated to version 0.97
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/* builtins.c - the GRUB builtin commands */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *  GRUB  --  GRand Unified Bootloader
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 *  Copyright (C) 1999,2000,2001,2002,2003,2004  Free Software Foundation, Inc.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     5
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     6
 *  This program is free software; you can redistribute it and/or modify
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *  it under the terms of the GNU General Public License as published by
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 *  the Free Software Foundation; either version 2 of the License, or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 *  (at your option) any later version.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 *  This program is distributed in the hope that it will be useful,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 *  GNU General Public License for more details.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 *  You should have received a copy of the GNU General Public License
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 *  along with this program; if not, write to the Free Software
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 */
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
    20
6448
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
    21
/*
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
    22
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
    23
 * Use is subject to license terms.
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
    24
 */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
/* Include stdio.h before shared.h, because we can't define
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
   WITHOUT_LIBC_STUBS here.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
#ifdef GRUB_UTIL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
# include <stdio.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
#include <shared.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
#include <filesys.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
#include <term.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
#ifdef SUPPORT_NETBOOT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
# include <grub.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
#ifdef SUPPORT_SERIAL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
# include <serial.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
# include <terminfo.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#ifdef GRUB_UTIL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
# include <device.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#else /* ! GRUB_UTIL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
# include <apic.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
# include <smp-imps.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
#endif /* ! GRUB_UTIL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    51
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
#ifdef USE_MD5_PASSWORDS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
# include <md5.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
    56
#include <cpu.h>
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
    57
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
/* The type of kernel loaded.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
kernel_t kernel_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
/* The boot device.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
static int bootdev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
/* True when the debug mode is turned on, and false
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
   when it is turned off.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
int debug = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
/* The default entry.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
int default_entry = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
/* The fallback entry.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
int fallback_entryno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
int fallback_entries[MAX_FALLBACK_ENTRIES];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
/* The number of current entry.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
int current_entryno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
/* The address for Multiboot command-line buffer.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
static char *mb_cmdline;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
/* The password.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
char *password;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
/* The password type.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
password_t password_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
/* The flag for indicating that the user is authoritative.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
int auth = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
/* The timeout.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
int grub_timeout = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
/* Whether to show the menu or not.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
int show_menu = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
/* The BIOS drive map.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
static unsigned short bios_drive_map[DRIVE_MAP_SIZE + 1];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
/* Prototypes for allowing straightfoward calling of builtins functions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    88
   inside other functions.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
static int configfile_func (char *arg, int flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
#ifdef SUPPORT_NETBOOT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
static void solaris_config_file (void);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
    94
static unsigned int min_mem64 = 0;
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
    95
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
#if defined(__sun) && !defined(GRUB_UTIL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
extern void __enable_execute_stack (void *);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
__enable_execute_stack (void *addr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
#endif /* __sun && !GRUB_UTIL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   103
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
/* Initialize the data for builtins.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
init_builtins (void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
  kernel_type = KERNEL_TYPE_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
  /* BSD and chainloading evil hacks!  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
  bootdev = set_bootdev (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
  mb_cmdline = (char *) MB_CMDLINE_BUF;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
/* Initialize the data for the configuration file.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
init_config (void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
  default_entry = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
  password = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
  fallback_entryno = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
  fallback_entries[0] = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
  grub_timeout = -1;
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
   123
  current_rootpool[0] = '\0';
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
   124
  current_bootfs[0] = '\0';
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 4098
diff changeset
   125
  current_bootpath[0] = '\0';
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
   126
  current_bootfs_obj = 0;
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
   127
  current_devid[0] = '\0';
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
   128
  is_zfs_mount = 0;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
/* Check a password for correctness.  Returns 0 if password was
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
   correct, and a value != 0 for error, similarly to strcmp. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
check_password (char *entered, char* expected, password_t type)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
  switch (type)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
    case PASSWORD_PLAIN:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
      return strcmp (entered, expected);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
#ifdef USE_MD5_PASSWORDS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
    case PASSWORD_MD5:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
      return check_md5_password (entered, expected);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
    default: 
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
      /* unsupported password type: be secure */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
/* Print which sector is read when loading a file.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
static void
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
   153
disk_read_print_func(unsigned int sector, int offset, int length)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
{
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
   155
  grub_printf ("[%u,%d,%d]", sector, offset, length);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   156
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   157
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   158

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   159
/* blocklist */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
blocklist_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
  char *dummy = (char *) RAW_ADDR (0x100000);
8044
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
   164
  unsigned int start_sector = 0;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
  int num_sectors = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
  int num_entries = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
  int last_length = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
8044
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
   169
  auto void disk_read_blocklist_func (unsigned int sector, int offset,
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
   170
      int length);
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
   171
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
  /* Collect contiguous blocks into one entry as many as possible,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
     and print the blocklist notation on the screen.  */
8044
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
   174
  auto void disk_read_blocklist_func (unsigned int sector, int offset,
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
   175
      int length)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
      if (num_sectors > 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
	  if (start_sector + num_sectors == sector
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
	      && offset == 0 && last_length == SECTOR_SIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
	      num_sectors++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
	      last_length = length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
	      return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
	  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
	      if (last_length == SECTOR_SIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
		grub_printf ("%s%d+%d", num_entries ? "," : "",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
			     start_sector - part_start, num_sectors);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
	      else if (num_sectors > 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
		grub_printf ("%s%d+%d,%d[0-%d]", num_entries ? "," : "",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
			     start_sector - part_start, num_sectors-1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
			     start_sector + num_sectors-1 - part_start, 
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
			     last_length);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
	      else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
		grub_printf ("%s%d[0-%d]", num_entries ? "," : "",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
			     start_sector - part_start, last_length);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
	      num_entries++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	      num_sectors = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
      if (offset > 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
	{
8044
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
   206
	  grub_printf("%s%u[%d-%d]", num_entries ? "," : "",
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
		      sector-part_start, offset, offset+length);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
	  num_entries++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
      else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
	  start_sector = sector;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
	  num_sectors = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
	  last_length = length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
  /* Open the file.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
  if (! grub_open (arg))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
  /* Print the device name.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
  grub_printf ("(%cd%d",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
	       (current_drive & 0x80) ? 'h' : 'f',
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
	       current_drive & ~0x80);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
  if ((current_partition & 0xFF0000) != 0xFF0000)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
    grub_printf (",%d", (current_partition >> 16) & 0xFF);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
  if ((current_partition & 0x00FF00) != 0x00FF00)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
    grub_printf (",%c", 'a' + ((current_partition >> 8) & 0xFF));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
  grub_printf (")");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
  /* Read in the whole file to DUMMY.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
  disk_read_hook = disk_read_blocklist_func;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
  if (! grub_read (dummy, -1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
    goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
  /* The last entry may not be printed yet.  Don't check if it is a
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
   * full sector, since it doesn't matter if we read too much. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
  if (num_sectors > 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
    grub_printf ("%s%d+%d", num_entries ? "," : "",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
		 start_sector - part_start, num_sectors);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
  grub_printf ("\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
 fail:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
  disk_read_hook = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
  grub_close ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
  return errnum;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
static struct builtin builtin_blocklist =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
  "blocklist",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
  blocklist_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
  "blocklist FILE",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
  "Print the blocklist notation of the file FILE."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
/* boot */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
boot_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
  /* Clear the int15 handler if we can boot the kernel successfully.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
     This assumes that the boot code never fails only if KERNEL_TYPE is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
     not KERNEL_TYPE_NONE. Is this assumption is bad?  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
  if (kernel_type != KERNEL_TYPE_NONE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
    unset_int15_handler ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
#ifdef SUPPORT_NETBOOT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
  /* Shut down the networking.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
  cleanup_net ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
  switch (kernel_type)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
    case KERNEL_TYPE_FREEBSD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
    case KERNEL_TYPE_NETBSD:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
      /* *BSD */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
      bsd_boot (kernel_type, bootdev, (char *) mbi.cmdline);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
      break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
    case KERNEL_TYPE_LINUX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
      /* Linux */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
      linux_boot ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
      break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
    case KERNEL_TYPE_BIG_LINUX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
      /* Big Linux */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   293
      big_linux_boot ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   294
      break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   295
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
    case KERNEL_TYPE_CHAINLOADER:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
      /* Chainloader */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
      /* Check if we should set the int13 handler.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
      if (bios_drive_map[0] != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
	  int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
	  /* Search for SAVED_DRIVE.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
	  for (i = 0; i < DRIVE_MAP_SIZE; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
	      if (! bios_drive_map[i])
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
	      else if ((bios_drive_map[i] & 0xFF) == saved_drive)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
		{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
		  /* Exchage SAVED_DRIVE with the mapped drive.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
		  saved_drive = (bios_drive_map[i] >> 8) & 0xFF;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
		  break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
	  /* Set the handler. This is somewhat dangerous.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
	  set_int13_handler (bios_drive_map);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
      gateA20 (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
      boot_drive = saved_drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
      chain_stage1 (0, BOOTSEC_LOCATION, boot_part_addr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
      break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
    case KERNEL_TYPE_MULTIBOOT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
      /* Multiboot */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
#ifdef SUPPORT_NETBOOT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
#ifdef SOLARIS_NETBOOT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
      if (current_drive == NETWORK_DRIVE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
    	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
	 *  XXX Solaris hack: use drive_info to pass network information
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
	 *  Turn off the flag bit to the loader is technically
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
	 *  multiboot compliant.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
    	mbi.flags &= ~MB_INFO_DRIVE_INFO;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
  	mbi.drives_length = dhcpack_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
  	mbi.drives_addr = dhcpack_buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
      }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
#endif /* SOLARIS_NETBOOT */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
      multi_boot ((int) entry_addr, (int) &mbi);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
      break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
    default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
      errnum = ERR_BOOT_COMMAND;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
static struct builtin builtin_boot =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
  "boot",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
  boot_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
  "boot",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
  "Boot the OS/chain-loader which has been loaded."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   360
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   362

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
#ifdef SUPPORT_NETBOOT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
/* bootp */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
bootp_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   368
  int with_configfile = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
  if (grub_memcmp (arg, "--with-configfile", sizeof ("--with-configfile") - 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
      == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
      with_configfile = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
      arg = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
  if (! bootp ())
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
      if (errnum == ERR_NONE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   380
	errnum = ERR_DEV_VALUES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
  /* Notify the configuration.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
  print_network_configuration ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
  /* XXX: this can cause an endless loop, but there is no easy way to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
     detect such a loop unfortunately.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
  if (with_configfile)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
    configfile_func (config_file, flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
static struct builtin builtin_bootp =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
  "bootp",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
  bootp_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
  BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
  "bootp [--with-configfile]",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
  "Initialize a network device via BOOTP. If the option `--with-configfile'"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
  " is given, try to load a configuration file specified by the 150 vendor"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
  " tag."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   405
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   406
#endif /* SUPPORT_NETBOOT */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   407
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   408

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   409
/* cat */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   410
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   411
cat_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
  char c;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
  if (! grub_open (arg))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
  while (grub_read (&c, 1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
      /* Because running "cat" with a binary file can confuse the terminal,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
	 print only some characters as they are.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
      if (grub_isspace (c) || (c >= ' ' && c <= '~'))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
	grub_putchar (c);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
      else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
	grub_putchar ('?');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
  grub_close ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
static struct builtin builtin_cat =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   433
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
  "cat",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
  cat_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
  "cat FILE",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
  "Print the contents of the file FILE."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   442
/* chainloader */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
chainloader_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
  int force = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
  char *file = arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
  /* If the option `--force' is specified?  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
  if (substring ("--force", arg) <= 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
      force = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
      file = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   454
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   455
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   456
  /* Open the file.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
  if (! grub_open (file))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
      kernel_type = KERNEL_TYPE_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   461
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   462
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   463
  /* Read the first block.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
  if (grub_read ((char *) BOOTSEC_LOCATION, SECTOR_SIZE) != SECTOR_SIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
      grub_close ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
      kernel_type = KERNEL_TYPE_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
      /* This below happens, if a file whose size is less than 512 bytes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
	 is loaded.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
      if (errnum == ERR_NONE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
	errnum = ERR_EXEC_FORMAT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
  /* If not loading it forcibly, check for the signature.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
  if (! force
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
      && (*((unsigned short *) (BOOTSEC_LOCATION + BOOTSEC_SIG_OFFSET))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   480
	  != BOOTSEC_SIGNATURE))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
      grub_close ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
      errnum = ERR_EXEC_FORMAT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   484
      kernel_type = KERNEL_TYPE_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
  grub_close ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
  kernel_type = KERNEL_TYPE_CHAINLOADER;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
  /* XXX: Windows evil hack. For now, only the first five letters are
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
     checked.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
  if (IS_PC_SLICE_TYPE_FAT (current_slice)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
      && ! grub_memcmp ((char *) BOOTSEC_LOCATION + BOOTSEC_BPB_SYSTEM_ID,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
			"MSWIN", 5))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
    *((unsigned long *) (BOOTSEC_LOCATION + BOOTSEC_BPB_HIDDEN_SECTORS))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
      = part_start;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
  errnum = ERR_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
static struct builtin builtin_chainloader =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
  "chainloader",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
  chainloader_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
  "chainloader [--force] FILE",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
  "Load the chain-loader FILE. If --force is specified, then load it"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
  " forcibly, whether the boot loader signature is present or not."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
/* This function could be used to debug new filesystem code. Put a file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
   in the new filesystem and the same file in a well-tested filesystem.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
   Then, run "cmp" with the files. If no output is obtained, probably
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
   the code is good, otherwise investigate what's wrong...  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
/* cmp FILE1 FILE2 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
cmp_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
  /* The filenames.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
  char *file1, *file2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
  /* The addresses.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
  char *addr1, *addr2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
  int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
  /* The size of the file.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
  int size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
  /* Get the filenames from ARG.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
  file1 = arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
  file2 = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
  if (! *file1 || ! *file2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
      errnum = ERR_BAD_ARGUMENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   538
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   539
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   540
  /* Terminate the filenames for convenience.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
  nul_terminate (file1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
  nul_terminate (file2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
  /* Read the whole data from FILE1.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
  addr1 = (char *) RAW_ADDR (0x100000);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
  if (! grub_open (file1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
  /* Get the size.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
  size = filemax;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
  if (grub_read (addr1, -1) != size)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
      grub_close ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
  grub_close ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
  /* Read the whole data from FILE2.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
  addr2 = addr1 + size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
  if (! grub_open (file2))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
  /* Check if the size of FILE2 is equal to the one of FILE2.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
  if (size != filemax)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
      grub_printf ("Differ in size: 0x%x [%s], 0x%x [%s]\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
		   size, file1, filemax, file2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
      grub_close ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
      return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
  if (! grub_read (addr2, -1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
      grub_close ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   578
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   579
  grub_close ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
  /* Now compare ADDR1 with ADDR2.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
  for (i = 0; i < size; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
      if (addr1[i] != addr2[i])
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
	grub_printf ("Differ at the offset %d: 0x%x [%s], 0x%x [%s]\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
		     i, (unsigned) addr1[i], file1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
		     (unsigned) addr2[i], file2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   588
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   589
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   590
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   591
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   592
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   593
static struct builtin builtin_cmp =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   594
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   595
  "cmp",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   596
  cmp_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   597
  BUILTIN_CMDLINE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   598
  "cmp FILE1 FILE2",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   599
  "Compare the file FILE1 with the FILE2 and inform the different values"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   600
  " if any."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   601
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   602
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   603

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   604
/* color */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   605
/* Set new colors used for the menu interface. Support two methods to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   606
   specify a color name: a direct integer representation and a symbolic
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   607
   color name. An example of the latter is "blink-light-gray/blue".  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   608
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   609
color_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   610
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   611
  char *normal;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   612
  char *highlight;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   613
  int new_normal_color;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   614
  int new_highlight_color;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   615
  static char *color_list[16] =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   616
  {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   617
    "black",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   618
    "blue",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   619
    "green",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   620
    "cyan",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   621
    "red",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   622
    "magenta",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   623
    "brown",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   624
    "light-gray",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   625
    "dark-gray",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   626
    "light-blue",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   627
    "light-green",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   628
    "light-cyan",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   629
    "light-red",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   630
    "light-magenta",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   631
    "yellow",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   632
    "white"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   633
  };
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   634
8044
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
   635
  auto int color_number (char *str);
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
   636
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   637
  /* Convert the color name STR into the magical number.  */
8044
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
   638
  auto int color_number (char *str)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   639
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   640
      char *ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   641
      int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   642
      int color = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   643
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   644
      /* Find the separator.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   645
      for (ptr = str; *ptr && *ptr != '/'; ptr++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   646
	;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   647
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   648
      /* If not found, return -1.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   649
      if (! *ptr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   650
	return -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   651
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   652
      /* Terminate the string STR.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   653
      *ptr++ = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   654
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   655
      /* If STR contains the prefix "blink-", then set the `blink' bit
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   656
	 in COLOR.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   657
      if (substring ("blink-", str) <= 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   658
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   659
	  color = 0x80;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   660
	  str += 6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   661
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   662
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   663
      /* Search for the color name.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   664
      for (i = 0; i < 16; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   665
	if (grub_strcmp (color_list[i], str) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   666
	  {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   667
	    color |= i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   668
	    break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   669
	  }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   670
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   671
      if (i == 16)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   672
	return -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   673
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   674
      str = ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   675
      nul_terminate (str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   676
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   677
      /* Search for the color name.  */      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   678
      for (i = 0; i < 8; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   679
	if (grub_strcmp (color_list[i], str) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   680
	  {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   681
	    color |= i << 4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   682
	    break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   683
	  }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   684
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   685
      if (i == 8)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   686
	return -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   687
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   688
      return color;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   689
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   690
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   691
  normal = arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   692
  highlight = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   693
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   694
  new_normal_color = color_number (normal);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   695
  if (new_normal_color < 0 && ! safe_parse_maxint (&normal, &new_normal_color))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   696
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   697
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   698
  /* The second argument is optional, so set highlight_color
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   699
     to inverted NORMAL_COLOR.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   700
  if (! *highlight)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   701
    new_highlight_color = ((new_normal_color >> 4)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   702
			   | ((new_normal_color & 0xf) << 4));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   703
  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   704
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   705
      new_highlight_color = color_number (highlight);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   706
      if (new_highlight_color < 0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   707
	  && ! safe_parse_maxint (&highlight, &new_highlight_color))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   708
	return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   709
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   710
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   711
  if (current_term->setcolor)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   712
    current_term->setcolor (new_normal_color, new_highlight_color);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   713
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   714
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   715
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   716
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   717
static struct builtin builtin_color =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   718
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   719
  "color",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   720
  color_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   721
  BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   722
  "color NORMAL [HIGHLIGHT]",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   723
  "Change the menu colors. The color NORMAL is used for most"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   724
  " lines in the menu, and the color HIGHLIGHT is used to highlight the"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   725
  " line where the cursor points. If you omit HIGHLIGHT, then the"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   726
  " inverted color of NORMAL is used for the highlighted line."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   727
  " The format of a color is \"FG/BG\". FG and BG are symbolic color names."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   728
  " A symbolic color name must be one of these: black, blue, green,"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   729
  " cyan, red, magenta, brown, light-gray, dark-gray, light-blue,"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   730
  " light-green, light-cyan, light-red, light-magenta, yellow and white."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   731
  " But only the first eight names can be used for BG. You can prefix"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   732
  " \"blink-\" to FG if you want a blinking foreground color."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   733
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   734
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   735

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   736
/* configfile */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   737
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   738
configfile_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   739
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   740
  char *new_config = config_file;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   741
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   742
  /* Check if the file ARG is present.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   743
  if (! grub_open (arg))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   744
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   745
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   746
  grub_close ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   747
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   748
  /* Copy ARG to CONFIG_FILE.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   749
  while ((*new_config++ = *arg++) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   750
    ;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   751
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   752
#ifdef GRUB_UTIL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   753
  /* Force to load the configuration file.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   754
  use_config_file = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   755
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   756
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   757
  /* Make sure that the user will not be authoritative.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   758
  auth = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   759
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   760
  /* Restart cmain.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   761
  grub_longjmp (restart_env, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   762
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   763
  /* Never reach here.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   764
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   765
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   766
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   767
static struct builtin builtin_configfile =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   768
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   769
  "configfile",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   770
  configfile_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   771
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   772
  "configfile FILE",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   773
  "Load FILE as the configuration file."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   774
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   775
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   776

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   777
/* debug */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   778
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   779
debug_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   780
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   781
  if (debug)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   782
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   783
      debug = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   784
      grub_printf (" Debug mode is turned off\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   785
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   786
  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   787
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   788
      debug = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   789
      grub_printf (" Debug mode is turned on\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   790
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   791
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   792
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   793
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   794
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   795
static struct builtin builtin_debug =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   796
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   797
  "debug",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   798
  debug_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   799
  BUILTIN_CMDLINE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   800
  "debug",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   801
  "Turn on/off the debug mode."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   802
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   803
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   804

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   805
/* default */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   806
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   807
default_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   808
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   809
#ifndef SUPPORT_DISKLESS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   810
  if (grub_strcmp (arg, "saved") == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   811
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   812
      default_entry = saved_entryno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   813
      return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   814
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   815
#endif /* SUPPORT_DISKLESS */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   816
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   817
  if (! safe_parse_maxint (&arg, &default_entry))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   818
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   819
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   820
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   821
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   822
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   823
static struct builtin builtin_default =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   824
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   825
  "default",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   826
  default_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   827
  BUILTIN_MENU,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   828
#if 0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   829
  "default [NUM | `saved']",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   830
  "Set the default entry to entry number NUM (if not specified, it is"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   831
  " 0, the first entry) or the entry number saved by savedefault."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   832
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   833
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   834
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   835

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   836
#ifdef GRUB_UTIL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   837
/* device */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   838
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   839
device_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   840
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   841
  char *drive = arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   842
  char *device;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   843
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   844
  /* Get the drive number from DRIVE.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   845
  if (! set_device (drive))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   846
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   847
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   848
  /* Get the device argument.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   849
  device = skip_to (0, drive);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   850
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   851
  /* Terminate DEVICE.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   852
  nul_terminate (device);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   853
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   854
  if (! *device || ! check_device (device))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   855
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   856
      errnum = ERR_FILE_NOT_FOUND;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   857
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   858
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   859
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   860
  assign_device_name (current_drive, device);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   861
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   862
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   863
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   864
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   865
static struct builtin builtin_device =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   866
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   867
  "device",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   868
  device_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   869
  BUILTIN_MENU | BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   870
  "device DRIVE DEVICE",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   871
  "Specify DEVICE as the actual drive for a BIOS drive DRIVE. This command"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   872
  " can be used only in the grub shell."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   873
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   874
#endif /* GRUB_UTIL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   875
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   876
#ifdef SUPPORT_NETBOOT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   877
/* Debug Function for RPC */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   878
#ifdef RPC_DEBUG
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   879
/* portmap */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   880
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   881
portmap_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   882
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   883
	int port, prog, ver;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   884
	if (! grub_eth_probe ()){
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   885
		grub_printf ("No ethernet card found.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   886
		errnum = ERR_DEV_VALUES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   887
		return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   888
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   889
	if ((prog = getdec(&arg)) == -1){
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   890
		grub_printf("Error prog number\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   891
		return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   892
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   893
	arg = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   894
	if ((ver = getdec(&arg)) == -1){
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   895
		grub_printf("Error ver number\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   896
		return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   897
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   898
	port = __pmapudp_getport(ARP_SERVER, prog, ver);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   899
	printf("portmap getport %d", port);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   900
	return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   901
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   902
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   903
static struct builtin builtin_portmap =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   904
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   905
	"portmap",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   906
	portmap_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   907
	BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   908
	"portmap prog_number vers_number",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   909
	"Do portmap with the prog_number and vers_number"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   910
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   911
#endif /* RPC_DEBUG */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   912
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   913
/* dhcp */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   914
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   915
dhcp_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   916
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   917
  int with_configfile = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   918
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   919
  if (grub_memcmp (arg, "--with-configfile", sizeof ("--with-configfile") - 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   920
      == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   921
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   922
      with_configfile = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   923
      arg = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   924
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   925
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   926
  if (! dhcp ())
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   927
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   928
      if (errnum == ERR_NONE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   929
	errnum = ERR_DEV_VALUES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   930
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   931
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   932
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   933
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   934
  /* Notify the configuration.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   935
  print_network_configuration ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   936
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   937
  /* XXX: this can cause an endless loop, but there is no easy way to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   938
     detect such a loop unfortunately.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   939
  if (with_configfile)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   940
    configfile_func (config_file, flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   941
  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   942
    solaris_config_file();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   943
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   944
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   945
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   946
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   947
static void solaris_config_file (void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   948
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   949
	static char menufile[64];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   950
	static char hexdigit[] = "0123456789ABCDEF";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   951
	char *c = menufile;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   952
	int i;
3039
68a62796c8d3 6488715 grub command "dhcp" always fails when not using PXE boot
casper
parents: 1372
diff changeset
   953
	int err;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   954
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   955
	/* if config_file is from DHCP option 150, keep the setting */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   956
	if (grub_strcmp(config_file, "/boot/grub/menu.lst") != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   957
		return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   958
25
83a8af2dd475 PSARC 2005/373 Contract for the Miniroot Repository
szhou
parents: 0
diff changeset
   959
	/* default solaris configfile name menu.lst.01<ether_addr> */
83a8af2dd475 PSARC 2005/373 Contract for the Miniroot Repository
szhou
parents: 0
diff changeset
   960
	grub_strcpy(c, "menu.lst.01");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   961
	c += grub_strlen(c);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   962
	for (i = 0; i < ETH_ALEN; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   963
		unsigned char b = arptable[ARP_CLIENT].node[i];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   964
		*c++ = hexdigit[b >> 4];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   965
		*c++ = hexdigit[b & 0xf];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   966
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   967
	*c = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   968
3039
68a62796c8d3 6488715 grub command "dhcp" always fails when not using PXE boot
casper
parents: 1372
diff changeset
   969
	/*
68a62796c8d3 6488715 grub command "dhcp" always fails when not using PXE boot
casper
parents: 1372
diff changeset
   970
	 * If the file exists, make it the default. Else, fallback
68a62796c8d3 6488715 grub command "dhcp" always fails when not using PXE boot
casper
parents: 1372
diff changeset
   971
	 * to what it was.  Make sure we don't change errnum in the
68a62796c8d3 6488715 grub command "dhcp" always fails when not using PXE boot
casper
parents: 1372
diff changeset
   972
	 * process.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   973
	 */
3039
68a62796c8d3 6488715 grub command "dhcp" always fails when not using PXE boot
casper
parents: 1372
diff changeset
   974
	err = errnum;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   975
	if (grub_open(menufile)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   976
		grub_strcpy(config_file, menufile);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   977
		grub_close();
25
83a8af2dd475 PSARC 2005/373 Contract for the Miniroot Repository
szhou
parents: 0
diff changeset
   978
	} else {
83a8af2dd475 PSARC 2005/373 Contract for the Miniroot Repository
szhou
parents: 0
diff changeset
   979
		char *cp = config_file;
83a8af2dd475 PSARC 2005/373 Contract for the Miniroot Repository
szhou
parents: 0
diff changeset
   980
		/* skip leading slashes for tftp */
307
a4c0aa8eedcf 6285716 p2 nv_16 SUNWCrnet metacluser install panic on x86
szhou
parents: 25
diff changeset
   981
		while (*cp == '/')
a4c0aa8eedcf 6285716 p2 nv_16 SUNWCrnet metacluser install panic on x86
szhou
parents: 25
diff changeset
   982
			++cp;
25
83a8af2dd475 PSARC 2005/373 Contract for the Miniroot Repository
szhou
parents: 0
diff changeset
   983
	  	grub_memmove (config_file, cp, strlen(cp) + 1);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   984
	}
3039
68a62796c8d3 6488715 grub command "dhcp" always fails when not using PXE boot
casper
parents: 1372
diff changeset
   985
	errnum = err;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   986
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   987
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   988
static struct builtin builtin_dhcp =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   989
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   990
  "dhcp",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   991
  dhcp_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   992
  BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   993
  "dhcp",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   994
  "Initialize a network device via DHCP."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   995
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   996
#endif /* SUPPORT_NETBOOT */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   997
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   998
static int terminal_func (char *arg, int flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   999
1372
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1000
static int verbose_func(char *arg, int flags) {
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1001
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1002
    if (grub_strcmp(arg, "off") == 0) {
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1003
      silent.status = DEFER_SILENT;
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1004
      return;
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1005
    } else
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1006
        if (flags == BUILTIN_CMDLINE) {
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1007
          silent.status = DEFER_VERBOSE;
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1008
          return;
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1009
        }
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1010
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1011
  silent.status = VERBOSE;
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1012
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  1013
  /* get back to text console */
1372
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1014
  if (current_term->shutdown) {
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1015
    (*current_term->shutdown)();
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1016
    current_term = term_table; /* assumption: console is first */
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1017
  }
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1018
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1019
  /* dump the buffer */
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1020
  if (!silent.looped) {
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1021
    /* if the buffer hasn't looped, just print it */
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1022
    printf("%s", silent.buffer);
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1023
  } else {
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1024
    /*
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1025
     * If the buffer has looped, first print the oldest part of the buffer,
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1026
     * which is one past the current null. Then print the newer part which
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1027
     * starts at the beginning of the buffer.
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1028
     */
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1029
    printf("%s", silent.buffer_start + 1);
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1030
    printf("%s", silent.buffer);
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1031
  }
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1032
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1033
  return 0;
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1034
}
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1035
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1036
static struct builtin builtin_verbose =
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1037
{
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1038
  "verbose",
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1039
  verbose_func,
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1040
  BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_SCRIPT | BUILTIN_HELP_LIST,
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1041
  "verbose",
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1042
  "Verbose output during menu entry (script) execution."
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1043
};
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1044
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1045
#ifdef SUPPORT_GRAPHICS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1046

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1047
static int splashimage_func(char *arg, int flags) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1048
    char splashimage[64];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1049
    int i;
1372
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1050
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1051
    /* filename can only be 64 characters due to our buffer size */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1052
    if (strlen(arg) > 63)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1053
	return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1054
1372
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1055
    if (flags == BUILTIN_SCRIPT)
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1056
        flags = BUILTIN_CMDLINE;
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1057
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1058
    if (flags == BUILTIN_CMDLINE) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1059
	if (!grub_open(arg))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1060
	    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1061
	grub_close();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1062
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1063
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1064
    strcpy(splashimage, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1065
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1066
    /* get rid of TERM_NEED_INIT from the graphics terminal. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1067
    for (i = 0; term_table[i].name; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1068
	if (grub_strcmp (term_table[i].name, "graphics") == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1069
	    term_table[i].flags &= ~TERM_NEED_INIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1070
	    break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1071
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1072
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1073
    
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1074
    graphics_set_splash(splashimage);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1075
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1076
    if (flags == BUILTIN_CMDLINE && graphics_inited) {
1372
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1077
	/*
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1078
	 * calling graphics_end() here flickers the screen black. OTOH not
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1079
	 * calling it gets us odd plane interlacing / early palette switching ?
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1080
	 * ideally one should figure out how to double buffer and switch...
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1081
	 */
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1082
	graphics_end();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1083
	graphics_init();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1084
	graphics_cls();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1085
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1086
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1087
    /* FIXME: should we be explicitly switching the terminal as a 
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1088
     * side effect here? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1089
    terminal_func("graphics", flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1090
1372
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1091
    reset_term = 0;
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1092
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1093
    return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1094
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1095
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1096
static struct builtin builtin_splashimage =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1097
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1098
  "splashimage",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1099
  splashimage_func,
1372
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  1100
  BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_SCRIPT | BUILTIN_HELP_LIST,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1101
  "splashimage FILE",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1102
  "Load FILE as the background image when in graphics mode."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1103
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1104
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1105

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1106
/* foreground */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1107
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1108
foreground_func(char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1109
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1110
    if (grub_strlen(arg) == 6) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1111
	int r = ((hex(arg[0]) << 4) | hex(arg[1])) >> 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1112
	int g = ((hex(arg[2]) << 4) | hex(arg[3])) >> 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1113
	int b = ((hex(arg[4]) << 4) | hex(arg[5])) >> 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1114
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1115
	foreground = (r << 16) | (g << 8) | b;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1116
	if (graphics_inited)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1117
	    graphics_set_palette(15, r, g, b);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1118
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1119
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1120
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1121
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1122
    return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1123
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1124
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1125
static struct builtin builtin_foreground =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1126
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1127
  "foreground",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1128
  foreground_func,
7701
e32275805af8 6522500 dboot deletes happy face boot
Jan Setje-Eilers <Jan.Setje-Eilers@Sun.COM>
parents: 7563
diff changeset
  1129
  BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST | BUILTIN_SCRIPT,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1130
  "foreground RRGGBB",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1131
  "Sets the foreground color when in graphics mode."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1132
  "RR is red, GG is green, and BB blue. Numbers must be in hexadecimal."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1133
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1134
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1135

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1136
/* background */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1137
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1138
background_func(char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1139
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1140
    if (grub_strlen(arg) == 6) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1141
	int r = ((hex(arg[0]) << 4) | hex(arg[1])) >> 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1142
	int g = ((hex(arg[2]) << 4) | hex(arg[3])) >> 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1143
	int b = ((hex(arg[4]) << 4) | hex(arg[5])) >> 2;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1144
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1145
	background = (r << 16) | (g << 8) | b;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1146
	if (graphics_inited)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1147
	    graphics_set_palette(0, r, g, b);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1148
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1149
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1150
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1151
    return (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1152
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1153
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1154
static struct builtin builtin_background =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1155
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1156
  "background",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1157
  background_func,
7701
e32275805af8 6522500 dboot deletes happy face boot
Jan Setje-Eilers <Jan.Setje-Eilers@Sun.COM>
parents: 7563
diff changeset
  1158
  BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST | BUILTIN_SCRIPT, 
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1159
  "background RRGGBB",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1160
  "Sets the background color when in graphics mode."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1161
  "RR is red, GG is green, and BB blue. Numbers must be in hexadecimal."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1162
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1163
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1164
#endif /* SUPPORT_GRAPHICS */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1165
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1166

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1167
/* clear */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1168
static int 
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1169
clear_func() 
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1170
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1171
  if (current_term->cls)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1172
    current_term->cls();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1173
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1174
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1175
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1176
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1177
static struct builtin builtin_clear =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1178
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1179
  "clear",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1180
  clear_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1181
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1182
  "clear",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1183
  "Clear the screen"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1184
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1185
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1186
/* displayapm */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1187
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1188
displayapm_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1189
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1190
  if (mbi.flags & MB_INFO_APM_TABLE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1191
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1192
      grub_printf ("APM BIOS information:\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1193
		   " Version:          0x%x\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1194
		   " 32-bit CS:        0x%x\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1195
		   " Offset:           0x%x\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1196
		   " 16-bit CS:        0x%x\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1197
		   " 16-bit DS:        0x%x\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1198
		   " 32-bit CS length: 0x%x\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1199
		   " 16-bit CS length: 0x%x\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1200
		   " 16-bit DS length: 0x%x\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1201
		   (unsigned) apm_bios_info.version,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1202
		   (unsigned) apm_bios_info.cseg,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1203
		   apm_bios_info.offset,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1204
		   (unsigned) apm_bios_info.cseg_16,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1205
		   (unsigned) apm_bios_info.dseg_16,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1206
		   (unsigned) apm_bios_info.cseg_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1207
		   (unsigned) apm_bios_info.cseg_16_len,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1208
		   (unsigned) apm_bios_info.dseg_16_len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1209
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1210
  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1211
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1212
      grub_printf ("No APM BIOS found or probe failed\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1213
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1214
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1215
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1216
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1217
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1218
static struct builtin builtin_displayapm =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1219
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1220
  "displayapm",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1221
  displayapm_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1222
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1223
  "displayapm",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1224
  "Display APM BIOS information."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1225
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1226
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1227

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1228
/* displaymem */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1229
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1230
displaymem_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1231
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1232
  if (get_eisamemsize () != -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1233
    grub_printf (" EISA Memory BIOS Interface is present\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1234
  if (get_mmap_entry ((void *) SCRATCHADDR, 0) != 0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1235
      || *((int *) SCRATCHADDR) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1236
    grub_printf (" Address Map BIOS Interface is present\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1237
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1238
  grub_printf (" Lower memory: %uK, "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1239
	       "Upper memory (to first chipset hole): %uK\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1240
	       mbi.mem_lower, mbi.mem_upper);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1241
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  1242
  if (min_mem64 != 0)
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  1243
  	grub_printf (" Memory limit for 64-bit ISADIR expansion: %uMB\n",
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  1244
	    min_mem64);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  1245
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1246
  if (mbi.flags & MB_INFO_MEM_MAP)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1247
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1248
      struct AddrRangeDesc *map = (struct AddrRangeDesc *) mbi.mmap_addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1249
      int end_addr = mbi.mmap_addr + mbi.mmap_length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1250
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1251
      grub_printf (" [Address Range Descriptor entries "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1252
		   "immediately follow (values are 64-bit)]\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1253
      while (end_addr > (int) map)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1254
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1255
	  char *str;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1256
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1257
	  if (map->Type == MB_ARD_MEMORY)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1258
	    str = "Usable RAM";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1259
	  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1260
	    str = "Reserved";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1261
	  grub_printf ("   %s:  Base Address:  0x%x X 4GB + 0x%x,\n"
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  1262
		"      Length:   0x%x X 4GB + 0x%x bytes\n",
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  1263
		str,
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  1264
		(unsigned long) (map->BaseAddr >> 32),
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  1265
		(unsigned long) (map->BaseAddr & 0xFFFFFFFF),
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  1266
		(unsigned long) (map->Length >> 32),
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  1267
		(unsigned long) (map->Length & 0xFFFFFFFF));
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1268
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1269
	  map = ((struct AddrRangeDesc *) (((int) map) + 4 + map->size));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1270
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1271
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1272
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1273
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1274
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1275
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1276
static struct builtin builtin_displaymem =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1277
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1278
  "displaymem",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1279
  displaymem_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1280
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1281
  "displaymem",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1282
  "Display what GRUB thinks the system address space map of the"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1283
  " machine is, including all regions of physical RAM installed."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1284
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1285
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1286

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1287
/* dump FROM TO */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1288
#ifdef GRUB_UTIL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1289
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1290
dump_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1291
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1292
  char *from, *to;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1293
  FILE *fp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1294
  char c;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1295
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1296
  from = arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1297
  to = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1298
  if (! *from || ! *to)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1299
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1300
      errnum = ERR_BAD_ARGUMENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1301
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1302
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1303
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1304
  nul_terminate (from);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1305
  nul_terminate (to);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1306
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1307
  if (! grub_open (from))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1308
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1309
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1310
  fp = fopen (to, "w");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1311
  if (! fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1312
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1313
      errnum = ERR_WRITE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1314
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1315
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1316
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1317
  while (grub_read (&c, 1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1318
    if (fputc (c, fp) == EOF)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1319
      {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1320
	errnum = ERR_WRITE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1321
	fclose (fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1322
	return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1323
      }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1324
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1325
  if (fclose (fp) == EOF)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1326
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1327
      errnum = ERR_WRITE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1328
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1329
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1330
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1331
  grub_close ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1332
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1333
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1334
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1335
static struct builtin builtin_dump =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1336
  {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1337
    "dump",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1338
    dump_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1339
    BUILTIN_CMDLINE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1340
    "dump FROM TO",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1341
    "Dump the contents of the file FROM to the file TO. FROM must be"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1342
    " a GRUB file and TO must be an OS file."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1343
  };
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1344
#endif /* GRUB_UTIL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1345
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1346

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1347
static char embed_info[32];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1348
/* embed */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1349
/* Embed a Stage 1.5 in the first cylinder after MBR or in the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1350
   bootloader block in a FFS.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1351
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1352
embed_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1353
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1354
  char *stage1_5;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1355
  char *device;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1356
  char *stage1_5_buffer = (char *) RAW_ADDR (0x100000);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1357
  int len, size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1358
  int sector;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1359
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1360
  stage1_5 = arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1361
  device = skip_to (0, stage1_5);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1362
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1363
  /* Open a Stage 1.5.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1364
  if (! grub_open (stage1_5))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1365
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1366
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1367
  /* Read the whole of the Stage 1.5.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1368
  len = grub_read (stage1_5_buffer, -1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1369
  grub_close ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1370
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1371
  if (errnum)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1372
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1373
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1374
  size = (len + SECTOR_SIZE - 1) / SECTOR_SIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1375
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1376
  /* Get the device where the Stage 1.5 will be embedded.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1377
  set_device (device);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1378
  if (errnum)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1379
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1380
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1381
  if (current_partition == 0xFFFFFF)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1382
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1383
      /* Embed it after the MBR.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1384
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1385
      char mbr[SECTOR_SIZE];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1386
      char ezbios_check[2*SECTOR_SIZE];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1387
      int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1388
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1389
      /* Open the partition.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1390
      if (! open_partition ())
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1391
	return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1392
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1393
      /* No floppy has MBR.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1394
      if (! (current_drive & 0x80))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1395
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1396
	  errnum = ERR_DEV_VALUES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1397
	  return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1398
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1399
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1400
      /* Read the MBR of CURRENT_DRIVE.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1401
      if (! rawread (current_drive, PC_MBR_SECTOR, 0, SECTOR_SIZE, mbr))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1402
	return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1403
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1404
      /* Sanity check.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1405
      if (! PC_MBR_CHECK_SIG (mbr))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1406
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1407
	  errnum = ERR_BAD_PART_TABLE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1408
	  return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1409
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1410
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1411
      /* Check if the disk can store the Stage 1.5.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1412
      for (i = 0; i < 4; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1413
	if (PC_SLICE_TYPE (mbr, i) && PC_SLICE_START (mbr, i) - 1 < size)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1414
	  {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1415
	    errnum = ERR_NO_DISK_SPACE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1416
	    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1417
	  }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1418
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1419
      /* Check for EZ-BIOS signature. It should be in the third
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1420
       * sector, but due to remapping it can appear in the second, so
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1421
       * load and check both.  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1422
       */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1423
      if (! rawread (current_drive, 1, 0, 2 * SECTOR_SIZE, ezbios_check))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1424
	return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1425
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1426
      if (! memcmp (ezbios_check + 3, "AERMH", 5)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1427
	  || ! memcmp (ezbios_check + 512 + 3, "AERMH", 5))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1428
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1429
	  /* The space after the MBR is used by EZ-BIOS which we must 
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1430
	   * not overwrite.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1431
	   */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1432
	  errnum = ERR_NO_DISK_SPACE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1433
	  return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1434
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1435
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1436
      sector = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1437
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1438
  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1439
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1440
      /* Embed it in the bootloader block in the filesystem.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1441
      int start_sector;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1442
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1443
      /* Open the partition.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1444
      if (! open_device ())
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1445
	return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1446
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1447
      /* Check if the current slice supports embedding.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1448
      if (fsys_table[fsys_type].embed_func == 0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1449
	  || ! fsys_table[fsys_type].embed_func (&start_sector, size))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1450
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1451
	  errnum = ERR_DEV_VALUES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1452
	  return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1453
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1454
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1455
      sector = part_start + start_sector;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1456
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1457
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1458
  /* Clear the cache.  */
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  1459
  buf_track = BUF_CACHE_INVALID;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1460
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1461
  /* Now perform the embedding.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1462
  if (! devwrite (sector - part_start, size, stage1_5_buffer))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1463
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1464
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1465
  grub_printf (" %d sectors are embedded.\n", size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1466
  grub_sprintf (embed_info, "%d+%d", sector - part_start, size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1467
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1468
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1469
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1470
static struct builtin builtin_embed =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1471
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1472
  "embed",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1473
  embed_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1474
  BUILTIN_CMDLINE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1475
  "embed STAGE1_5 DEVICE",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1476
  "Embed the Stage 1.5 STAGE1_5 in the sectors after MBR if DEVICE"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1477
  " is a drive, or in the \"bootloader\" area if DEVICE is a FFS partition."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1478
  " Print the number of sectors which STAGE1_5 occupies if successful."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1479
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1480
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1481

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1482
/* fallback */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1483
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1484
fallback_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1485
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1486
  int i = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1487
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1488
  while (*arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1489
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1490
      int entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1491
      int j;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1492
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1493
      if (! safe_parse_maxint (&arg, &entry))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1494
	return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1495
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1496
      /* Remove duplications to prevent infinite looping.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1497
      for (j = 0; j < i; j++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1498
	if (entry == fallback_entries[j])
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1499
	  break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1500
      if (j != i)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1501
	continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1502
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1503
      fallback_entries[i++] = entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1504
      if (i == MAX_FALLBACK_ENTRIES)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1505
	break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1506
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1507
      arg = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1508
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1509
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1510
  if (i < MAX_FALLBACK_ENTRIES)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1511
    fallback_entries[i] = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1512
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1513
  fallback_entryno = (i == 0) ? -1 : 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1514
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1515
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1516
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1517
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1518
static struct builtin builtin_fallback =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1519
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1520
  "fallback",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1521
  fallback_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1522
  BUILTIN_MENU,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1523
#if 0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1524
  "fallback NUM...",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1525
  "Go into unattended boot mode: if the default boot entry has any"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1526
  " errors, instead of waiting for the user to do anything, it"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1527
  " immediately starts over using the NUM entry (same numbering as the"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1528
  " `default' command). This obviously won't help if the machine"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1529
  " was rebooted by a kernel that GRUB loaded."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1530
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1531
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1532
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1533

7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1534
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1535
void
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1536
set_root (char *root, unsigned long drive, unsigned long part)
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1537
{
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1538
  int bsd_part = (part >> 8) & 0xFF;
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1539
  int pc_slice = part >> 16;
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1540
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1541
  if (bsd_part == 0xFF) {
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1542
    grub_sprintf (root, "(hd%d,%d)\n", drive - 0x80, pc_slice);
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1543
  } else {
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1544
    grub_sprintf (root, "(hd%d,%d,%c)\n",
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1545
		 drive - 0x80, pc_slice, bsd_part + 'a');
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1546
  }
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1547
}
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1548
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1549
static int
6448
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1550
find_common (char *arg, char *root, int for_root, int flags)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1551
{
6448
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1552
  char *filename = NULL;
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1553
  static char argpart[32];
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1554
  static char device[32];
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1555
  char *tmp_argpart = NULL;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1556
  unsigned long drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1557
  unsigned long tmp_drive = saved_drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1558
  unsigned long tmp_partition = saved_partition;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1559
  int got_file = 0;
6448
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1560
  static char bootsign[BOOTSIGN_LEN];
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1561
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1562
  /*
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1563
   * If argument has partition information (findroot command only), then
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1564
   * it can't be a floppy
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1565
   */
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1566
  if (for_root && arg[0] == '(') {
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1567
	tmp_argpart = grub_strchr(arg + 1, ',');
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1568
        if (tmp_argpart == NULL)
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1569
		goto out;
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1570
	grub_strcpy(argpart, tmp_argpart);
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1571
	*tmp_argpart = '\0';
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1572
	arg++;
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1573
        grub_sprintf(bootsign, "%s/%s", BOOTSIGN_DIR, arg);
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1574
	filename = bootsign;
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1575
	goto harddisk;
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1576
  } else if (for_root) {
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1577
	/* Boot signature without partition/slice information */
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1578
        grub_sprintf(bootsign, "%s/%s", BOOTSIGN_DIR, arg);
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1579
	filename = bootsign;
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1580
  } else {
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1581
	/* plain vanilla find cmd */
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1582
	filename = arg;
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1583
  }
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1584
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1585
  /* Floppies.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1586
  for (drive = 0; drive < 8; drive++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1587
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1588
      current_drive = drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1589
      current_partition = 0xFFFFFF;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1590
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1591
      if (open_device ())
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1592
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1593
	  saved_drive = current_drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1594
	  saved_partition = current_partition;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1595
	  if (grub_open (filename))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1596
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1597
	      grub_close ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1598
	      got_file = 1;
6448
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1599
	      if (for_root) {
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1600
		 grub_sprintf(root, "(fd%d)", drive);
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1601
		 goto out;
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1602
	      } else
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1603
	         grub_printf (" (fd%d)\n", drive);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1604
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1605
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1606
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1607
      errnum = ERR_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1608
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1609
6448
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1610
harddisk:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1611
  /* Hard disks.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1612
  for (drive = 0x80; drive < 0x88; drive++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1613
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1614
      unsigned long part = 0xFFFFFF;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1615
      unsigned long start, len, offset, ext_offset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1616
      int type, entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1617
      char buf[SECTOR_SIZE];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1618
6448
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1619
      if (for_root && tmp_argpart) {
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1620
	grub_sprintf(device, "(hd%d%s", drive - 0x80, argpart);
6448
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1621
	set_device(device);
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1622
        errnum = ERR_NONE;
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1623
	part = current_partition;
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1624
	if (open_device ()) {
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1625
	   saved_drive = current_drive;
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1626
	   saved_partition = current_partition;
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1627
           errnum = ERR_NONE;
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1628
	   if (grub_open (filename)) {
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1629
	      grub_close ();
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1630
	      got_file = 1;
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1631
	      if (is_zfs_mount == 0) {
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1632
	        set_root(root, current_drive, current_partition);
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1633
	        goto out;
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1634
	      } else {
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1635
		best_drive = current_drive;
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1636
		best_part = current_partition;
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1637
	      }
6448
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1638
           }
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1639
	}
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1640
        errnum = ERR_NONE;
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1641
	continue;
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1642
      }
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1643
      current_drive = drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1644
      while (next_partition (drive, 0xFFFFFF, &part, &type,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1645
			     &start, &len, &offset, &entry,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1646
			     &ext_offset, buf))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1647
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1648
	  if (type != PC_SLICE_TYPE_NONE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1649
	      && ! IS_PC_SLICE_TYPE_BSD (type)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1650
	      && ! IS_PC_SLICE_TYPE_EXTENDED (type))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1651
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1652
	      current_partition = part;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1653
	      if (open_device ())
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1654
		{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1655
		  saved_drive = current_drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1656
		  saved_partition = current_partition;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1657
		  if (grub_open (filename))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1658
		    {
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1659
		      char tmproot[32];
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1660
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1661
		      grub_close ();
6448
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1662
		      got_file = 1;
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1663
		      set_root(tmproot, drive, part);
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1664
		      if (for_root) {
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1665
		 	grub_memcpy(root, tmproot, sizeof(tmproot));
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1666
			if (is_zfs_mount == 0) {
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1667
			      goto out;
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1668
			} else {
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1669
			      best_drive = current_drive;
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1670
			      best_part = current_partition;
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1671
			}
6448
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1672
		      } else {
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1673
			grub_printf("%s", tmproot);
6448
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1674
		      }
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1675
		    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1676
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1677
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1678
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1679
	  /* We want to ignore any error here.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1680
	  errnum = ERR_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1681
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1682
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1683
      /* next_partition always sets ERRNUM in the last call, so clear
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1684
	 it.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1685
      errnum = ERR_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1686
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1687
6448
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1688
out:
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1689
  if (is_zfs_mount && for_root) {
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1690
        set_root(root, best_drive, best_part);
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1691
	buf_drive = -1;
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1692
  } else {
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1693
	saved_drive = tmp_drive;
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1694
	saved_partition = tmp_partition;
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  1695
  }
6448
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1696
  if (tmp_argpart)
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1697
	*tmp_argpart = ',';
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1698
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1699
  if (got_file)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1700
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1701
      errnum = ERR_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1702
      return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1703
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1704
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1705
  errnum = ERR_FILE_NOT_FOUND;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1706
  return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1707
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1708
6448
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1709
/* find */
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1710
/* Search for the filename ARG in all of partitions.  */
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1711
static int
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1712
find_func (char *arg, int flags)
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1713
{
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1714
	return (find_common(arg, NULL, 0, flags));
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1715
}
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  1716
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1717
static struct builtin builtin_find =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1718
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1719
  "find",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1720
  find_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1721
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1722
  "find FILENAME",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1723
  "Search for the filename FILENAME in all of partitions and print the list of"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1724
  " the devices which contain the file."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1725
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1726
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1727

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1728
/* fstest */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1729
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1730
fstest_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1731
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1732
  if (disk_read_hook)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1733
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1734
      disk_read_hook = NULL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1735
      printf (" Filesystem tracing is now off\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1736
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1737
  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1738
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1739
      disk_read_hook = disk_read_print_func;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1740
      printf (" Filesystem tracing is now on\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1741
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1742
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1743
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1744
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1745
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1746
static struct builtin builtin_fstest =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1747
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1748
  "fstest",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1749
  fstest_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1750
  BUILTIN_CMDLINE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1751
  "fstest",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1752
  "Toggle filesystem test mode."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1753
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1754
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1755

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1756
/* geometry */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1757
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1758
geometry_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1759
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1760
  struct geometry geom;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1761
  char *msg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1762
  char *device = arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1763
#ifdef GRUB_UTIL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1764
  char *ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1765
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1766
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1767
  /* Get the device number.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1768
  set_device (device);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1769
  if (errnum)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1770
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1771
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1772
  /* Check for the geometry.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1773
  if (get_diskinfo (current_drive, &geom))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1774
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1775
      errnum = ERR_NO_DISK;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1776
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1777
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1778
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1779
  /* Attempt to read the first sector, because some BIOSes turns out not
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1780
     to support LBA even though they set the bit 0 in the support
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1781
     bitmap, only after reading something actually.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1782
  if (biosdisk (BIOSDISK_READ, current_drive, &geom, 0, 1, SCRATCHSEG))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1783
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1784
      errnum = ERR_READ;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1785
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1786
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1787
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1788
#ifdef GRUB_UTIL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1789
  ptr = skip_to (0, device);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1790
  if (*ptr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1791
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1792
      char *cylinder, *head, *sector, *total_sector;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1793
      int num_cylinder, num_head, num_sector, num_total_sector;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1794
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1795
      cylinder = ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1796
      head = skip_to (0, cylinder);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1797
      sector = skip_to (0, head);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1798
      total_sector = skip_to (0, sector);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1799
      if (! safe_parse_maxint (&cylinder, &num_cylinder)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1800
	  || ! safe_parse_maxint (&head, &num_head)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1801
	  || ! safe_parse_maxint (&sector, &num_sector))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1802
	return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1803
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1804
      disks[current_drive].cylinders = num_cylinder;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1805
      disks[current_drive].heads = num_head;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1806
      disks[current_drive].sectors = num_sector;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1807
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1808
      if (safe_parse_maxint (&total_sector, &num_total_sector))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1809
	disks[current_drive].total_sectors = num_total_sector;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1810
      else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1811
	disks[current_drive].total_sectors
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1812
	  = num_cylinder * num_head * num_sector;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1813
      errnum = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1814
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1815
      geom = disks[current_drive];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1816
      buf_drive = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1817
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1818
#endif /* GRUB_UTIL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1819
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1820
#ifdef GRUB_UTIL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1821
  msg = device_map[current_drive];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1822
#else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1823
  if (geom.flags & BIOSDISK_FLAG_LBA_EXTENSION)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1824
    msg = "LBA";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1825
  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1826
    msg = "CHS";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1827
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1828
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1829
  grub_printf ("drive 0x%x: C/H/S = %d/%d/%d, "
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  1830
	       "The number of sectors = %u, %s\n",
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1831
	       current_drive,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1832
	       geom.cylinders, geom.heads, geom.sectors,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1833
	       geom.total_sectors, msg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1834
  real_open_partition (1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1835
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1836
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1837
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1838
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1839
static struct builtin builtin_geometry =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1840
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1841
  "geometry",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1842
  geometry_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1843
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1844
  "geometry DRIVE [CYLINDER HEAD SECTOR [TOTAL_SECTOR]]",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1845
  "Print the information for a drive DRIVE. In the grub shell, you can"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1846
  " set the geometry of the drive arbitrarily. The number of the cylinders,"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1847
  " the one of the heads, the one of the sectors and the one of the total"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1848
  " sectors are set to CYLINDER, HEAD, SECTOR and TOTAL_SECTOR,"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1849
  " respectively. If you omit TOTAL_SECTOR, then it will be calculated based"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1850
  " on the C/H/S values automatically."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1851
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1852
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1853

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1854
/* halt */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1855
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1856
halt_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1857
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1858
  int no_apm;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1859
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1860
  no_apm = (grub_memcmp (arg, "--no-apm", 8) == 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1861
  grub_halt (no_apm);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1862
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1863
  /* Never reach here.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1864
  return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1865
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1866
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1867
static struct builtin builtin_halt =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1868
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1869
  "halt",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1870
  halt_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1871
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1872
  "halt [--no-apm]",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1873
  "Halt your system. If APM is avaiable on it, turn off the power using"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1874
  " the APM BIOS, unless you specify the option `--no-apm'."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1875
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1876
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1877

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1878
/* help */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1879
#define MAX_SHORT_DOC_LEN	39
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1880
#define MAX_LONG_DOC_LEN	66
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1881
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1882
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1883
help_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1884
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1885
  int all = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1886
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1887
  if (grub_memcmp (arg, "--all", sizeof ("--all") - 1) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1888
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1889
      all = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1890
      arg = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1891
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1892
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1893
  if (! *arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1894
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1895
      /* Invoked with no argument. Print the list of the short docs.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1896
      struct builtin **builtin;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1897
      int left = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1898
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1899
      for (builtin = builtin_table; *builtin != 0; builtin++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1900
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1901
	  int len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1902
	  int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1903
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1904
	  /* If this cannot be used in the command-line interface,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1905
	     skip this.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1906
	  if (! ((*builtin)->flags & BUILTIN_CMDLINE))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1907
	    continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1908
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1909
	  /* If this doesn't need to be listed automatically and "--all"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1910
	     is not specified, skip this.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1911
	  if (! all && ! ((*builtin)->flags & BUILTIN_HELP_LIST))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1912
	    continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1913
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1914
	  len = grub_strlen ((*builtin)->short_doc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1915
	  /* If the length of SHORT_DOC is too long, truncate it.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1916
	  if (len > MAX_SHORT_DOC_LEN - 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1917
	    len = MAX_SHORT_DOC_LEN - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1918
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1919
	  for (i = 0; i < len; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1920
	    grub_putchar ((*builtin)->short_doc[i]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1921
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1922
	  for (; i < MAX_SHORT_DOC_LEN; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1923
	    grub_putchar (' ');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1924
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1925
	  if (! left)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1926
	    grub_putchar ('\n');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1927
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1928
	  left = ! left;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1929
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1930
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1931
      /* If the last entry was at the left column, no newline was printed
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1932
	 at the end.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1933
      if (! left)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1934
	grub_putchar ('\n');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1935
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1936
  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1937
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1938
      /* Invoked with one or more patterns.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1939
      do
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1940
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1941
	  struct builtin **builtin;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1942
	  char *next_arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1943
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1944
	  /* Get the next argument.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1945
	  next_arg = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1946
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1947
	  /* Terminate ARG.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1948
	  nul_terminate (arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1949
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1950
	  for (builtin = builtin_table; *builtin; builtin++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1951
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1952
	      /* Skip this if this is only for the configuration file.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1953
	      if (! ((*builtin)->flags & BUILTIN_CMDLINE))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1954
		continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1955
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1956
	      if (substring (arg, (*builtin)->name) < 1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1957
		{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1958
		  char *doc = (*builtin)->long_doc;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1959
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1960
		  /* At first, print the name and the short doc.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1961
		  grub_printf ("%s: %s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1962
			       (*builtin)->name, (*builtin)->short_doc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1963
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1964
		  /* Print the long doc.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1965
		  while (*doc)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1966
		    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1967
		      int len = grub_strlen (doc);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1968
		      int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1969
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1970
		      /* If LEN is too long, fold DOC.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1971
		      if (len > MAX_LONG_DOC_LEN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1972
			{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1973
			  /* Fold this line at the position of a space.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1974
			  for (len = MAX_LONG_DOC_LEN; len > 0; len--)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1975
			    if (doc[len - 1] == ' ')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1976
			      break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1977
			}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1978
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1979
		      grub_printf ("    ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1980
		      for (i = 0; i < len; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1981
			grub_putchar (*doc++);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1982
		      grub_putchar ('\n');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1983
		    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1984
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1985
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1986
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1987
	  arg = next_arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1988
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1989
      while (*arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1990
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1991
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1992
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1993
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1994
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1995
static struct builtin builtin_help =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1996
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1997
  "help",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1998
  help_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  1999
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2000
  "help [--all] [PATTERN ...]",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2001
  "Display helpful information about builtin commands. Not all commands"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2002
  " aren't shown without the option `--all'."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2003
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2004
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2005

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2006
/* hiddenmenu */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2007
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2008
hiddenmenu_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2009
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2010
  show_menu = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2011
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2012
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2013
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2014
static struct builtin builtin_hiddenmenu =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2015
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2016
  "hiddenmenu",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2017
  hiddenmenu_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2018
  BUILTIN_MENU,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2019
#if 0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2020
  "hiddenmenu",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2021
  "Hide the menu."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2022
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2023
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2024
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2025

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2026
/* hide */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2027
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2028
hide_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2029
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2030
  if (! set_device (arg))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2031
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2032
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2033
  if (! set_partition_hidden_flag (1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2034
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2035
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2036
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2037
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2038
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2039
static struct builtin builtin_hide =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2040
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2041
  "hide",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2042
  hide_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2043
  BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2044
  "hide PARTITION",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2045
  "Hide PARTITION by setting the \"hidden\" bit in"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2046
  " its partition type code."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2047
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2048
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2049

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2050
#ifdef SUPPORT_NETBOOT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2051
/* ifconfig */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2052
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2053
ifconfig_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2054
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2055
  char *svr = 0, *ip = 0, *gw = 0, *sm = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2056
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2057
  if (! grub_eth_probe ())
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2058
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2059
      grub_printf ("No ethernet card found.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2060
      errnum = ERR_DEV_VALUES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2061
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2062
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2063
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2064
  while (*arg) 
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2065
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2066
      if (! grub_memcmp ("--server=", arg, sizeof ("--server=") - 1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2067
	svr = arg + sizeof("--server=") - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2068
      else if (! grub_memcmp ("--address=", arg, sizeof ("--address=") - 1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2069
	ip = arg + sizeof ("--address=") - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2070
      else if (! grub_memcmp ("--gateway=", arg, sizeof ("--gateway=") - 1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2071
	gw = arg + sizeof ("--gateway=") - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2072
      else if (! grub_memcmp ("--mask=", arg, sizeof("--mask=") - 1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2073
	sm = arg + sizeof ("--mask=") - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2074
      else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2075
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2076
	  errnum = ERR_BAD_ARGUMENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2077
	  return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2078
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2079
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2080
      arg = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2081
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2082
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2083
  if (! ifconfig (ip, sm, gw, svr))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2084
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2085
      errnum = ERR_BAD_ARGUMENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2086
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2087
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2088
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2089
  print_network_configuration ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2090
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2091
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2092
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2093
static struct builtin builtin_ifconfig =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2094
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2095
  "ifconfig",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2096
  ifconfig_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2097
  BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2098
  "ifconfig [--address=IP] [--gateway=IP] [--mask=MASK] [--server=IP]",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2099
  "Configure the IP address, the netmask, the gateway and the server"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2100
  " address or print current network configuration."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2101
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2102
#endif /* SUPPORT_NETBOOT */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2103
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2104

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2105
/* impsprobe */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2106
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2107
impsprobe_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2108
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2109
#ifdef GRUB_UTIL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2110
  /* In the grub shell, we cannot probe IMPS.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2111
  errnum = ERR_UNRECOGNIZED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2112
  return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2113
#else /* ! GRUB_UTIL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2114
  if (!imps_probe ())
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2115
    printf (" No MPS information found or probe failed\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2116
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2117
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2118
#endif /* ! GRUB_UTIL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2119
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2120
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2121
static struct builtin builtin_impsprobe =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2122
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2123
  "impsprobe",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2124
  impsprobe_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2125
  BUILTIN_CMDLINE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2126
  "impsprobe",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2127
  "Probe the Intel Multiprocessor Specification 1.1 or 1.4"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2128
  " configuration table and boot the various CPUs which are found into"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2129
  " a tight loop."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2130
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2131
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2132

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2133
/* initrd */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2134
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2135
initrd_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2136
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2137
  switch (kernel_type)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2138
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2139
    case KERNEL_TYPE_LINUX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2140
    case KERNEL_TYPE_BIG_LINUX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2141
      if (! load_initrd (arg))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2142
	return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2143
      break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2144
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2145
    default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2146
      errnum = ERR_NEED_LX_KERNEL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2147
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2148
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2149
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2150
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2151
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2152
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2153
static struct builtin builtin_initrd =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2154
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2155
  "initrd",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2156
  initrd_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2157
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2158
  "initrd FILE [ARG ...]",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2159
  "Load an initial ramdisk FILE for a Linux format boot image and set the"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2160
  " appropriate parameters in the Linux setup area in memory."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2161
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2162
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2163

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2164
/* install */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2165
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2166
install_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2167
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2168
  char *stage1_file, *dest_dev, *file, *addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2169
  char *stage1_buffer = (char *) RAW_ADDR (0x100000);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2170
  char *stage2_buffer = stage1_buffer + SECTOR_SIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2171
  char *old_sect = stage2_buffer + SECTOR_SIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2172
  char *stage2_first_buffer = old_sect + SECTOR_SIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2173
  char *stage2_second_buffer = stage2_first_buffer + SECTOR_SIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2174
  /* XXX: Probably SECTOR_SIZE is reasonable.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2175
  char *config_filename = stage2_second_buffer + SECTOR_SIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2176
  char *dummy = config_filename + SECTOR_SIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2177
  int new_drive = GRUB_INVALID_DRIVE;
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2178
  int dest_drive, dest_partition;
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2179
  unsigned int dest_sector;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2180
  int src_drive, src_partition, src_part_start;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2181
  int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2182
  struct geometry dest_geom, src_geom;
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2183
  unsigned int saved_sector;
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2184
  unsigned int stage2_first_sector, stage2_second_sector;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2185
  char *ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2186
  int installaddr, installlist;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2187
  /* Point to the location of the name of a configuration file in Stage 2.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2188
  char *config_file_location;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2189
  /* If FILE is a Stage 1.5?  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2190
  int is_stage1_5 = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2191
  /* Must call grub_close?  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2192
  int is_open = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2193
  /* If LBA is forced?  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2194
  int is_force_lba = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2195
  /* Was the last sector full? */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2196
  int last_length = SECTOR_SIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2197
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2198
#ifdef GRUB_UTIL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2199
  /* If the Stage 2 is in a partition mounted by an OS, this will store
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2200
     the filename under the OS.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2201
  char *stage2_os_file = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2202
#endif /* GRUB_UTIL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2203
  
8044
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
  2204
  auto void disk_read_savesect_func (unsigned int sector, int offset,
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
  2205
      int length);
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
  2206
  auto void disk_read_blocklist_func (unsigned int sector, int offset,
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
  2207
      int length);
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
  2208
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2209
  /* Save the first sector of Stage2 in STAGE2_SECT.  */
8044
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
  2210
  auto void disk_read_savesect_func (unsigned int sector, int offset,
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
  2211
      int length)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2212
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2213
      if (debug)
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2214
	printf ("[%u]", sector);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2215
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2216
      /* ReiserFS has files which sometimes contain data not aligned
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2217
         on sector boundaries.  Returning an error is better than
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2218
         silently failing. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2219
      if (offset != 0 || length != SECTOR_SIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2220
	errnum = ERR_UNALIGNED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2221
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2222
      saved_sector = sector;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2223
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2224
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2225
  /* Write SECTOR to INSTALLLIST, and update INSTALLADDR and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2226
     INSTALLSECT.  */
8044
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
  2227
  auto void disk_read_blocklist_func (unsigned int sector, int offset,
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
  2228
      int length)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2229
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2230
      if (debug)
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2231
	printf("[%u]", sector);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2232
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2233
      if (offset != 0 || last_length != SECTOR_SIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2234
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2235
	  /* We found a non-sector-aligned data block. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2236
	  errnum = ERR_UNALIGNED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2237
	  return;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2238
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2239
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2240
      last_length = length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2241
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2242
      if (*((unsigned long *) (installlist - 4))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2243
	  + *((unsigned short *) installlist) != sector
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2244
	  || installlist == (int) stage2_first_buffer + SECTOR_SIZE + 4)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2245
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2246
	  installlist -= 8;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2247
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2248
	  if (*((unsigned long *) (installlist - 8)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2249
	    errnum = ERR_WONT_FIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2250
	  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2251
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2252
	      *((unsigned short *) (installlist + 2)) = (installaddr >> 4);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2253
	      *((unsigned long *) (installlist - 4)) = sector;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2254
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2255
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2256
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2257
      *((unsigned short *) installlist) += 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2258
      installaddr += 512;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2259
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2260
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2261
  /* First, check the GNU-style long option.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2262
  while (1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2263
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2264
      if (grub_memcmp ("--force-lba", arg, sizeof ("--force-lba") - 1) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2265
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2266
	  is_force_lba = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2267
	  arg = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2268
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2269
#ifdef GRUB_UTIL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2270
      else if (grub_memcmp ("--stage2=", arg, sizeof ("--stage2=") - 1) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2271
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2272
	  stage2_os_file = arg + sizeof ("--stage2=") - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2273
	  arg = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2274
	  nul_terminate (stage2_os_file);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2275
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2276
#endif /* GRUB_UTIL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2277
      else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2278
	break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2279
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2280
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2281
  stage1_file = arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2282
  dest_dev = skip_to (0, stage1_file);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2283
  if (*dest_dev == 'd')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2284
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2285
      new_drive = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2286
      dest_dev = skip_to (0, dest_dev);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2287
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2288
  file = skip_to (0, dest_dev);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2289
  addr = skip_to (0, file);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2290
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2291
  /* Get the installation address.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2292
  if (! safe_parse_maxint (&addr, &installaddr))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2293
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2294
      /* ADDR is not specified.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2295
      installaddr = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2296
      ptr = addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2297
      errnum = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2298
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2299
  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2300
    ptr = skip_to (0, addr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2301
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2302
#ifndef NO_DECOMPRESSION
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2303
  /* Do not decompress Stage 1 or Stage 2.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2304
  no_decompression = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2305
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2306
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2307
  /* Read Stage 1.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2308
  is_open = grub_open (stage1_file);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2309
  if (! is_open
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2310
      || ! grub_read (stage1_buffer, SECTOR_SIZE) == SECTOR_SIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2311
    goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2312
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2313
  /* Read the old sector from DEST_DEV.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2314
  if (! set_device (dest_dev)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2315
      || ! open_partition ()
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2316
      || ! devread (0, 0, SECTOR_SIZE, old_sect))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2317
    goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2318
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2319
  /* Store the information for the destination device.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2320
  dest_drive = current_drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2321
  dest_partition = current_partition;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2322
  dest_geom = buf_geom;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2323
  dest_sector = part_start;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2324
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2325
  /* Copy the possible DOS BPB, 59 bytes at byte offset 3.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2326
  grub_memmove (stage1_buffer + BOOTSEC_BPB_OFFSET,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2327
		old_sect + BOOTSEC_BPB_OFFSET,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2328
		BOOTSEC_BPB_LENGTH);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2329
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2330
  /* If for a hard disk, copy the possible MBR/extended part table.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2331
  if (dest_drive & 0x80)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2332
    grub_memmove (stage1_buffer + STAGE1_WINDOWS_NT_MAGIC,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2333
		  old_sect + STAGE1_WINDOWS_NT_MAGIC,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2334
		  STAGE1_PARTEND - STAGE1_WINDOWS_NT_MAGIC);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2335
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2336
  /* Check for the version and the signature of Stage 1.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2337
  if (*((short *)(stage1_buffer + STAGE1_VER_MAJ_OFFS)) != COMPAT_VERSION
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2338
      || (*((unsigned short *) (stage1_buffer + BOOTSEC_SIG_OFFSET))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2339
	  != BOOTSEC_SIGNATURE))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2340
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2341
      errnum = ERR_BAD_VERSION;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2342
      goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2343
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2344
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2345
  /* This below is not true any longer. But should we leave this alone?  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2346
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2347
  /* If DEST_DRIVE is a floppy, Stage 2 must have the iteration probe
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2348
     routine.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2349
  if (! (dest_drive & 0x80)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2350
      && (*((unsigned char *) (stage1_buffer + BOOTSEC_PART_OFFSET)) == 0x80
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2351
	  || stage1_buffer[BOOTSEC_PART_OFFSET] == 0))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2352
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2353
      errnum = ERR_BAD_VERSION;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2354
      goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2355
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2356
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2357
  grub_close ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2358
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2359
  /* Open Stage 2.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2360
  is_open = grub_open (file);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2361
  if (! is_open)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2362
    goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2363
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2364
  src_drive = current_drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2365
  src_partition = current_partition;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2366
  src_part_start = part_start;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2367
  src_geom = buf_geom;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2368
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2369
  if (! new_drive)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2370
    new_drive = src_drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2371
  else if (src_drive != dest_drive)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2372
    grub_printf ("Warning: the option `d' was not used, but the Stage 1 will"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2373
		 " be installed on a\ndifferent drive than the drive where"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2374
		 " the Stage 2 resides.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2375
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2376
  /* Set the boot drive.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2377
  *((unsigned char *) (stage1_buffer + STAGE1_BOOT_DRIVE)) = new_drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2378
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2379
  /* Set the "force LBA" flag.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2380
  *((unsigned char *) (stage1_buffer + STAGE1_FORCE_LBA)) = is_force_lba;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2381
8044
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
  2382
  /* If DEST_DRIVE is a hard disk, enable the workaround, which is
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
  2383
     for buggy BIOSes which don't pass boot drive correctly. Instead,
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
  2384
     they pass 0x00 or 0x01 even when booted from 0x80.  */
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
  2385
  if (dest_drive & BIOS_FLAG_FIXED_DISK)
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
  2386
    /* Replace the jmp (2 bytes) with double nop's.  */
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
  2387
    *((unsigned short *) (stage1_buffer + STAGE1_BOOT_DRIVE_CHECK))
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
  2388
      = 0x9090;
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
  2389
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2390
  /* Read the first sector of Stage 2.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2391
  disk_read_hook = disk_read_savesect_func;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2392
  if (grub_read (stage2_first_buffer, SECTOR_SIZE) != SECTOR_SIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2393
    goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2394
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2395
  stage2_first_sector = saved_sector;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2396
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2397
  /* Read the second sector of Stage 2.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2398
  if (grub_read (stage2_second_buffer, SECTOR_SIZE) != SECTOR_SIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2399
    goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2400
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2401
  stage2_second_sector = saved_sector;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2402
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2403
  /* Check for the version of Stage 2.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2404
  if (*((short *) (stage2_second_buffer + STAGE2_VER_MAJ_OFFS))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2405
      != COMPAT_VERSION)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2406
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2407
      errnum = ERR_BAD_VERSION;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2408
      goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2409
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2410
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2411
  /* Check for the Stage 2 id.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2412
  if (stage2_second_buffer[STAGE2_STAGE2_ID] != STAGE2_ID_STAGE2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2413
    is_stage1_5 = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2414
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2415
  /* If INSTALLADDR is not specified explicitly in the command-line,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2416
     determine it by the Stage 2 id.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2417
  if (! installaddr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2418
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2419
      if (! is_stage1_5)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2420
	/* Stage 2.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2421
	installaddr = 0x8000;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2422
      else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2423
	/* Stage 1.5.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2424
	installaddr = 0x2000;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2425
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2426
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2427
  *((unsigned long *) (stage1_buffer + STAGE1_STAGE2_SECTOR))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2428
    = stage2_first_sector;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2429
  *((unsigned short *) (stage1_buffer + STAGE1_STAGE2_ADDRESS))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2430
    = installaddr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2431
  *((unsigned short *) (stage1_buffer + STAGE1_STAGE2_SEGMENT))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2432
    = installaddr >> 4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2433
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2434
  i = (int) stage2_first_buffer + SECTOR_SIZE - 4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2435
  while (*((unsigned long *) i))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2436
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2437
      if (i < (int) stage2_first_buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2438
	  || (*((int *) (i - 4)) & 0x80000000)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2439
	  || *((unsigned short *) i) >= 0xA00
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2440
	  || *((short *) (i + 2)) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2441
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2442
	  errnum = ERR_BAD_VERSION;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2443
	  goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2444
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2445
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2446
      *((int *) i) = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2447
      *((int *) (i - 4)) = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2448
      i -= 8;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2449
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2450
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2451
  installlist = (int) stage2_first_buffer + SECTOR_SIZE + 4;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2452
  installaddr += SECTOR_SIZE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2453
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2454
  /* Read the whole of Stage2 except for the first sector.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2455
  grub_seek (SECTOR_SIZE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2456
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2457
  disk_read_hook = disk_read_blocklist_func;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2458
  if (! grub_read (dummy, -1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2459
    goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2460
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2461
  disk_read_hook = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2462
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2463
  /* Find a string for the configuration filename.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2464
  config_file_location = stage2_second_buffer + STAGE2_VER_STR_OFFS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2465
  while (*(config_file_location++))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2466
    ;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2467
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2468
  /* Set the "force LBA" flag for Stage2.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2469
  *((unsigned char *) (stage2_second_buffer + STAGE2_FORCE_LBA))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2470
    = is_force_lba;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2471
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2472
  if (*ptr == 'p')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2473
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2474
      *((long *) (stage2_second_buffer + STAGE2_INSTALLPART))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2475
	= src_partition;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2476
      if (is_stage1_5)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2477
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2478
	  /* Reset the device information in FILE if it is a Stage 1.5.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2479
	  unsigned long device = 0xFFFFFFFF;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2480
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2481
	  grub_memmove (config_file_location, (char *) &device,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2482
			sizeof (device));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2483
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2484
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2485
      ptr = skip_to (0, ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2486
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2487
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2488
  if (*ptr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2489
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2490
      grub_strcpy (config_filename, ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2491
      nul_terminate (config_filename);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2492
	
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2493
      if (! is_stage1_5)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2494
	/* If it is a Stage 2, just copy PTR to CONFIG_FILE_LOCATION.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2495
	grub_strcpy (config_file_location, ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2496
      else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2497
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2498
	  char *real_config;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2499
	  unsigned long device;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2500
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2501
	  /* Translate the external device syntax to the internal device
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2502
	     syntax.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2503
	  if (! (real_config = set_device (ptr)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2504
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2505
	      /* The Stage 2 PTR does not contain the device name, so
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2506
		 use the root device instead.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2507
	      errnum = ERR_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2508
	      current_drive = saved_drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2509
	      current_partition = saved_partition;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2510
	      real_config = ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2511
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2512
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2513
	  if (current_drive == src_drive)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2514
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2515
	      /* If the drive where the Stage 2 resides is the same as
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2516
		 the one where the Stage 1.5 resides, do not embed the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2517
		 drive number.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2518
	      current_drive = GRUB_INVALID_DRIVE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2519
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2520
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2521
	  device = (current_drive << 24) | current_partition;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2522
	  grub_memmove (config_file_location, (char *) &device,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2523
			sizeof (device));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2524
	  grub_strcpy (config_file_location + sizeof (device),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2525
		       real_config);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2526
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2527
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2528
      /* If a Stage 1.5 is used, then we need to modify the Stage2.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2529
      if (is_stage1_5)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2530
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2531
	  char *real_config_filename = skip_to (0, ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2532
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2533
	  is_open = grub_open (config_filename);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2534
	  if (! is_open)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2535
	    goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2536
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2537
	  /* Skip the first sector.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2538
	  grub_seek (SECTOR_SIZE);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2539
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2540
	  disk_read_hook = disk_read_savesect_func;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2541
	  if (grub_read (stage2_buffer, SECTOR_SIZE) != SECTOR_SIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2542
	    goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2543
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2544
	  disk_read_hook = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2545
	  grub_close ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2546
	  is_open = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2547
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2548
	  /* Sanity check.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2549
	  if (*(stage2_buffer + STAGE2_STAGE2_ID) != STAGE2_ID_STAGE2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2550
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2551
	      errnum = ERR_BAD_VERSION;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2552
	      goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2553
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2554
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2555
	  /* Set the "force LBA" flag for Stage2.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2556
	  *(stage2_buffer + STAGE2_FORCE_LBA) = is_force_lba;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2557
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2558
	  /* If REAL_CONFIG_FILENAME is specified, copy it to the Stage2.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2559
	  if (*real_config_filename)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2560
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2561
	      /* Specified */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2562
	      char *location;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2563
	      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2564
	      /* Find a string for the configuration filename.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2565
	      location = stage2_buffer + STAGE2_VER_STR_OFFS;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2566
	      while (*(location++))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2567
		;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2568
	      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2569
	      /* Copy the name.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2570
	      grub_strcpy (location, real_config_filename);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2571
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2572
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2573
	  /* Write it to the disk.  */
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2574
	  buf_track = BUF_CACHE_INVALID;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2575
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2576
#ifdef GRUB_UTIL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2577
	  /* In the grub shell, access the Stage 2 via the OS filesystem
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2578
	     service, if possible.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2579
	  if (stage2_os_file)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2580
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2581
	      FILE *fp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2582
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2583
	      fp = fopen (stage2_os_file, "r+");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2584
	      if (! fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2585
		{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2586
		  errnum = ERR_FILE_NOT_FOUND;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2587
		  goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2588
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2589
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2590
	      if (fseek (fp, SECTOR_SIZE, SEEK_SET) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2591
		{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2592
		  fclose (fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2593
		  errnum = ERR_BAD_VERSION;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2594
		  goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2595
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2596
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2597
	      if (fwrite (stage2_buffer, 1, SECTOR_SIZE, fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2598
		  != SECTOR_SIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2599
		{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2600
		  fclose (fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2601
		  errnum = ERR_WRITE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2602
		  goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2603
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2604
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2605
	      fclose (fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2606
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2607
	  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2608
#endif /* GRUB_UTIL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2609
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2610
	      if (! devwrite (saved_sector - part_start, 1, stage2_buffer))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2611
		goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2612
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2613
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2614
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2615
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2616
  /* Clear the cache.  */
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2617
  buf_track = BUF_CACHE_INVALID;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2618
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2619
  /* Write the modified sectors of Stage2 to the disk.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2620
#ifdef GRUB_UTIL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2621
  if (! is_stage1_5 && stage2_os_file)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2622
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2623
      FILE *fp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2624
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2625
      fp = fopen (stage2_os_file, "r+");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2626
      if (! fp)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2627
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2628
	  errnum = ERR_FILE_NOT_FOUND;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2629
	  goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2630
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2631
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2632
      if (fwrite (stage2_first_buffer, 1, SECTOR_SIZE, fp) != SECTOR_SIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2633
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2634
	  fclose (fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2635
	  errnum = ERR_WRITE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2636
	  goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2637
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2638
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2639
      if (fwrite (stage2_second_buffer, 1, SECTOR_SIZE, fp) != SECTOR_SIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2640
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2641
	  fclose (fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2642
	  errnum = ERR_WRITE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2643
	  goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2644
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2645
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2646
      fclose (fp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2647
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2648
  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2649
#endif /* GRUB_UTIL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2650
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2651
      /* The first.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2652
      current_drive = src_drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2653
      current_partition = src_partition;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2654
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2655
      if (! open_partition ())
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2656
	goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2657
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2658
      if (! devwrite (stage2_first_sector - src_part_start, 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2659
		      stage2_first_buffer))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2660
	goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2661
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2662
      if (! devwrite (stage2_second_sector - src_part_start, 1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2663
		      stage2_second_buffer))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2664
	goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2665
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2666
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2667
  /* Write the modified sector of Stage 1 to the disk.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2668
  current_drive = dest_drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2669
  current_partition = dest_partition;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2670
  if (! open_partition ())
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2671
    goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2672
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2673
  devwrite (0, 1, stage1_buffer);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2674
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2675
 fail:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2676
  if (is_open)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2677
    grub_close ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2678
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2679
  disk_read_hook = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2680
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2681
#ifndef NO_DECOMPRESSION
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2682
  no_decompression = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2683
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2684
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2685
  return errnum;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2686
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2687
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2688
static struct builtin builtin_install =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2689
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2690
  "install",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2691
  install_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2692
  BUILTIN_CMDLINE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2693
  "install [--stage2=STAGE2_FILE] [--force-lba] STAGE1 [d] DEVICE STAGE2 [ADDR] [p] [CONFIG_FILE] [REAL_CONFIG_FILE]",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2694
  "Install STAGE1 on DEVICE, and install a blocklist for loading STAGE2"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2695
  " as a Stage 2. If the option `d' is present, the Stage 1 will always"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2696
  " look for the disk where STAGE2 was installed, rather than using"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2697
  " the booting drive. The Stage 2 will be loaded at address ADDR, which"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2698
  " will be determined automatically if you don't specify it. If"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2699
  " the option `p' or CONFIG_FILE is present, then the first block"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2700
  " of Stage 2 is patched with new values of the partition and name"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2701
  " of the configuration file used by the true Stage 2 (for a Stage 1.5,"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2702
  " this is the name of the true Stage 2) at boot time. If STAGE2 is a Stage"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2703
  " 1.5 and REAL_CONFIG_FILE is present, then the Stage 2 CONFIG_FILE is"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2704
  " patched with the configuration filename REAL_CONFIG_FILE."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2705
  " If the option `--force-lba' is specified, disable some sanity checks"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2706
  " for LBA mode. If the option `--stage2' is specified, rewrite the Stage"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2707
  " 2 via your OS's filesystem instead of the raw device."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2708
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2709
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2710

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2711
/* ioprobe */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2712
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2713
ioprobe_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2714
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2715
#ifdef GRUB_UTIL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2716
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2717
  errnum = ERR_UNRECOGNIZED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2718
  return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2719
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2720
#else /* ! GRUB_UTIL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2721
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2722
  unsigned short *port;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2723
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2724
  /* Get the drive number.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2725
  set_device (arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2726
  if (errnum)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2727
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2728
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2729
  /* Clean out IO_MAP.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2730
  grub_memset ((char *) io_map, 0, IO_MAP_SIZE * sizeof (unsigned short));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2731
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2732
  /* Track the int13 handler.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2733
  track_int13 (current_drive);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2734
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2735
  /* Print out the result.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2736
  for (port = io_map; *port != 0; port++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2737
    grub_printf (" 0x%x", (unsigned int) *port);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2738
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2739
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2740
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2741
#endif /* ! GRUB_UTIL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2742
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2743
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2744
static struct builtin builtin_ioprobe =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2745
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2746
  "ioprobe",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2747
  ioprobe_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2748
  BUILTIN_CMDLINE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2749
  "ioprobe DRIVE",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2750
  "Probe I/O ports used for the drive DRIVE."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2751
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2752
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2753

3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2754
/*
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2755
 * To boot from a ZFS root filesystem, the kernel$ or module$ commands
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2756
 * must include "-B $ZFS-BOOTFS" to pass to the kernel:
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2757
 *
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2758
 * e.g.
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2759
 * kernel$ /platform/i86pc/kernel/$ISADIR/unix -B $ZFS-BOOTFS,console=ttya
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2760
 *
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2761
 * The expand_dollar_bootfs routine expands $ZFS-BOOTFS to
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2762
 * "pool-name/zfs-rootfilesystem-object-num", e.g. "rootpool/85"
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2763
 * so that in the kernel zfs_mountroot would know which zfs root
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2764
 * filesystem to be mounted.
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2765
 */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2766
static int
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2767
expand_dollar_bootfs(char *in, char *out)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2768
{
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2769
	char *token, *tmpout = out;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2770
	int outlen, blen;
6673
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6659
diff changeset
  2771
	int postcomma = 0;
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2772
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2773
	outlen = strlen(in);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2774
	blen = current_bootfs_obj == 0 ? strlen(current_rootpool) :
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2775
	    strlen(current_rootpool) + 11;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2776
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2777
	out[0] = '\0';
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2778
	while (token = strstr(in, "$ZFS-BOOTFS")) {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2779
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2780
		if ((outlen += blen) > MAX_CMDLINE) {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2781
			errnum = ERR_WONT_FIT;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2782
			return (1);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2783
		}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2784
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2785
		token[0] = '\0';	
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2786
		grub_sprintf(tmpout, "%s", in);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2787
		token[0] = '$';
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  2788
		in = token + 11; /* skip over $ZFS-BOOTFS */
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2789
		tmpout = out + strlen(out);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2790
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2791
		/* Note: %u only fits 32 bit integer; */ 
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2792
		if (current_bootfs_obj > 0)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2793
			grub_sprintf(tmpout, "zfs-bootfs=%s/%u",
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2794
			    current_rootpool, current_bootfs_obj);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2795
		else
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2796
			grub_sprintf(tmpout, "zfs-bootfs=%s",
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2797
			    current_rootpool);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2798
		tmpout = out + strlen(out); 
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2799
	}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2800
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 4098
diff changeset
  2801
	/*
6673
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6659
diff changeset
  2802
	 * Check to see if 'zfs-bootfs' was explicitly specified on the command
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6659
diff changeset
  2803
	 * line so that we can insert the 'bootpath' property.
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6659
diff changeset
  2804
	 */
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6659
diff changeset
  2805
	if ((tmpout == out) && (token = strstr(in, "zfs-bootfs")) != NULL) {
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6659
diff changeset
  2806
		token[0] = '\0';
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6659
diff changeset
  2807
		grub_strcpy(tmpout, in);
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6659
diff changeset
  2808
		token[0] = 'z';
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6659
diff changeset
  2809
		in = token;
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6659
diff changeset
  2810
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6659
diff changeset
  2811
		tmpout = out + strlen(out);
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6659
diff changeset
  2812
		postcomma = 1;
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6659
diff changeset
  2813
	}
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6659
diff changeset
  2814
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6659
diff changeset
  2815
	/*
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6659
diff changeset
  2816
	 * Set the 'bootpath' property if a ZFS dataset was specified, either
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6659
diff changeset
  2817
	 * through '$ZFS-BOOTFS' or an explicit 'zfs-bootfs' setting.
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 4098
diff changeset
  2818
	 */
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 4098
diff changeset
  2819
	if (tmpout != out) {
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 4098
diff changeset
  2820
		if ((outlen += 12 + strlen(current_bootpath)) > MAX_CMDLINE) {
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 4098
diff changeset
  2821
			errnum = ERR_WONT_FIT;
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 4098
diff changeset
  2822
			return (1);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 4098
diff changeset
  2823
		}
6673
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6659
diff changeset
  2824
		grub_sprintf(tmpout,
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6659
diff changeset
  2825
		    postcomma ? "bootpath=\"%s\"," : ",bootpath=\"%s\"",
be079d6124af 6697301 deadlock between ZFS and devfs can hang system
eschrock
parents: 6659
diff changeset
  2826
		    current_bootpath);
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  2827
		tmpout = out + strlen(out);
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  2828
	}
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  2829
	if (strlen(current_devid)) {
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  2830
		if ((outlen += 13 + strlen(current_devid)) > MAX_CMDLINE) {
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  2831
			errnum = ERR_WONT_FIT;
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  2832
			return (1);
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  2833
		}
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  2834
		grub_sprintf(tmpout,
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  2835
		    postcomma ? "diskdevid=\"%s\"," : ",diskdevid=\"%s\"",
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  2836
		    current_devid);
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 4098
diff changeset
  2837
	}
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 4098
diff changeset
  2838
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2839
	strncat(out, in, MAX_CMDLINE);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2840
	return (0);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2841
}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2842
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2843
/* kernel */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2844
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2845
kernel_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2846
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2847
  int len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2848
  kernel_t suggested_type = KERNEL_TYPE_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2849
  unsigned long load_flags = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2850
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2851
#ifndef AUTO_LINUX_MEM_OPT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2852
  load_flags |= KERNEL_LOAD_NO_MEM_OPTION;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2853
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2854
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2855
  /* Deal with GNU-style long options.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2856
  while (1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2857
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2858
      /* If the option `--type=TYPE' is specified, convert the string to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2859
	 a kernel type.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2860
      if (grub_memcmp (arg, "--type=", 7) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2861
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2862
	  arg += 7;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2863
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2864
	  if (grub_memcmp (arg, "netbsd", 6) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2865
	    suggested_type = KERNEL_TYPE_NETBSD;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2866
	  else if (grub_memcmp (arg, "freebsd", 7) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2867
	    suggested_type = KERNEL_TYPE_FREEBSD;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2868
	  else if (grub_memcmp (arg, "openbsd", 7) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2869
	    /* XXX: For now, OpenBSD is identical to NetBSD, from GRUB's
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2870
	       point of view.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2871
	    suggested_type = KERNEL_TYPE_NETBSD;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2872
	  else if (grub_memcmp (arg, "linux", 5) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2873
	    suggested_type = KERNEL_TYPE_LINUX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2874
	  else if (grub_memcmp (arg, "biglinux", 8) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2875
	    suggested_type = KERNEL_TYPE_BIG_LINUX;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2876
	  else if (grub_memcmp (arg, "multiboot", 9) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2877
	    suggested_type = KERNEL_TYPE_MULTIBOOT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2878
	  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2879
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2880
	      errnum = ERR_BAD_ARGUMENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2881
	      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2882
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2883
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2884
      /* If the `--no-mem-option' is specified, don't pass a Linux's mem
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2885
	 option automatically. If the kernel is another type, this flag
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2886
	 has no effect.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2887
      else if (grub_memcmp (arg, "--no-mem-option", 15) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2888
	load_flags |= KERNEL_LOAD_NO_MEM_OPTION;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2889
      else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2890
	break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2891
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2892
      /* Try the next.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2893
      arg = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2894
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2895
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2896
  len = grub_strlen (arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2897
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2898
  /* Reset MB_CMDLINE.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2899
  mb_cmdline = (char *) MB_CMDLINE_BUF;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2900
  if (len + 1 > MB_CMDLINE_BUFLEN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2901
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2902
      errnum = ERR_WONT_FIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2903
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2904
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2905
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2906
  /* Copy the command-line to MB_CMDLINE.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2907
  grub_memmove (mb_cmdline, arg, len + 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2908
  kernel_type = load_image (arg, mb_cmdline, suggested_type, load_flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2909
  if (kernel_type == KERNEL_TYPE_NONE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2910
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2911
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  2912
  mb_cmdline += grub_strlen(mb_cmdline) + 1;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2913
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2914
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2915
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2916
static struct builtin builtin_kernel =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2917
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2918
  "kernel",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2919
  kernel_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2920
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2921
  "kernel [--no-mem-option] [--type=TYPE] FILE [ARG ...]",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2922
  "Attempt to load the primary boot image from FILE. The rest of the"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2923
  " line is passed verbatim as the \"kernel command line\".  Any modules"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2924
  " must be reloaded after using this command. The option --type is used"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2925
  " to suggest what type of kernel to be loaded. TYPE must be either of"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2926
  " \"netbsd\", \"freebsd\", \"openbsd\", \"linux\", \"biglinux\" and"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2927
  " \"multiboot\". The option --no-mem-option tells GRUB not to pass a"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2928
  " Linux's mem option automatically."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2929
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  2930
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2931
int
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2932
min_mem64_func(char *arg, int flags)
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2933
{
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2934
	if (!safe_parse_maxint(&arg, &min_mem64))
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2935
		return (1);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2936
}
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2937
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2938
static struct builtin builtin_min_mem64 =
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2939
{
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2940
	"min_mem64",
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2941
	min_mem64_func,
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2942
	BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_SCRIPT | BUILTIN_HELP_LIST,
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2943
	"min_mem64 <memory in MB>",
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2944
	"Sets minimum memory (in MB) required for $ISADIR to expand to amd64, "
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2945
	"even on 64-bit capable hardware."
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2946
};
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2947
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2948
int
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2949
check_min_mem64()
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2950
{
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2951
	if (min_mem64 == 0)
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2952
		return (1);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2953
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2954
	if ((mbi.mem_upper / 10240) * 11 >= min_mem64)
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2955
		return (1);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2956
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2957
	return (0);
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  2958
}
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2959
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2960
static int detect_target_operating_mode();
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2961
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2962
int
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2963
amd64_config_cpu(void)
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2964
{
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2965
        struct amd64_cpuid_regs __vcr, *vcr = &__vcr;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2966
        uint32_t maxeax;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2967
        uint32_t max_maxeax = 0x100;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2968
        char vendor[13];
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2969
        int isamd64 = 0;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2970
        uint32_t stdfeatures = 0, xtdfeatures = 0;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2971
        uint64_t efer;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2972
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2973
        /*
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2974
         * This check may seem silly, but if the C preprocesor symbol __amd64
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2975
         * is #defined during compilation, something that may outwardly seem
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2976
         * like a good idea, uts/common/sys/isa_defs.h will #define _LP64,
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2977
         * which will cause uts/common/sys/int_types.h to typedef uint64_t as
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2978
         * an unsigned long - which is only 4 bytes in size when using a 32-bit
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2979
         * compiler.
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2980
         *
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2981
         * If that happens, all the page table translation routines will fail
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2982
         * horribly, so check the size of uint64_t just to insure some degree
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2983
         * of sanity in future operations.
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2984
         */
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2985
        /*LINTED [sizeof result is invarient]*/
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2986
        if (sizeof (uint64_t) != 8)
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2987
                prom_panic("grub compiled improperly, unable to boot "
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2988
                    "64-bit AMD64 executables");
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2989
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2990
        /*
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2991
         * If the CPU doesn't support the CPUID instruction, it's definitely
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2992
         * not an AMD64.
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2993
         */
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2994
        if (amd64_cpuid_supported() == 0)
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2995
                return (0);
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2996
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2997
        amd64_cpuid_insn(0, vcr);
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2998
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  2999
        maxeax = vcr->r_eax;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3000
        {
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3001
                /*LINTED [vendor string from cpuid data]*/
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3002
                uint32_t *iptr = (uint32_t *)vendor;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3003
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3004
                *iptr++ = vcr->r_ebx;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3005
                *iptr++ = vcr->r_edx;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3006
                *iptr++ = vcr->r_ecx;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3007
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3008
                vendor[12] = '\0';
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3009
        }
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3010
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3011
        if (maxeax > max_maxeax) {
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3012
                grub_printf("cpu: warning, maxeax was 0x%x -> 0x%x\n",
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3013
                    maxeax, max_maxeax);
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3014
                maxeax = max_maxeax;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3015
        }
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3016
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3017
        if (maxeax < 1)
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3018
                return (0);     /* no additional functions, not an AMD64 */
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3019
        else {
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3020
                uint_t family, model, step;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3021
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3022
                amd64_cpuid_insn(1, vcr);
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3023
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3024
                /*
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3025
                 * All AMD64/IA32e processors technically SHOULD report
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3026
                 * themselves as being in family 0xf, but for some reason
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3027
                 * Simics doesn't, and this may change in the future, so
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3028
                 * don't error out if it's not true.
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3029
                 */
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3030
                if ((family = BITX(vcr->r_eax, 11, 8)) == 0xf)
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3031
                        family += BITX(vcr->r_eax, 27, 20);
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3032
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3033
                if ((model = BITX(vcr->r_eax, 7, 4)) == 0xf)
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3034
                        model += BITX(vcr->r_eax, 19, 16) << 4;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3035
                step = BITX(vcr->r_eax, 3, 0);
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3036
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3037
                grub_printf("cpu: '%s' family %d model %d step %d\n",
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3038
                    vendor, family, model, step);
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3039
                stdfeatures = vcr->r_edx;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3040
        }
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3041
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3042
        amd64_cpuid_insn(0x80000000, vcr);
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3043
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3044
        if (vcr->r_eax & 0x80000000) {
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3045
                uint32_t xmaxeax = vcr->r_eax;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3046
                const uint32_t max_xmaxeax = 0x80000100;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3047
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3048
                if (xmaxeax > max_xmaxeax) {
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3049
                        grub_printf("amd64: warning, xmaxeax was "
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3050
			    "0x%x -> 0x%x\n", xmaxeax, max_xmaxeax);
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3051
                        xmaxeax = max_xmaxeax;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3052
                }
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3053
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3054
                if (xmaxeax >= 0x80000001) {
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3055
                        amd64_cpuid_insn(0x80000001, vcr);
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3056
                        xtdfeatures = vcr->r_edx;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3057
                }
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3058
        }
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3059
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3060
        if (BITX(xtdfeatures, 29, 29))          /* long mode */
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3061
                isamd64++;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3062
        else
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3063
                grub_printf("amd64: CPU does NOT support long mode\n");
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3064
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3065
        if (!BITX(stdfeatures, 0, 0)) {
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3066
                grub_printf("amd64: CPU does NOT support FPU\n");
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3067
                isamd64--;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3068
        }
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3069
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3070
        if (!BITX(stdfeatures, 4, 4)) {
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3071
                grub_printf("amd64: CPU does NOT support TSC\n");
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3072
                isamd64--;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3073
        }
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3074
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3075
        if (!BITX(stdfeatures, 5, 5)) {
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3076
                grub_printf("amd64: CPU does NOT support MSRs\n");
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3077
                isamd64--;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3078
        }
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3079
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3080
        if (!BITX(stdfeatures, 6, 6)) {
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3081
                grub_printf("amd64: CPU does NOT support PAE\n");
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3082
                isamd64--;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3083
        }
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3084
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3085
        if (!BITX(stdfeatures, 8, 8)) {
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3086
                grub_printf("amd64: CPU does NOT support CX8\n");
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3087
                isamd64--;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3088
        }
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3089
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3090
        if (!BITX(stdfeatures, 13, 13)) {
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3091
                grub_printf("amd64: CPU does NOT support PGE\n");
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3092
                isamd64--;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3093
        }
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3094
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3095
        if (!BITX(stdfeatures, 19, 19)) {
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3096
                grub_printf("amd64: CPU does NOT support CLFSH\n");
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3097
                isamd64--;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3098
        }
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3099
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3100
        if (!BITX(stdfeatures, 23, 23)) {
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3101
                grub_printf("amd64: CPU does NOT support MMX\n");
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3102
                isamd64--;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3103
        }
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3104
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3105
        if (!BITX(stdfeatures, 24, 24)) {
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3106
                grub_printf("amd64: CPU does NOT support FXSR\n");
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3107
                isamd64--;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3108
        }
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3109
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3110
        if (!BITX(stdfeatures, 25, 25)) {
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3111
                grub_printf("amd64: CPU does NOT support SSE\n");
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3112
                isamd64--;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3113
        }
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3114
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3115
        if (!BITX(stdfeatures, 26, 26)) {
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3116
                grub_printf("amd64: CPU does NOT support SSE2\n");
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3117
                isamd64--;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3118
        }
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3119
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3120
        if (isamd64 < 1) {
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3121
                grub_printf("amd64: CPU does not support amd64 executables.\n");
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3122
                return (0);
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3123
        }
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3124
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3125
        amd64_rdmsr(MSR_AMD_EFER, &efer);
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3126
        if (efer & AMD_EFER_SCE)
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3127
                grub_printf("amd64: EFER_SCE (syscall/sysret) already "
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3128
		    "enabled\n");
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3129
        if (efer & AMD_EFER_NXE)
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3130
                grub_printf("amd64: EFER_NXE (no-exec prot) already enabled\n");
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3131
        if (efer & AMD_EFER_LME)
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3132
                grub_printf("amd64: EFER_LME (long mode) already enabled\n");
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3133
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3134
        return (detect_target_operating_mode());
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3135
}
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3136
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3137
static int
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3138
detect_target_operating_mode()
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3139
{
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3140
        int ret, ah;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3141
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3142
	ah = get_target_operating_mode();
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3143
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3144
        ah = ah >> 8;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3145
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3146
	/* XXX still need to pass back the return from the call  */
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3147
	ret = 0;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3148
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3149
        if (ah == 0x86 && (ret & CB) != 0) {
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3150
                grub_printf("[BIOS 'Detect Target Operating Mode' "
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3151
                    "callback unsupported on this platform]\n");
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3152
                return (1);     /* unsupported, ignore */
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3153
        }
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3154
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3155
        if (ah == 0x0 && (ret & CB) == 0) {
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3156
                grub_printf("[BIOS accepted mixed-mode target setting!]\n");
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3157
                return (1);     /* told the bios what we're up to */
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3158
        }
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3159
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3160
        if (ah == 0 && ret & CB) {
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3161
                grub_printf("fatal: BIOS reports this machine CANNOT run in "
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3162
		    "mixed 32/64-bit mode!\n");
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3163
                return (0);
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3164
        }
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3165
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3166
        grub_printf("warning: BIOS Detect Target Operating Mode callback "
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3167
            "confused.\n         %%ax >> 8 = 0x%x, carry = %d\n", ah,
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3168
            ret & CB ? 1 : 0);
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3169
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3170
        return (1);
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3171
}
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3172
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3173
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3174
int
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3175
isamd64()
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3176
{
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3177
	static int ret = -1;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3178
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3179
	if (ret == -1)
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3180
		ret = amd64_config_cpu();
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3181
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3182
	return (ret);
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3183
}
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3184
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3185
static void
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3186
expand_arch (char *arg, char *newarg)
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3187
{
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3188
  char *index;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3189
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3190
  newarg[0] = '\0';
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3191
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3192
  while ((index = strstr(arg, "$ISADIR")) != NULL) {
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3193
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3194
    index[0] = '\0';
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3195
    strncat(newarg, arg, MAX_CMDLINE);
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3196
    index[0] = '$';
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3197
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  3198
    if (isamd64() && check_min_mem64())
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3199
      strncat(newarg, "amd64", MAX_CMDLINE);
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3200
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3201
    arg = index + 7;
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3202
  }
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3203
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3204
  strncat(newarg, arg, MAX_CMDLINE);
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3205
  return;
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3206
}
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3207
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3208
/* kernel$ */
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3209
static int
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3210
kernel_dollar_func (char *arg, int flags)
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3211
{
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3212
  char newarg[MAX_CMDLINE];	/* everything boils down to MAX_CMDLINE */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3213
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3214
  grub_printf("loading '%s' ...\n", arg);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3215
  expand_arch(arg, newarg);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3216
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3217
  if (kernel_func(newarg, flags))
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3218
	return (1);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3219
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3220
  mb_cmdline = (char *)MB_CMDLINE_BUF;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3221
  if (expand_dollar_bootfs(newarg, mb_cmdline))
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3222
	return (1);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3223
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3224
  grub_printf("'%s' is loaded\n", mb_cmdline);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3225
  mb_cmdline += grub_strlen(mb_cmdline) + 1;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3226
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3227
  return (0);
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3228
}
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3229
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3230
static struct builtin builtin_kernel_dollar =
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3231
{
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3232
  "kernel$",
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3233
  kernel_dollar_func,
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3234
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3235
  "kernel$ [--no-mem-option] [--type=TYPE] FILE [ARG ...]",
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3236
  " Just like kernel, but with $ISADIR expansion."
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3237
};
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3238
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3239

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3240
/* lock */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3241
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3242
lock_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3243
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3244
  if (! auth && password)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3245
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3246
      errnum = ERR_PRIVILEGED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3247
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3248
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3249
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3250
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3251
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3252
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3253
static struct builtin builtin_lock =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3254
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3255
  "lock",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3256
  lock_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3257
  BUILTIN_CMDLINE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3258
  "lock",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3259
  "Break a command execution unless the user is authenticated."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3260
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3261
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3262

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3263
/* makeactive */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3264
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3265
makeactive_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3266
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3267
  if (! make_saved_active ())
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3268
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3269
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3270
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3271
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3272
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3273
static struct builtin builtin_makeactive =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3274
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3275
  "makeactive",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3276
  makeactive_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3277
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3278
  "makeactive",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3279
  "Set the active partition on the root disk to GRUB's root device."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3280
  " This command is limited to _primary_ PC partitions on a hard disk."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3281
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3282
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3283

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3284
/* map */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3285
/* Map FROM_DRIVE to TO_DRIVE.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3286
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3287
map_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3288
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3289
  char *to_drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3290
  char *from_drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3291
  unsigned long to, from;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3292
  int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3293
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3294
  to_drive = arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3295
  from_drive = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3296
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3297
  /* Get the drive number for TO_DRIVE.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3298
  set_device (to_drive);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3299
  if (errnum)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3300
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3301
  to = current_drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3302
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3303
  /* Get the drive number for FROM_DRIVE.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3304
  set_device (from_drive);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3305
  if (errnum)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3306
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3307
  from = current_drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3308
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3309
  /* Search for an empty slot in BIOS_DRIVE_MAP.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3310
  for (i = 0; i < DRIVE_MAP_SIZE; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3311
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3312
      /* Perhaps the user wants to override the map.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3313
      if ((bios_drive_map[i] & 0xff) == from)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3314
	break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3315
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3316
      if (! bios_drive_map[i])
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3317
	break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3318
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3319
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3320
  if (i == DRIVE_MAP_SIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3321
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3322
      errnum = ERR_WONT_FIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3323
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3324
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3325
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3326
  if (to == from)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3327
    /* If TO is equal to FROM, delete the entry.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3328
    grub_memmove ((char *) &bios_drive_map[i], (char *) &bios_drive_map[i + 1],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3329
		  sizeof (unsigned short) * (DRIVE_MAP_SIZE - i));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3330
  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3331
    bios_drive_map[i] = from | (to << 8);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3332
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3333
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3334
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3335
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3336
static struct builtin builtin_map =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3337
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3338
  "map",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3339
  map_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3340
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3341
  "map TO_DRIVE FROM_DRIVE",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3342
  "Map the drive FROM_DRIVE to the drive TO_DRIVE. This is necessary"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3343
  " when you chain-load some operating systems, such as DOS, if such an"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3344
  " OS resides at a non-first drive."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3345
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3346
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3347

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3348
#ifdef USE_MD5_PASSWORDS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3349
/* md5crypt */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3350
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3351
md5crypt_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3352
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3353
  char crypted[36];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3354
  char key[32];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3355
  unsigned int seed;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3356
  int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3357
  const char *const seedchars =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3358
    "./0123456789ABCDEFGHIJKLMNOPQRST"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3359
    "UVWXYZabcdefghijklmnopqrstuvwxyz";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3360
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3361
  /* First create a salt.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3362
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3363
  /* The magical prefix.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3364
  grub_memset (crypted, 0, sizeof (crypted));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3365
  grub_memmove (crypted, "$1$", 3);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3366
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3367
  /* Create the length of a salt.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3368
  seed = currticks ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3369
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3370
  /* Generate a salt.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3371
  for (i = 0; i < 8 && seed; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3372
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3373
      /* FIXME: This should be more random.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3374
      crypted[3 + i] = seedchars[seed & 0x3f];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3375
      seed >>= 6;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3376
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3377
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3378
  /* A salt must be terminated with `$', if it is less than 8 chars.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3379
  crypted[3 + i] = '$';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3380
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3381
#ifdef DEBUG_MD5CRYPT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3382
  grub_printf ("salt = %s\n", crypted);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3383
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3384
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3385
  /* Get a password.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3386
  grub_memset (key, 0, sizeof (key));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3387
  get_cmdline ("Password: ", key, sizeof (key) - 1, '*', 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3388
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3389
  /* Crypt the key.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3390
  make_md5_password (key, crypted);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3391
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3392
  grub_printf ("Encrypted: %s\n", crypted);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3393
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3394
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3395
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3396
static struct builtin builtin_md5crypt =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3397
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3398
  "md5crypt",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3399
  md5crypt_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3400
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3401
  "md5crypt",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3402
  "Generate a password in MD5 format."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3403
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3404
#endif /* USE_MD5_PASSWORDS */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3405
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3406

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3407
/* module */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3408
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3409
module_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3410
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3411
  int len = grub_strlen (arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3412
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3413
  switch (kernel_type)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3414
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3415
    case KERNEL_TYPE_MULTIBOOT:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3416
      if (mb_cmdline + len + 1 > (char *) MB_CMDLINE_BUF + MB_CMDLINE_BUFLEN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3417
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3418
	  errnum = ERR_WONT_FIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3419
	  return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3420
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3421
      grub_memmove (mb_cmdline, arg, len + 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3422
      if (! load_module (arg, mb_cmdline))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3423
	return 1;
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3424
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3425
      mb_cmdline += grub_strlen(mb_cmdline) + 1;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3426
      break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3427
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3428
    case KERNEL_TYPE_LINUX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3429
    case KERNEL_TYPE_BIG_LINUX:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3430
      if (! load_initrd (arg))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3431
	return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3432
      break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3433
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3434
    default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3435
      errnum = ERR_NEED_MB_KERNEL;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3436
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3437
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3438
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3439
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3440
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3441
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3442
static struct builtin builtin_module =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3443
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3444
  "module",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3445
  module_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3446
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3447
  "module FILE [ARG ...]",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3448
  "Load a boot module FILE for a Multiboot format boot image (no"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3449
  " interpretation of the file contents is made, so users of this"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3450
  " command must know what the kernel in question expects). The"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3451
  " rest of the line is passed as the \"module command line\", like"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3452
  " the `kernel' command."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3453
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3454
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3455
/* module$ */
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3456
static int
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3457
module_dollar_func (char *arg, int flags)
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3458
{
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3459
  char newarg[MAX_CMDLINE];	/* everything boils down to MAX_CMDLINE */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3460
  char *cmdline_sav;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3461
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3462
  grub_printf("loading '%s' ...\n", arg);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3463
  expand_arch(arg, newarg);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3464
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3465
  cmdline_sav = (char *)mb_cmdline;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3466
  if (module_func(newarg, flags))
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3467
	return (1);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3468
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3469
  if (expand_dollar_bootfs(newarg, cmdline_sav))
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3470
	return (1);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3471
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3472
  grub_printf("'%s' is loaded\n", (char *)cmdline_sav);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3473
  mb_cmdline += grub_strlen(cmdline_sav) + 1;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3474
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  3475
  return (0);
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3476
}
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3477
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3478
static struct builtin builtin_module_dollar =
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3479
{
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3480
  "module$",
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3481
  module_dollar_func,
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3482
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3483
  "module FILE [ARG ...]",
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3484
  " Just like module, but with $ISADIR expansion."
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3485
};
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  3486
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3487

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3488
/* modulenounzip */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3489
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3490
modulenounzip_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3491
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3492
  int ret;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3493
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3494
#ifndef NO_DECOMPRESSION
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3495
  no_decompression = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3496
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3497
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3498
  ret = module_func (arg, flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3499
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3500
#ifndef NO_DECOMPRESSION
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3501
  no_decompression = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3502
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3503
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3504
  return ret;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3505
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3506
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3507
static struct builtin builtin_modulenounzip =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3508
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3509
  "modulenounzip",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3510
  modulenounzip_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3511
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3512
  "modulenounzip FILE [ARG ...]",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3513
  "The same as `module', except that automatic decompression is"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3514
  " disabled."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3515
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3516
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3517

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3518
/* pager [on|off] */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3519
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3520
pager_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3521
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3522
  /* If ARG is empty, toggle the flag.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3523
  if (! *arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3524
    use_pager = ! use_pager;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3525
  else if (grub_memcmp (arg, "on", 2) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3526
    use_pager = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3527
  else if (grub_memcmp (arg, "off", 3) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3528
    use_pager = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3529
  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3530
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3531
      errnum = ERR_BAD_ARGUMENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3532
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3533
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3534
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3535
  grub_printf (" Internal pager is now %s\n", use_pager ? "on" : "off");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3536
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3537
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3538
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3539
static struct builtin builtin_pager =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3540
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3541
  "pager",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3542
  pager_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3543
  BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3544
  "pager [FLAG]",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3545
  "Toggle pager mode with no argument. If FLAG is given and its value"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3546
  " is `on', turn on the mode. If FLAG is `off', turn off the mode."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3547
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3548
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3549

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3550
/* partnew PART TYPE START LEN */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3551
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3552
partnew_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3553
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3554
  int new_type, new_start, new_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3555
  int start_cl, start_ch, start_dh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3556
  int end_cl, end_ch, end_dh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3557
  int entry;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3558
  char mbr[512];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3559
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3560
  /* Convert a LBA address to a CHS address in the INT 13 format.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3561
  auto void lba_to_chs (int lba, int *cl, int *ch, int *dh);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3562
  void lba_to_chs (int lba, int *cl, int *ch, int *dh)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3563
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3564
      int cylinder, head, sector;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3565
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3566
      sector = lba % buf_geom.sectors + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3567
      head = (lba / buf_geom.sectors) % buf_geom.heads;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3568
      cylinder = lba / (buf_geom.sectors * buf_geom.heads);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3569
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3570
      if (cylinder >= buf_geom.cylinders)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3571
	cylinder = buf_geom.cylinders - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3572
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3573
      *cl = sector | ((cylinder & 0x300) >> 2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3574
      *ch = cylinder & 0xFF;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3575
      *dh = head;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3576
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3577
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3578
  /* Get the drive and the partition.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3579
  if (! set_device (arg))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3580
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3581
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3582
  /* The drive must be a hard disk.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3583
  if (! (current_drive & 0x80))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3584
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3585
      errnum = ERR_BAD_ARGUMENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3586
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3587
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3588
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3589
  /* The partition must a primary partition.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3590
  if ((current_partition >> 16) > 3
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3591
      || (current_partition & 0xFFFF) != 0xFFFF)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3592
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3593
      errnum = ERR_BAD_ARGUMENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3594
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3595
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3596
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3597
  entry = current_partition >> 16;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3598
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3599
  /* Get the new partition type.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3600
  arg = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3601
  if (! safe_parse_maxint (&arg, &new_type))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3602
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3603
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3604
  /* The partition type is unsigned char.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3605
  if (new_type > 0xFF)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3606
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3607
      errnum = ERR_BAD_ARGUMENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3608
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3609
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3610
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3611
  /* Get the new partition start.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3612
  arg = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3613
  if (! safe_parse_maxint (&arg, &new_start))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3614
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3615
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3616
  /* Get the new partition length.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3617
  arg = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3618
  if (! safe_parse_maxint (&arg, &new_len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3619
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3620
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3621
  /* Read the MBR.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3622
  if (! rawread (current_drive, 0, 0, SECTOR_SIZE, mbr))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3623
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3624
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3625
  /* Check if the new partition will fit in the disk.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3626
  if (new_start + new_len > buf_geom.total_sectors)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3627
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3628
      errnum = ERR_GEOM;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3629
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3630
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3631
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3632
  /* Store the partition information in the MBR.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3633
  lba_to_chs (new_start, &start_cl, &start_ch, &start_dh);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3634
  lba_to_chs (new_start + new_len - 1, &end_cl, &end_ch, &end_dh);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3635
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3636
  PC_SLICE_FLAG (mbr, entry) = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3637
  PC_SLICE_HEAD (mbr, entry) = start_dh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3638
  PC_SLICE_SEC (mbr, entry) = start_cl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3639
  PC_SLICE_CYL (mbr, entry) = start_ch;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3640
  PC_SLICE_TYPE (mbr, entry) = new_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3641
  PC_SLICE_EHEAD (mbr, entry) = end_dh;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3642
  PC_SLICE_ESEC (mbr, entry) = end_cl;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3643
  PC_SLICE_ECYL (mbr, entry) = end_ch;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3644
  PC_SLICE_START (mbr, entry) = new_start;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3645
  PC_SLICE_LENGTH (mbr, entry) = new_len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3646
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3647
  /* Make sure that the MBR has a valid signature.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3648
  PC_MBR_SIG (mbr) = PC_MBR_SIGNATURE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3649
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3650
  /* Write back the MBR to the disk.  */
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  3651
  buf_track = BUF_CACHE_INVALID;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3652
  if (! rawwrite (current_drive, 0, mbr))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3653
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3654
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3655
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3656
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3657
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3658
static struct builtin builtin_partnew =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3659
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3660
  "partnew",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3661
  partnew_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3662
  BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3663
  "partnew PART TYPE START LEN",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3664
  "Create a primary partition at the starting address START with the"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3665
  " length LEN, with the type TYPE. START and LEN are in sector units."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3666
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3667
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3668

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3669
/* parttype PART TYPE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3670
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3671
parttype_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3672
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3673
  int new_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3674
  unsigned long part = 0xFFFFFF;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3675
  unsigned long start, len, offset, ext_offset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3676
  int entry, type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3677
  char mbr[512];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3678
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3679
  /* Get the drive and the partition.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3680
  if (! set_device (arg))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3681
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3682
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3683
  /* The drive must be a hard disk.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3684
  if (! (current_drive & 0x80))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3685
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3686
      errnum = ERR_BAD_ARGUMENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3687
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3688
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3689
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3690
  /* The partition must be a PC slice.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3691
  if ((current_partition >> 16) == 0xFF
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3692
      || (current_partition & 0xFFFF) != 0xFFFF)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3693
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3694
      errnum = ERR_BAD_ARGUMENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3695
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3696
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3697
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3698
  /* Get the new partition type.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3699
  arg = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3700
  if (! safe_parse_maxint (&arg, &new_type))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3701
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3702
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3703
  /* The partition type is unsigned char.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3704
  if (new_type > 0xFF)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3705
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3706
      errnum = ERR_BAD_ARGUMENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3707
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3708
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3709
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3710
  /* Look for the partition.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3711
  while (next_partition (current_drive, 0xFFFFFF, &part, &type,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3712
			 &start, &len, &offset, &entry,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3713
			 &ext_offset, mbr))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3714
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3715
      if (part == current_partition)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3716
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3717
	  /* Found.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3718
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3719
	  /* Set the type to NEW_TYPE.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3720
	  PC_SLICE_TYPE (mbr, entry) = new_type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3721
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3722
	  /* Write back the MBR to the disk.  */
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  3723
	  buf_track = BUF_CACHE_INVALID;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3724
	  if (! rawwrite (current_drive, offset, mbr))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3725
	    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3726
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3727
	  /* Succeed.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3728
	  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3729
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3730
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3731
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3732
  /* The partition was not found.  ERRNUM was set by next_partition.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3733
  return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3734
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3735
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3736
static struct builtin builtin_parttype =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3737
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3738
  "parttype",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3739
  parttype_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3740
  BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3741
  "parttype PART TYPE",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3742
  "Change the type of the partition PART to TYPE."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3743
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3744
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3745

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3746
/* password */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3747
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3748
password_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3749
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3750
  int len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3751
  password_t type = PASSWORD_PLAIN;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3752
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3753
#ifdef USE_MD5_PASSWORDS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3754
  if (grub_memcmp (arg, "--md5", 5) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3755
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3756
      type = PASSWORD_MD5;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3757
      arg = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3758
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3759
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3760
  if (grub_memcmp (arg, "--", 2) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3761
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3762
      type = PASSWORD_UNSUPPORTED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3763
      arg = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3764
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3765
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3766
  if ((flags & (BUILTIN_CMDLINE | BUILTIN_SCRIPT)) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3767
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3768
      /* Do password check! */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3769
      char entered[32];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3770
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3771
      /* Wipe out any previously entered password */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3772
      entered[0] = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3773
      get_cmdline ("Password: ", entered, 31, '*', 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3774
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3775
      nul_terminate (arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3776
      if (check_password (entered, arg, type) != 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3777
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3778
	  errnum = ERR_PRIVILEGED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3779
	  return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3780
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3781
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3782
  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3783
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3784
      len = grub_strlen (arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3785
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3786
      /* PASSWORD NUL NUL ... */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3787
      if (len + 2 > PASSWORD_BUFLEN)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3788
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3789
	  errnum = ERR_WONT_FIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3790
	  return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3791
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3792
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3793
      /* Copy the password and clear the rest of the buffer.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3794
      password = (char *) PASSWORD_BUF;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3795
      grub_memmove (password, arg, len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3796
      grub_memset (password + len, 0, PASSWORD_BUFLEN - len);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3797
      password_type = type;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3798
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3799
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3800
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3801
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3802
static struct builtin builtin_password =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3803
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3804
  "password",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3805
  password_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3806
  BUILTIN_MENU | BUILTIN_CMDLINE | BUILTIN_NO_ECHO,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3807
  "password [--md5] PASSWD [FILE]",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3808
  "If used in the first section of a menu file, disable all"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3809
  " interactive editing control (menu entry editor and"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3810
  " command line). If the password PASSWD is entered, it loads the"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3811
  " FILE as a new config file and restarts the GRUB Stage 2. If you"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3812
  " omit the argument FILE, then GRUB just unlocks privileged"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3813
  " instructions.  You can also use it in the script section, in"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3814
  " which case it will ask for the password, before continueing."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3815
  " The option --md5 tells GRUB that PASSWD is encrypted with"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3816
  " md5crypt."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3817
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3818
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3819

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3820
/* pause */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3821
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3822
pause_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3823
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3824
  printf("%s\n", arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3825
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3826
  /* If ESC is returned, then abort this entry.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3827
  if (ASCII_CHAR (getkey ()) == 27)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3828
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3829
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3830
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3831
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3832
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3833
static struct builtin builtin_pause =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3834
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3835
  "pause",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3836
  pause_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3837
  BUILTIN_CMDLINE | BUILTIN_NO_ECHO,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3838
  "pause [MESSAGE ...]",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3839
  "Print MESSAGE, then wait until a key is pressed."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3840
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3841
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3842

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3843
#ifdef GRUB_UTIL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3844
/* quit */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3845
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3846
quit_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3847
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3848
  stop ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3849
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3850
  /* Never reach here.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3851
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3852
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3853
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3854
static struct builtin builtin_quit =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3855
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3856
  "quit",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3857
  quit_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3858
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3859
  "quit",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3860
  "Exit from the GRUB shell."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3861
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3862
#endif /* GRUB_UTIL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3863
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3864

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3865
#ifdef SUPPORT_NETBOOT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3866
/* rarp */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3867
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3868
rarp_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3869
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3870
  if (! rarp ())
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3871
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3872
      if (errnum == ERR_NONE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3873
	errnum = ERR_DEV_VALUES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3874
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3875
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3876
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3877
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3878
  /* Notify the configuration.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3879
  print_network_configuration ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3880
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3881
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3882
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3883
static struct builtin builtin_rarp =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3884
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3885
  "rarp",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3886
  rarp_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3887
  BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3888
  "rarp",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3889
  "Initialize a network device via RARP."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3890
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3891
#endif /* SUPPORT_NETBOOT */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3892
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3893

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3894
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3895
read_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3896
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3897
  int addr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3898
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3899
  if (! safe_parse_maxint (&arg, &addr))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3900
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3901
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3902
  grub_printf ("Address 0x%x: Value 0x%x\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3903
	       addr, *((unsigned *) RAW_ADDR (addr)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3904
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3905
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3906
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3907
static struct builtin builtin_read =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3908
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3909
  "read",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3910
  read_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3911
  BUILTIN_CMDLINE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3912
  "read ADDR",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3913
  "Read a 32-bit value from memory at address ADDR and"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3914
  " display it in hex format."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3915
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3916
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3917

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3918
/* reboot */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3919
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3920
reboot_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3921
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3922
  grub_reboot ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3923
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3924
  /* Never reach here.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3925
  return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3926
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3927
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3928
static struct builtin builtin_reboot =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3929
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3930
  "reboot",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3931
  reboot_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3932
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3933
  "reboot",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3934
  "Reboot your system."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3935
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3936
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3937

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3938
/* Print the root device information.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3939
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3940
print_root_device (void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3941
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3942
  if (saved_drive == NETWORK_DRIVE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3943
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3944
      /* Network drive.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3945
      grub_printf (" (nd):");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3946
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3947
  else if (saved_drive & 0x80)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3948
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3949
      /* Hard disk drive.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3950
      grub_printf (" (hd%d", saved_drive - 0x80);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3951
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3952
      if ((saved_partition & 0xFF0000) != 0xFF0000)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3953
	grub_printf (",%d", saved_partition >> 16);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3954
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3955
      if ((saved_partition & 0x00FF00) != 0x00FF00)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3956
	grub_printf (",%c", ((saved_partition >> 8) & 0xFF) + 'a');
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3957
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3958
      grub_printf ("):");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3959
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3960
  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3961
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3962
      /* Floppy disk drive.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3963
      grub_printf (" (fd%d):", saved_drive);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3964
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3965
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3966
  /* Print the filesystem information.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3967
  current_partition = saved_partition;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3968
  current_drive = saved_drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3969
  print_fsys_type ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3970
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3971
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3972
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3973
real_root_func (char *arg, int attempt_mount)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3974
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3975
  int hdbias = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3976
  char *biasptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3977
  char *next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3978
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3979
  /* If ARG is empty, just print the current root device.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3980
  if (! *arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3981
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3982
      print_root_device ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3983
      return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3984
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3985
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3986
  /* Call set_device to get the drive and the partition in ARG.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3987
  next = set_device (arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3988
  if (! next)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3989
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3990
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3991
  /* Ignore ERR_FSYS_MOUNT.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3992
  if (attempt_mount)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3993
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3994
      if (! open_device () && errnum != ERR_FSYS_MOUNT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3995
	return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3996
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3997
  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3998
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  3999
      /* This is necessary, because the location of a partition table
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4000
	 must be set appropriately.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4001
      if (open_partition ())
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4002
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4003
	  set_bootdev (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4004
	  if (errnum)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4005
	    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4006
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4007
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4008
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4009
  /* Clear ERRNUM.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4010
  errnum = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4011
  saved_partition = current_partition;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4012
  saved_drive = current_drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4013
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4014
  if (attempt_mount)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4015
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4016
      /* BSD and chainloading evil hacks !!  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4017
      biasptr = skip_to (0, next);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4018
      safe_parse_maxint (&biasptr, &hdbias);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4019
      errnum = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4020
      bootdev = set_bootdev (hdbias);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4021
      if (errnum)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4022
	return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4023
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4024
      /* Print the type of the filesystem.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4025
      print_fsys_type ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4026
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4027
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4028
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4029
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4030
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4031
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4032
root_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4033
{
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4034
  is_zfs_mount = 0;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4035
  return real_root_func (arg, 1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4036
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4037
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4038
static struct builtin builtin_root =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4039
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4040
  "root",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4041
  root_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4042
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4043
  "root [DEVICE [HDBIAS]]",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4044
  "Set the current \"root device\" to the device DEVICE, then"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4045
  " attempt to mount it to get the partition size (for passing the"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4046
  " partition descriptor in `ES:ESI', used by some chain-loaded"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4047
  " bootloaders), the BSD drive-type (for booting BSD kernels using"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4048
  " their native boot format), and correctly determine "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4049
  " the PC partition where a BSD sub-partition is located. The"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4050
  " optional HDBIAS parameter is a number to tell a BSD kernel"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4051
  " how many BIOS drive numbers are on controllers before the current"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4052
  " one. For example, if there is an IDE disk and a SCSI disk, and your"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4053
  " FreeBSD root partition is on the SCSI disk, then use a `1' for HDBIAS."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4054
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4055
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4056

6448
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4057
/* findroot */
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4058
static int
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4059
findroot_func (char *arg, int flags)
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4060
{
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4061
  int ret;
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4062
  char root[32];
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4063
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4064
  if (grub_strlen(arg) >= BOOTSIGN_ARGLEN) {
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4065
  	errnum = ERR_BAD_ARGUMENT;
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4066
	return 1;
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4067
  }
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4068
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4069
  if (arg[0] == '\0') {
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4070
  	errnum = ERR_BAD_ARGUMENT;
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4071
	return 1;
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4072
  }
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4073
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4074
  if (grub_strchr(arg, '/')) {
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4075
  	errnum = ERR_BAD_ARGUMENT;
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4076
	return 1;
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4077
  }
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4078
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  4079
  find_best_root = 1;
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  4080
  best_drive = 0;
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  4081
  best_part = 0;
6448
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4082
  ret = find_common(arg, root, 1, flags);
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4083
  if (ret != 0)
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4084
	return (ret);
7147
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  4085
  find_best_root = 0;
1e1d75c88283 6704717 ZFS mirrored root doesn't live up to expectations
taylor
parents: 6694
diff changeset
  4086
6448
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4087
  return real_root_func (root, 1);
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4088
}
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4089
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4090
static struct builtin builtin_findroot =
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4091
{
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4092
  "findroot",
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4093
  findroot_func,
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4094
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
6694
d1503f9c5de3 6699956 bootadm fixes for GRUB findroot
vikram
parents: 6673
diff changeset
  4095
  "findroot  <SIGNATURE | (SIGNATURE,partition[,slice])>",
d1503f9c5de3 6699956 bootadm fixes for GRUB findroot
vikram
parents: 6673
diff changeset
  4096
  "Searches across all partitions for the file name SIGNATURE."
d1503f9c5de3 6699956 bootadm fixes for GRUB findroot
vikram
parents: 6673
diff changeset
  4097
  " GRUB looks only in the directory /boot/grub/bootsign for the"
d1503f9c5de3 6699956 bootadm fixes for GRUB findroot
vikram
parents: 6673
diff changeset
  4098
  " filename and it stops as soon as it finds the first instance of"
d1503f9c5de3 6699956 bootadm fixes for GRUB findroot
vikram
parents: 6673
diff changeset
  4099
  " the file - so to be useful the name of the signature file must be"
d1503f9c5de3 6699956 bootadm fixes for GRUB findroot
vikram
parents: 6673
diff changeset
  4100
  " unique across all partitions. Once the signature file is found,"
d1503f9c5de3 6699956 bootadm fixes for GRUB findroot
vikram
parents: 6673
diff changeset
  4101
  " GRUB invokes the \"root\" command on that partition."
6448
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4102
  " An optional partition and slice may be specified to optimize the search."
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4103
};
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4104
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  4105

3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4106
/*
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4107
 * COMMAND to override the default root filesystem for ZFS
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4108
 *	bootfs pool/fs
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4109
 */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4110
static int
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4111
bootfs_func (char *arg, int flags)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4112
{
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4113
	int hdbias = 0;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4114
	char *biasptr;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4115
	char *next;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4116
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4117
	if (! *arg) {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4118
	    if (current_bootfs[0] != '\0')
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4119
		grub_printf ("The zfs boot filesystem is set to '%s'.\n",
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4120
				current_bootfs);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4121
	    else if (current_rootpool[0] != 0 && current_bootfs_obj != 0)
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4122
		grub_printf("The zfs boot filesystem is <default: %s/%u>.",
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4123
				current_rootpool, current_bootfs_obj);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4124
	    else
4098
0a182c2128e6 6545726 make ZFS_IOC_POOL_*_PROPS in sync with zfs_ioc_pool_props_*
lling
parents: 3912
diff changeset
  4125
		grub_printf ("The zfs boot filesystem will be derived from "
0a182c2128e6 6545726 make ZFS_IOC_POOL_*_PROPS in sync with zfs_ioc_pool_props_*
lling
parents: 3912
diff changeset
  4126
			"the default bootfs pool property.\n");
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4127
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4128
	    return (1);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4129
	}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4130
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4131
	/* Verify the zfs filesystem name */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4132
	if (arg[0] == '/' || arg[0] == '\0') {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4133
		errnum = ERR_BAD_ARGUMENT;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4134
		return 0;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4135
	}
6659
77371f47272b 6694438 zfs grub code doesn't unset "bootfs" after a failed boot attempt
taylor
parents: 6448
diff changeset
  4136
	if (current_rootpool[0] != 0 && grub_strncmp(arg,
77371f47272b 6694438 zfs grub code doesn't unset "bootfs" after a failed boot attempt
taylor
parents: 6448
diff changeset
  4137
	    current_rootpool, strlen(current_rootpool))) {
77371f47272b 6694438 zfs grub code doesn't unset "bootfs" after a failed boot attempt
taylor
parents: 6448
diff changeset
  4138
		errnum = ERR_BAD_ARGUMENT;
77371f47272b 6694438 zfs grub code doesn't unset "bootfs" after a failed boot attempt
taylor
parents: 6448
diff changeset
  4139
		return 0;
77371f47272b 6694438 zfs grub code doesn't unset "bootfs" after a failed boot attempt
taylor
parents: 6448
diff changeset
  4140
	}
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4141
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4142
	if (set_bootfs(arg) == 0) {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4143
		errnum = ERR_BAD_ARGUMENT;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4144
		return 0;
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4145
	}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4146
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4147
	return (1);
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4148
}
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4149
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4150
static struct builtin builtin_bootfs =
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4151
{
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4152
  "bootfs",
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4153
  bootfs_func,
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4154
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4155
  "bootfs [ZFSBOOTFS]",
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4156
  "Set the current zfs boot filesystem to ZFSBOOTFS (rootpool/rootfs)."
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4157
};
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4158
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4159

0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4160
/* rootnoverify */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4161
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4162
rootnoverify_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4163
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4164
  return real_root_func (arg, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4165
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4166
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4167
static struct builtin builtin_rootnoverify =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4168
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4169
  "rootnoverify",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4170
  rootnoverify_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4171
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4172
  "rootnoverify [DEVICE [HDBIAS]]",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4173
  "Similar to `root', but don't attempt to mount the partition. This"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4174
  " is useful for when an OS is outside of the area of the disk that"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4175
  " GRUB can read, but setting the correct root device is still"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4176
  " desired. Note that the items mentioned in `root' which"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4177
  " derived from attempting the mount will NOT work correctly."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4178
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4179
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4180

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4181
/* savedefault */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4182
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4183
savedefault_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4184
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4185
#if !defined(SUPPORT_DISKLESS) && !defined(GRUB_UTIL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4186
  unsigned long tmp_drive = saved_drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4187
  unsigned long tmp_partition = saved_partition;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4188
  char *default_file = (char *) DEFAULT_FILE_BUF;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4189
  char buf[10];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4190
  char sect[SECTOR_SIZE];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4191
  int entryno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4192
  int sector_count = 0;
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  4193
  unsigned int saved_sectors[2];
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4194
  int saved_offsets[2];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4195
  int saved_lengths[2];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4196
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4197
  /* not supported for zfs root */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4198
  if (is_zfs_mount == 1) {
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4199
	return (0); /* no-op */
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4200
  }
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  4201
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4202
  /* Save sector information about at most two sectors.  */
8044
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
  4203
  auto void disk_read_savesect_func (unsigned int sector, int offset,
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
  4204
      int length);
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
  4205
  void disk_read_savesect_func (unsigned int sector, int offset, int length)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4206
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4207
      if (sector_count < 2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4208
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4209
	  saved_sectors[sector_count] = sector;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4210
	  saved_offsets[sector_count] = offset;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4211
	  saved_lengths[sector_count] = length;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4212
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4213
      sector_count++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4214
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4215
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4216
  /* This command is only useful when you boot an entry from the menu
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4217
     interface.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4218
  if (! (flags & BUILTIN_SCRIPT))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4219
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4220
      errnum = ERR_UNRECOGNIZED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4221
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4222
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4223
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4224
  /* Determine a saved entry number.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4225
  if (*arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4226
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4227
      if (grub_memcmp (arg, "fallback", sizeof ("fallback") - 1) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4228
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4229
	  int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4230
	  int index = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4231
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4232
	  for (i = 0; i < MAX_FALLBACK_ENTRIES; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4233
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4234
	      if (fallback_entries[i] < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4235
		break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4236
	      if (fallback_entries[i] == current_entryno)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4237
		{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4238
		  index = i + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4239
		  break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4240
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4241
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4242
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4243
	  if (index >= MAX_FALLBACK_ENTRIES || fallback_entries[index] < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4244
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4245
	      /* This is the last.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4246
	      errnum = ERR_BAD_ARGUMENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4247
	      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4248
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4249
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4250
	  entryno = fallback_entries[index];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4251
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4252
      else if (! safe_parse_maxint (&arg, &entryno))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4253
	return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4254
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4255
  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4256
    entryno = current_entryno;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4257
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4258
  /* Open the default file.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4259
  saved_drive = boot_drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4260
  saved_partition = install_partition;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4261
  if (grub_open (default_file))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4262
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4263
      int len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4264
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4265
      disk_read_hook = disk_read_savesect_func;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4266
      len = grub_read (buf, sizeof (buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4267
      disk_read_hook = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4268
      grub_close ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4269
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4270
      if (len != sizeof (buf))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4271
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4272
	  /* This is too small. Do not modify the file manually, please!  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4273
	  errnum = ERR_READ;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4274
	  goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4275
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4276
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4277
      if (sector_count > 2)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4278
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4279
	  /* Is this possible?! Too fragmented!  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4280
	  errnum = ERR_FSYS_CORRUPT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4281
	  goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4282
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4283
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4284
      /* Set up a string to be written.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4285
      grub_memset (buf, '\n', sizeof (buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4286
      grub_sprintf (buf, "%d", entryno);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4287
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4288
      if (saved_lengths[0] < sizeof (buf))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4289
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4290
	  /* The file is anchored to another file and the first few bytes
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4291
	     are spanned in two sectors. Uggh...  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4292
	  if (! rawread (current_drive, saved_sectors[0], 0, SECTOR_SIZE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4293
			 sect))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4294
	    goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4295
	  grub_memmove (sect + saved_offsets[0], buf, saved_lengths[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4296
	  if (! rawwrite (current_drive, saved_sectors[0], sect))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4297
	    goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4298
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4299
	  if (! rawread (current_drive, saved_sectors[1], 0, SECTOR_SIZE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4300
			 sect))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4301
	    goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4302
	  grub_memmove (sect + saved_offsets[1],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4303
			buf + saved_lengths[0],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4304
			sizeof (buf) - saved_lengths[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4305
	  if (! rawwrite (current_drive, saved_sectors[1], sect))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4306
	    goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4307
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4308
      else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4309
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4310
	  /* This is a simple case. It fits into a single sector.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4311
	  if (! rawread (current_drive, saved_sectors[0], 0, SECTOR_SIZE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4312
			 sect))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4313
	    goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4314
	  grub_memmove (sect + saved_offsets[0], buf, sizeof (buf));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4315
	  if (! rawwrite (current_drive, saved_sectors[0], sect))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4316
	    goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4317
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4318
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4319
      /* Clear the cache.  */
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  4320
      buf_track = BUF_CACHE_INVALID;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4321
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4322
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4323
 fail:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4324
  saved_drive = tmp_drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4325
  saved_partition = tmp_partition;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4326
  return errnum;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4327
#else /* ! SUPPORT_DISKLESS && ! GRUB_UTIL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4328
  errnum = ERR_UNRECOGNIZED;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4329
  return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4330
#endif /* ! SUPPORT_DISKLESS && ! GRUB_UTIL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4331
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4332
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4333
static struct builtin builtin_savedefault =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4334
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4335
  "savedefault",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4336
  savedefault_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4337
  BUILTIN_CMDLINE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4338
  "savedefault [NUM | `fallback']",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4339
  "Save the current entry as the default boot entry if no argument is"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4340
  " specified. If a number is specified, this number is saved. If"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4341
  " `fallback' is used, next fallback entry is saved."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4342
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4343
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4344

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4345
#ifdef SUPPORT_SERIAL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4346
/* serial */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4347
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4348
serial_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4349
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4350
  unsigned short port = serial_hw_get_port (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4351
  unsigned int speed = 9600;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4352
  int word_len = UART_8BITS_WORD;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4353
  int parity = UART_NO_PARITY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4354
  int stop_bit_len = UART_1_STOP_BIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4355
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4356
  /* Process GNU-style long options.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4357
     FIXME: We should implement a getopt-like function, to avoid
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4358
     duplications.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4359
  while (1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4360
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4361
      if (grub_memcmp (arg, "--unit=", sizeof ("--unit=") - 1) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4362
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4363
	  char *p = arg + sizeof ("--unit=") - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4364
	  int unit;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4365
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4366
	  if (! safe_parse_maxint (&p, &unit))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4367
	    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4368
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4369
	  if (unit < 0 || unit > 3)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4370
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4371
	      errnum = ERR_DEV_VALUES;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4372
	      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4373
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4374
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4375
	  port = serial_hw_get_port (unit);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4376
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4377
      else if (grub_memcmp (arg, "--speed=", sizeof ("--speed=") - 1) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4378
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4379
	  char *p = arg + sizeof ("--speed=") - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4380
	  int num;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4381
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4382
	  if (! safe_parse_maxint (&p, &num))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4383
	    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4384
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4385
	  speed = (unsigned int) num;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4386
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4387
      else if (grub_memcmp (arg, "--port=", sizeof ("--port=") - 1) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4388
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4389
	  char *p = arg + sizeof ("--port=") - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4390
	  int num;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4391
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4392
	  if (! safe_parse_maxint (&p, &num))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4393
	    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4394
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4395
	  port = (unsigned short) num;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4396
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4397
      else if (grub_memcmp (arg, "--word=", sizeof ("--word=") - 1) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4398
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4399
	  char *p = arg + sizeof ("--word=") - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4400
	  int len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4401
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4402
	  if (! safe_parse_maxint (&p, &len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4403
	    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4404
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4405
	  switch (len)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4406
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4407
	    case 5: word_len = UART_5BITS_WORD; break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4408
	    case 6: word_len = UART_6BITS_WORD; break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4409
	    case 7: word_len = UART_7BITS_WORD; break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4410
	    case 8: word_len = UART_8BITS_WORD; break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4411
	    default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4412
	      errnum = ERR_BAD_ARGUMENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4413
	      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4414
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4415
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4416
      else if (grub_memcmp (arg, "--stop=", sizeof ("--stop=") - 1) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4417
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4418
	  char *p = arg + sizeof ("--stop=") - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4419
	  int len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4420
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4421
	  if (! safe_parse_maxint (&p, &len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4422
	    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4423
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4424
	  switch (len)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4425
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4426
	    case 1: stop_bit_len = UART_1_STOP_BIT; break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4427
	    case 2: stop_bit_len = UART_2_STOP_BITS; break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4428
	    default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4429
	      errnum = ERR_BAD_ARGUMENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4430
	      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4431
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4432
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4433
      else if (grub_memcmp (arg, "--parity=", sizeof ("--parity=") - 1) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4434
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4435
	  char *p = arg + sizeof ("--parity=") - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4436
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4437
	  if (grub_memcmp (p, "no", sizeof ("no") - 1) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4438
	    parity = UART_NO_PARITY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4439
	  else if (grub_memcmp (p, "odd", sizeof ("odd") - 1) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4440
	    parity = UART_ODD_PARITY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4441
	  else if (grub_memcmp (p, "even", sizeof ("even") - 1) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4442
	    parity = UART_EVEN_PARITY;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4443
	  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4444
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4445
	      errnum = ERR_BAD_ARGUMENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4446
	      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4447
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4448
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4449
# ifdef GRUB_UTIL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4450
      /* In the grub shell, don't use any port number but open a tty
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4451
	 device instead.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4452
      else if (grub_memcmp (arg, "--device=", sizeof ("--device=") - 1) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4453
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4454
	  char *p = arg + sizeof ("--device=") - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4455
	  char dev[256];	/* XXX */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4456
	  char *q = dev;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4457
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4458
	  while (*p && ! grub_isspace (*p))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4459
	    *q++ = *p++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4460
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4461
	  *q = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4462
	  serial_set_device (dev);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4463
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4464
# endif /* GRUB_UTIL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4465
      else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4466
	break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4467
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4468
      arg = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4469
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4470
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4471
  /* Initialize the serial unit.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4472
  if (! serial_hw_init (port, speed, word_len, parity, stop_bit_len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4473
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4474
      errnum = ERR_BAD_ARGUMENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4475
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4476
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4477
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4478
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4479
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4480
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4481
static struct builtin builtin_serial =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4482
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4483
  "serial",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4484
  serial_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4485
  BUILTIN_MENU | BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4486
  "serial [--unit=UNIT] [--port=PORT] [--speed=SPEED] [--word=WORD] [--parity=PARITY] [--stop=STOP] [--device=DEV]",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4487
  "Initialize a serial device. UNIT is a digit that specifies which serial"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4488
  " device is used (e.g. 0 == COM1). If you need to specify the port number,"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4489
  " set it by --port. SPEED is the DTE-DTE speed. WORD is the word length,"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4490
  " PARITY is the type of parity, which is one of `no', `odd' and `even'."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4491
  " STOP is the length of stop bit(s). The option --device can be used only"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4492
  " in the grub shell, which specifies the file name of a tty device. The"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4493
  " default values are COM1, 9600, 8N1."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4494
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4495
#endif /* SUPPORT_SERIAL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4496
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4497

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4498
/* setkey */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4499
struct keysym
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4500
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4501
  char *unshifted_name;			/* the name in unshifted state */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4502
  char *shifted_name;			/* the name in shifted state */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4503
  unsigned char unshifted_ascii;	/* the ascii code in unshifted state */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4504
  unsigned char shifted_ascii;		/* the ascii code in shifted state */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4505
  unsigned char keycode;		/* keyboard scancode */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4506
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4507
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4508
/* The table for key symbols. If the "shifted" member of an entry is
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4509
   NULL, the entry does not have shifted state.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4510
static struct keysym keysym_table[] =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4511
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4512
  {"escape",		0,		0x1b,	0,	0x01},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4513
  {"1",			"exclam",	'1',	'!',	0x02},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4514
  {"2",			"at",		'2',	'@',	0x03},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4515
  {"3",			"numbersign",	'3',	'#',	0x04},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4516
  {"4",			"dollar",	'4',	'$',	0x05},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4517
  {"5",			"percent",	'5',	'%',	0x06},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4518
  {"6",			"caret",	'6',	'^',	0x07},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4519
  {"7",			"ampersand",	'7',	'&',	0x08},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4520
  {"8",			"asterisk",	'8',	'*',	0x09},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4521
  {"9",			"parenleft",	'9',	'(',	0x0a},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4522
  {"0",			"parenright",	'0',	')',	0x0b},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4523
  {"minus",		"underscore",	'-',	'_',	0x0c},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4524
  {"equal",		"plus",		'=',	'+',	0x0d},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4525
  {"backspace",		0,		'\b',	0,	0x0e},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4526
  {"tab",		0,		'\t',	0,	0x0f},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4527
  {"q",			"Q",		'q',	'Q',	0x10},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4528
  {"w",			"W",		'w',	'W',	0x11},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4529
  {"e",			"E",		'e',	'E',	0x12},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4530
  {"r",			"R",		'r',	'R',	0x13},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4531
  {"t",			"T",		't',	'T',	0x14},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4532
  {"y",			"Y",		'y',	'Y',	0x15},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4533
  {"u",			"U",		'u',	'U',	0x16},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4534
  {"i",			"I",		'i',	'I',	0x17},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4535
  {"o",			"O",		'o',	'O',	0x18},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4536
  {"p",			"P",		'p',	'P',	0x19},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4537
  {"bracketleft",	"braceleft",	'[',	'{',	0x1a},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4538
  {"bracketright",	"braceright",	']',	'}',	0x1b},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4539
  {"enter",		0,		'\n',	0,	0x1c},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4540
  {"control",		0,		0,	0,	0x1d},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4541
  {"a",			"A",		'a',	'A',	0x1e},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4542
  {"s",			"S",		's',	'S',	0x1f},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4543
  {"d",			"D",		'd',	'D',	0x20},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4544
  {"f",			"F",		'f',	'F',	0x21},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4545
  {"g",			"G",		'g',	'G',	0x22},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4546
  {"h",			"H",		'h',	'H',	0x23},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4547
  {"j",			"J",		'j',	'J',	0x24},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4548
  {"k",			"K",		'k',	'K',	0x25},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4549
  {"l",			"L",		'l',	'L',	0x26},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4550
  {"semicolon",		"colon",	';',	':',	0x27},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4551
  {"quote",		"doublequote",	'\'',	'"',	0x28},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4552
  {"backquote",		"tilde",	'`',	'~',	0x29},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4553
  {"shift",		0,		0,	0,	0x2a},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4554
  {"backslash",		"bar",		'\\',	'|',	0x2b},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4555
  {"z",			"Z",		'z',	'Z',	0x2c},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4556
  {"x",			"X",		'x',	'X',	0x2d},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4557
  {"c",			"C",		'c',	'C',	0x2e},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4558
  {"v",			"V",		'v',	'V',	0x2f},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4559
  {"b",			"B",		'b',	'B',	0x30},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4560
  {"n",			"N",		'n',	'N',	0x31},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4561
  {"m",			"M",		'm',	'M',	0x32},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4562
  {"comma",		"less",		',',	'<',	0x33},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4563
  {"period",		"greater",	'.',	'>',	0x34},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4564
  {"slash",		"question",	'/',	'?',	0x35},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4565
  {"alt",		0,		0,	0,	0x38},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4566
  {"space",		0,		' ',	0,	0x39},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4567
  {"capslock",		0,		0,	0,	0x3a},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4568
  {"F1",		0,		0,	0,	0x3b},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4569
  {"F2",		0,		0,	0,	0x3c},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4570
  {"F3",		0,		0,	0,	0x3d},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4571
  {"F4",		0,		0,	0,	0x3e},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4572
  {"F5",		0,		0,	0,	0x3f},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4573
  {"F6",		0,		0,	0,	0x40},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4574
  {"F7",		0,		0,	0,	0x41},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4575
  {"F8",		0,		0,	0,	0x42},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4576
  {"F9",		0,		0,	0,	0x43},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4577
  {"F10",		0,		0,	0,	0x44},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4578
  /* Caution: do not add NumLock here! we cannot deal with it properly.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4579
  {"delete",		0,		0x7f,	0,	0x53}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4580
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4581
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4582
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4583
setkey_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4584
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4585
  char *to_key, *from_key;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4586
  int to_code, from_code;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4587
  int map_in_interrupt = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4588
  
8044
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
  4589
  auto int find_key_code (char *key);
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
  4590
  auto int find_ascii_code (char *key);
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
  4591
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
  4592
  auto int find_key_code (char *key)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4593
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4594
      int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4595
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4596
      for (i = 0; i < sizeof (keysym_table) / sizeof (keysym_table[0]); i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4597
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4598
	  if (keysym_table[i].unshifted_name &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4599
	      grub_strcmp (key, keysym_table[i].unshifted_name) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4600
	    return keysym_table[i].keycode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4601
	  else if (keysym_table[i].shifted_name &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4602
		   grub_strcmp (key, keysym_table[i].shifted_name) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4603
	    return keysym_table[i].keycode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4604
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4605
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4606
      return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4607
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4608
  
8044
b3af80bbf173 6731552 GRUB should have the ability to overlay a logo on the graphical splash screen
William Kucharski <William.Kucharski@Sun.COM>
parents: 7701
diff changeset
  4609
  auto int find_ascii_code (char *key)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4610
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4611
      int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4612
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4613
      for (i = 0; i < sizeof (keysym_table) / sizeof (keysym_table[0]); i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4614
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4615
	  if (keysym_table[i].unshifted_name &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4616
	      grub_strcmp (key, keysym_table[i].unshifted_name) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4617
	    return keysym_table[i].unshifted_ascii;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4618
	  else if (keysym_table[i].shifted_name &&
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4619
		   grub_strcmp (key, keysym_table[i].shifted_name) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4620
	    return keysym_table[i].shifted_ascii;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4621
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4622
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4623
      return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4624
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4625
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4626
  to_key = arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4627
  from_key = skip_to (0, to_key);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4628
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4629
  if (! *to_key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4630
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4631
      /* If the user specifies no argument, reset the key mappings.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4632
      grub_memset (bios_key_map, 0, KEY_MAP_SIZE * sizeof (unsigned short));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4633
      grub_memset (ascii_key_map, 0, KEY_MAP_SIZE * sizeof (unsigned short));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4634
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4635
      return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4636
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4637
  else if (! *from_key)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4638
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4639
      /* The user must specify two arguments or zero argument.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4640
      errnum = ERR_BAD_ARGUMENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4641
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4642
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4643
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4644
  nul_terminate (to_key);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4645
  nul_terminate (from_key);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4646
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4647
  to_code = find_ascii_code (to_key);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4648
  from_code = find_ascii_code (from_key);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4649
  if (! to_code || ! from_code)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4650
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4651
      map_in_interrupt = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4652
      to_code = find_key_code (to_key);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4653
      from_code = find_key_code (from_key);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4654
      if (! to_code || ! from_code)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4655
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4656
	  errnum = ERR_BAD_ARGUMENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4657
	  return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4658
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4659
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4660
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4661
  if (map_in_interrupt)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4662
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4663
      int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4664
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4665
      /* Find an empty slot.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4666
      for (i = 0; i < KEY_MAP_SIZE; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4667
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4668
	  if ((bios_key_map[i] & 0xff) == from_code)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4669
	    /* Perhaps the user wants to overwrite the map.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4670
	    break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4671
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4672
	  if (! bios_key_map[i])
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4673
	    break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4674
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4675
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4676
      if (i == KEY_MAP_SIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4677
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4678
	  errnum = ERR_WONT_FIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4679
	  return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4680
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4681
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4682
      if (to_code == from_code)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4683
	/* If TO is equal to FROM, delete the entry.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4684
	grub_memmove ((char *) &bios_key_map[i],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4685
		      (char *) &bios_key_map[i + 1],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4686
		      sizeof (unsigned short) * (KEY_MAP_SIZE - i));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4687
      else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4688
	bios_key_map[i] = (to_code << 8) | from_code;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4689
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4690
      /* Ugly but should work.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4691
      unset_int15_handler ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4692
      set_int15_handler ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4693
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4694
  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4695
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4696
      int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4697
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4698
      /* Find an empty slot.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4699
      for (i = 0; i < KEY_MAP_SIZE; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4700
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4701
	  if ((ascii_key_map[i] & 0xff) == from_code)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4702
	    /* Perhaps the user wants to overwrite the map.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4703
	    break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4704
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4705
	  if (! ascii_key_map[i])
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4706
	    break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4707
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4708
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4709
      if (i == KEY_MAP_SIZE)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4710
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4711
	  errnum = ERR_WONT_FIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4712
	  return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4713
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4714
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4715
      if (to_code == from_code)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4716
	/* If TO is equal to FROM, delete the entry.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4717
	grub_memmove ((char *) &ascii_key_map[i],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4718
		      (char *) &ascii_key_map[i + 1],
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4719
		      sizeof (unsigned short) * (KEY_MAP_SIZE - i));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4720
      else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4721
	ascii_key_map[i] = (to_code << 8) | from_code;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4722
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4723
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4724
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4725
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4726
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4727
static struct builtin builtin_setkey =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4728
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4729
  "setkey",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4730
  setkey_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4731
  BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4732
  "setkey [TO_KEY FROM_KEY]",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4733
  "Change the keyboard map. The key FROM_KEY is mapped to the key TO_KEY."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4734
  " A key must be an alphabet, a digit, or one of these: escape, exclam,"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4735
  " at, numbersign, dollar, percent, caret, ampersand, asterisk, parenleft,"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4736
  " parenright, minus, underscore, equal, plus, backspace, tab, bracketleft,"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4737
  " braceleft, bracketright, braceright, enter, control, semicolon, colon,"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4738
  " quote, doublequote, backquote, tilde, shift, backslash, bar, comma,"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4739
  " less, period, greater, slash, question, alt, space, capslock, FX (X"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4740
  " is a digit), and delete. If no argument is specified, reset key"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4741
  " mappings."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4742
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4743
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4744

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4745
/* setup */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4746
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4747
setup_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4748
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4749
  /* Point to the string of the installed drive/partition.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4750
  char *install_ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4751
  /* Point to the string of the drive/parition where the GRUB images
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4752
     reside.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4753
  char *image_ptr;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4754
  unsigned long installed_drive, installed_partition;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4755
  unsigned long image_drive, image_partition;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4756
  unsigned long tmp_drive, tmp_partition;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4757
  char stage1[64];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4758
  char stage2[64];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4759
  char config_filename[64];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4760
  char real_config_filename[64];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4761
  char cmd_arg[256];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4762
  char device[16];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4763
  char *buffer = (char *) RAW_ADDR (0x100000);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4764
  int is_force_lba = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4765
  char *stage2_arg = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4766
  char *prefix = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4767
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4768
  auto int check_file (char *file);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4769
  auto void sprint_device (int drive, int partition);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4770
  auto int embed_stage1_5 (char * stage1_5, int drive, int partition);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4771
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4772
  /* Check if the file FILE exists like Autoconf.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4773
  int check_file (char *file)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4774
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4775
      int ret;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4776
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4777
      grub_printf (" Checking if \"%s\" exists... ", file);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4778
      ret = grub_open (file);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4779
      if (ret)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4780
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4781
	  grub_close ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4782
	  grub_printf ("yes\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4783
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4784
      else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4785
	grub_printf ("no\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4786
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4787
      return ret;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4788
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4789
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4790
  /* Construct a device name in DEVICE.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4791
  void sprint_device (int drive, int partition)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4792
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4793
      grub_sprintf (device, "(%cd%d",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4794
		    (drive & 0x80) ? 'h' : 'f',
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4795
		    drive & ~0x80);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4796
      if ((partition & 0xFF0000) != 0xFF0000)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4797
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4798
	  char tmp[16];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4799
	  grub_sprintf (tmp, ",%d", (partition >> 16) & 0xFF);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4800
	  grub_strncat (device, tmp, 256);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4801
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4802
      if ((partition & 0x00FF00) != 0x00FF00)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4803
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4804
	  char tmp[16];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4805
	  grub_sprintf (tmp, ",%c", 'a' + ((partition >> 8) & 0xFF));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4806
	  grub_strncat (device, tmp, 256);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4807
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4808
      grub_strncat (device, ")", 256);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4809
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4810
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4811
  int embed_stage1_5 (char *stage1_5, int drive, int partition)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4812
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4813
      /* We install GRUB into the MBR, so try to embed the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4814
	 Stage 1.5 in the sectors right after the MBR.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4815
      sprint_device (drive, partition);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4816
      grub_sprintf (cmd_arg, "%s %s", stage1_5, device);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4817
	      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4818
      /* Notify what will be run.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4819
      grub_printf (" Running \"embed %s\"... ", cmd_arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4820
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4821
      embed_func (cmd_arg, flags);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4822
      if (! errnum)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4823
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4824
	  /* Construct the blocklist representation.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4825
	  grub_sprintf (buffer, "%s%s", device, embed_info);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4826
	  grub_printf ("succeeded\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4827
	  return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4828
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4829
      else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4830
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4831
	  grub_printf ("failed (this is not fatal)\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4832
	  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4833
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4834
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4835
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4836
  struct stage1_5_map {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4837
    char *fsys;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4838
    char *name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4839
  };
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4840
  struct stage1_5_map stage1_5_map[] =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4841
  {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4842
    {"ext2fs",   "/e2fs_stage1_5"},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4843
    {"fat",      "/fat_stage1_5"},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4844
    {"ufs2",     "/ufs2_stage1_5"},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4845
    {"ffs",      "/ffs_stage1_5"},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4846
    {"iso9660",  "/iso9660_stage1_5"},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4847
    {"jfs",      "/jfs_stage1_5"},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4848
    {"minix",    "/minix_stage1_5"},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4849
    {"reiserfs", "/reiserfs_stage1_5"},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4850
    {"vstafs",   "/vstafs_stage1_5"},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4851
    {"xfs",      "/xfs_stage1_5"},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4852
    {"ufs",      "/ufs_stage1_5"}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4853
  };
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4854
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4855
  tmp_drive = saved_drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4856
  tmp_partition = saved_partition;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4857
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4858
  /* Check if the user specifies --force-lba.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4859
  while (1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4860
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4861
      if (grub_memcmp ("--force-lba", arg, sizeof ("--force-lba") - 1) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4862
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4863
	  is_force_lba = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4864
	  arg = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4865
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4866
      else if (grub_memcmp ("--prefix=", arg, sizeof ("--prefix=") - 1) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4867
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4868
	  prefix = arg + sizeof ("--prefix=") - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4869
	  arg = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4870
	  nul_terminate (prefix);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4871
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4872
#ifdef GRUB_UTIL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4873
      else if (grub_memcmp ("--stage2=", arg, sizeof ("--stage2=") - 1) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4874
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4875
	  stage2_arg = arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4876
	  arg = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4877
	  nul_terminate (stage2_arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4878
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4879
#endif /* GRUB_UTIL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4880
      else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4881
	break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4882
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4883
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4884
  install_ptr = arg;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4885
  image_ptr = skip_to (0, install_ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4886
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4887
  /* Make sure that INSTALL_PTR is valid.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4888
  set_device (install_ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4889
  if (errnum)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4890
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4891
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4892
  installed_drive = current_drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4893
  installed_partition = current_partition;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4894
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4895
  /* Mount the drive pointed by IMAGE_PTR.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4896
  if (*image_ptr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4897
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4898
      /* If the drive/partition where the images reside is specified,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4899
	 get the drive and the partition.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4900
      set_device (image_ptr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4901
      if (errnum)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4902
	return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4903
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4904
  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4905
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4906
      /* If omitted, use SAVED_PARTITION and SAVED_DRIVE.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4907
      current_drive = saved_drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4908
      current_partition = saved_partition;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4909
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4910
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4911
  image_drive = saved_drive = current_drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4912
  image_partition = saved_partition = current_partition;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4913
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4914
  /* Open it.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4915
  if (! open_device ())
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4916
    goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4917
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4918
  /* Check if stage1 exists. If the user doesn't specify the option
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4919
     `--prefix', attempt /boot/grub and /grub.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4920
  /* NOTE: It is dangerous to run this command without `--prefix' in the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4921
     grub shell, since that affects `--stage2'.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4922
  if (! prefix)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4923
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4924
      prefix = "/boot/grub";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4925
      grub_sprintf (stage1, "%s%s", prefix, "/stage1");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4926
      if (! check_file (stage1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4927
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4928
	  errnum = ERR_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4929
	  prefix = "/grub";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4930
	  grub_sprintf (stage1, "%s%s", prefix, "/stage1");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4931
	  if (! check_file (stage1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4932
	    goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4933
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4934
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4935
  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4936
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4937
      grub_sprintf (stage1, "%s%s", prefix, "/stage1");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4938
      if (! check_file (stage1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4939
	goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4940
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4941
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4942
  /* The prefix was determined.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4943
  grub_sprintf (stage2, "%s%s", prefix, "/stage2");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4944
  grub_sprintf (config_filename, "%s%s", prefix, "/menu.lst");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4945
  *real_config_filename = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4946
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4947
  /* Check if stage2 exists.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4948
  if (! check_file (stage2))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4949
    goto fail;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4950
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4951
  {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4952
    char *fsys = fsys_table[fsys_type].name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4953
    int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4954
    int size = sizeof (stage1_5_map) / sizeof (stage1_5_map[0]);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4955
    
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4956
    /* Iterate finding the same filesystem name as FSYS.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4957
    for (i = 0; i < size; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4958
      if (grub_strcmp (fsys, stage1_5_map[i].fsys) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4959
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4960
	  /* OK, check if the Stage 1.5 exists.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4961
	  char stage1_5[64];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4962
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4963
	  grub_sprintf (stage1_5, "%s%s", prefix, stage1_5_map[i].name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4964
	  if (check_file (stage1_5))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4965
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4966
	      if (embed_stage1_5 (stage1_5, 
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4967
				    installed_drive, installed_partition)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4968
		  || embed_stage1_5 (stage1_5, 
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4969
				     image_drive, image_partition))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4970
		{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4971
		  grub_strcpy (real_config_filename, config_filename);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4972
		  sprint_device (image_drive, image_partition);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4973
		  grub_sprintf (config_filename, "%s%s", device, stage2);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4974
		  grub_strcpy (stage2, buffer);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4975
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4976
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4977
	  errnum = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4978
	  break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4979
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4980
  }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4981
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4982
  /* Construct a string that is used by the command "install" as its
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4983
     arguments.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4984
  sprint_device (installed_drive, installed_partition);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4985
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4986
#if 1
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4987
  /* Don't embed a drive number unnecessarily.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4988
  grub_sprintf (cmd_arg, "%s%s%s%s %s%s %s p %s %s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4989
		is_force_lba? "--force-lba " : "",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4990
		stage2_arg? stage2_arg : "",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4991
		stage2_arg? " " : "",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4992
		stage1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4993
		(installed_drive != image_drive) ? "d " : "",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4994
		device,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4995
		stage2,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4996
		config_filename,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4997
		real_config_filename);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4998
#else /* NOT USED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  4999
  /* This code was used, because we belived some BIOSes had a problem
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5000
     that they didn't pass a booting drive correctly. It turned out,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5001
     however, stage1 could trash a booting drive when checking LBA support,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5002
     because some BIOSes modified the register %dx in INT 13H, AH=48H.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5003
     So it becamed unclear whether GRUB should use a pre-defined booting
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5004
     drive or not. If the problem still exists, it would be necessary to
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5005
     switch back to this code.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5006
  grub_sprintf (cmd_arg, "%s%s%s%s d %s %s p %s %s",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5007
		is_force_lba? "--force-lba " : "",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5008
		stage2_arg? stage2_arg : "",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5009
		stage2_arg? " " : "",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5010
		stage1,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5011
		device,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5012
		stage2,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5013
		config_filename,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5014
		real_config_filename);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5015
#endif /* NOT USED */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5016
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5017
  /* Notify what will be run.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5018
  grub_printf (" Running \"install %s\"... ", cmd_arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5019
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5020
  /* Make sure that SAVED_DRIVE and SAVED_PARTITION are identical
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5021
     with IMAGE_DRIVE and IMAGE_PARTITION, respectively.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5022
  saved_drive = image_drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5023
  saved_partition = image_partition;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5024
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5025
  /* Run the command.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5026
  if (! install_func (cmd_arg, flags))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5027
    grub_printf ("succeeded\nDone.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5028
  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5029
    grub_printf ("failed\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5030
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5031
 fail:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5032
  saved_drive = tmp_drive;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5033
  saved_partition = tmp_partition;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5034
  return errnum;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5035
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5036
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5037
static struct builtin builtin_setup =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5038
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5039
  "setup",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5040
  setup_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5041
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5042
  "setup [--prefix=DIR] [--stage2=STAGE2_FILE] [--force-lba] INSTALL_DEVICE [IMAGE_DEVICE]",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5043
  "Set up the installation of GRUB automatically. This command uses"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5044
  " the more flexible command \"install\" in the backend and installs"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5045
  " GRUB into the device INSTALL_DEVICE. If IMAGE_DEVICE is specified,"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5046
  " then find the GRUB images in the device IMAGE_DEVICE, otherwise"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5047
  " use the current \"root device\", which can be set by the command"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5048
  " \"root\". If you know that your BIOS should support LBA but GRUB"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5049
  " doesn't work in LBA mode, specify the option `--force-lba'."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5050
  " If you install GRUB under the grub shell and you cannot unmount the"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5051
  " partition where GRUB images reside, specify the option `--stage2'"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5052
  " to tell GRUB the file name under your OS."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5053
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5054
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5055

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5056
#if defined(SUPPORT_SERIAL) || defined(SUPPORT_HERCULES) || defined(SUPPORT_GRAPHICS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5057
/* terminal */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5058
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5059
terminal_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5060
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5061
  /* The index of the default terminal in TERM_TABLE.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5062
  int default_term = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5063
  struct term_entry *prev_term = current_term;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5064
  int to = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5065
  int lines = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5066
  int no_message = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5067
  unsigned long term_flags = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5068
  /* XXX: Assume less than 32 terminals.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5069
  unsigned long term_bitmap = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5070
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5071
  /* Get GNU-style long options.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5072
  while (1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5073
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5074
      if (grub_memcmp (arg, "--dumb", sizeof ("--dumb") - 1) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5075
	term_flags |= TERM_DUMB;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5076
      else if (grub_memcmp (arg, "--no-echo", sizeof ("--no-echo") - 1) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5077
	/* ``--no-echo'' implies ``--no-edit''.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5078
	term_flags |= (TERM_NO_ECHO | TERM_NO_EDIT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5079
      else if (grub_memcmp (arg, "--no-edit", sizeof ("--no-edit") - 1) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5080
	term_flags |= TERM_NO_EDIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5081
      else if (grub_memcmp (arg, "--timeout=", sizeof ("--timeout=") - 1) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5082
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5083
	  char *val = arg + sizeof ("--timeout=") - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5084
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5085
	  if (! safe_parse_maxint (&val, &to))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5086
	    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5087
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5088
      else if (grub_memcmp (arg, "--lines=", sizeof ("--lines=") - 1) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5089
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5090
	  char *val = arg + sizeof ("--lines=") - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5091
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5092
	  if (! safe_parse_maxint (&val, &lines))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5093
	    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5094
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5095
	  /* Probably less than four is meaningless....  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5096
	  if (lines < 4)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5097
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5098
	      errnum = ERR_BAD_ARGUMENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5099
	      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5100
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5101
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5102
      else if (grub_memcmp (arg, "--silent", sizeof ("--silent") - 1) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5103
	no_message = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5104
      else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5105
	break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5106
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5107
      arg = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5108
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5109
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5110
  /* If no argument is specified, show current setting.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5111
  if (! *arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5112
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5113
      grub_printf ("%s%s%s%s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5114
		   current_term->name,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5115
		   current_term->flags & TERM_DUMB ? " (dumb)" : "",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5116
		   current_term->flags & TERM_NO_EDIT ? " (no edit)" : "",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5117
		   current_term->flags & TERM_NO_ECHO ? " (no echo)" : "");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5118
      return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5119
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5120
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5121
  while (*arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5122
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5123
      int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5124
      char *next = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5125
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5126
      nul_terminate (arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5127
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5128
      for (i = 0; term_table[i].name; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5129
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5130
	  if (grub_strcmp (arg, term_table[i].name) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5131
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5132
	      if (term_table[i].flags & TERM_NEED_INIT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5133
		{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5134
		  errnum = ERR_DEV_NEED_INIT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5135
		  return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5136
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5137
	      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5138
	      if (default_term < 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5139
		default_term = i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5140
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5141
	      term_bitmap |= (1 << i);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5142
	      break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5143
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5144
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5145
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5146
      if (! term_table[i].name)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5147
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5148
	  errnum = ERR_BAD_ARGUMENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5149
	  return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5150
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5151
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5152
      arg = next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5153
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5154
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5155
  /* If multiple terminals are specified, wait until the user pushes any
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5156
     key on one of the terminals.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5157
  if (term_bitmap & ~(1 << default_term))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5158
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5159
      int time1, time2 = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5160
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5161
      /* XXX: Disable the pager.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5162
      count_lines = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5163
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5164
      /* Get current time.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5165
      while ((time1 = getrtsecs ()) == 0xFF)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5166
	;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5167
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5168
      /* Wait for a key input.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5169
      while (to)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5170
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5171
	  int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5172
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5173
	  for (i = 0; term_table[i].name; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5174
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5175
	      if (term_bitmap & (1 << i))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5176
		{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5177
		  if (term_table[i].checkkey () >= 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5178
		    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5179
		      (void) term_table[i].getkey ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5180
		      default_term = i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5181
		      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5182
		      goto end;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5183
		    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5184
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5185
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5186
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5187
	  /* Prompt the user, once per sec.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5188
	  if ((time1 = getrtsecs ()) != time2 && time1 != 0xFF)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5189
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5190
	      if (! no_message)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5191
		{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5192
		  /* Need to set CURRENT_TERM to each of selected
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5193
		     terminals.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5194
		  for (i = 0; term_table[i].name; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5195
		    if (term_bitmap & (1 << i))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5196
		      {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5197
			current_term = term_table + i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5198
			grub_printf ("\rPress any key to continue.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5199
		      }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5200
		  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5201
		  /* Restore CURRENT_TERM.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5202
		  current_term = prev_term;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5203
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5204
	      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5205
	      time2 = time1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5206
	      if (to > 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5207
		to--;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5208
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5209
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5210
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5211
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5212
 end:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5213
  current_term = term_table + default_term;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5214
  current_term->flags = term_flags;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5215
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5216
  if (lines)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5217
    max_lines = lines;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5218
  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5219
    max_lines = current_term->max_lines;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5220
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5221
  /* If the interface is currently the command-line,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5222
     restart it to repaint the screen.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5223
  if ((current_term != prev_term) && (flags & BUILTIN_CMDLINE)){
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5224
    if (prev_term->shutdown)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5225
      prev_term->shutdown();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5226
    if (current_term->startup)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5227
      current_term->startup();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5228
    grub_longjmp (restart_cmdline_env, 0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5229
  }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5230
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5231
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5232
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5233
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5234
static struct builtin builtin_terminal =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5235
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5236
  "terminal",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5237
  terminal_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5238
  BUILTIN_MENU | BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5239
  "terminal [--dumb] [--no-echo] [--no-edit] [--timeout=SECS] [--lines=LINES] [--silent] [console] [serial] [hercules] [graphics]",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5240
  "Select a terminal. When multiple terminals are specified, wait until"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5241
  " you push any key to continue. If both console and serial are specified,"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5242
  " the terminal to which you input a key first will be selected. If no"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5243
  " argument is specified, print current setting. The option --dumb"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5244
  " specifies that your terminal is dumb, otherwise, vt100-compatibility"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5245
  " is assumed. If you specify --no-echo, input characters won't be echoed."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5246
  " If you specify --no-edit, the BASH-like editing feature will be disabled."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5247
  " If --timeout is present, this command will wait at most for SECS"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5248
  " seconds. The option --lines specifies the maximum number of lines."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5249
  " The option --silent is used to suppress messages."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5250
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5251
#endif /* SUPPORT_SERIAL || SUPPORT_HERCULES || SUPPORT_GRAPHICS */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5252
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5253

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5254
#ifdef SUPPORT_SERIAL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5255
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5256
terminfo_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5257
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5258
  struct terminfo term;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5259
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5260
  if (*arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5261
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5262
      struct
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5263
      {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5264
	const char *name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5265
	char *var;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5266
      }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5267
      options[] =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5268
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5269
	  {"--name=", term.name},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5270
	  {"--cursor-address=", term.cursor_address},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5271
	  {"--clear-screen=", term.clear_screen},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5272
	  {"--enter-standout-mode=", term.enter_standout_mode},
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5273
	  {"--exit-standout-mode=", term.exit_standout_mode}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5274
	};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5275
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5276
      grub_memset (&term, 0, sizeof (term));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5277
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5278
      while (*arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5279
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5280
	  int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5281
	  char *next = skip_to (0, arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5282
	      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5283
	  nul_terminate (arg);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5284
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5285
	  for (i = 0; i < sizeof (options) / sizeof (options[0]); i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5286
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5287
	      const char *name = options[i].name;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5288
	      int len = grub_strlen (name);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5289
	      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5290
	      if (! grub_memcmp (arg, name, len))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5291
		{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5292
		  grub_strcpy (options[i].var, ti_unescape_string (arg + len));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5293
		  break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5294
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5295
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5296
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5297
	  if (i == sizeof (options) / sizeof (options[0]))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5298
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5299
	      errnum = ERR_BAD_ARGUMENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5300
	      return errnum;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5301
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5302
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5303
	  arg = next;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5304
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5305
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5306
      if (term.name[0] == 0 || term.cursor_address[0] == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5307
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5308
	  errnum = ERR_BAD_ARGUMENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5309
	  return errnum;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5310
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5311
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5312
      ti_set_term (&term);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5313
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5314
  else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5315
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5316
      /* No option specifies printing out current settings.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5317
      ti_get_term (&term);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5318
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5319
      grub_printf ("name=%s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5320
		   ti_escape_string (term.name));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5321
      grub_printf ("cursor_address=%s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5322
		   ti_escape_string (term.cursor_address));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5323
      grub_printf ("clear_screen=%s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5324
		   ti_escape_string (term.clear_screen));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5325
      grub_printf ("enter_standout_mode=%s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5326
		   ti_escape_string (term.enter_standout_mode));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5327
      grub_printf ("exit_standout_mode=%s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5328
		   ti_escape_string (term.exit_standout_mode));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5329
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5330
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5331
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5332
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5333
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5334
static struct builtin builtin_terminfo =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5335
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5336
  "terminfo",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5337
  terminfo_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5338
  BUILTIN_MENU | BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5339
  "terminfo [--name=NAME --cursor-address=SEQ [--clear-screen=SEQ]"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5340
  " [--enter-standout-mode=SEQ] [--exit-standout-mode=SEQ]]",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5341
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5342
  "Define the capabilities of your terminal. Use this command to"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5343
  " define escape sequences, if it is not vt100-compatible."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5344
  " You may use \\e for ESC and ^X for a control character."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5345
  " If no option is specified, the current settings are printed."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5346
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5347
#endif /* SUPPORT_SERIAL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5348
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5349

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5350
/* testload */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5351
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5352
testload_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5353
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5354
  int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5355
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5356
  kernel_type = KERNEL_TYPE_NONE;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5357
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5358
  if (! grub_open (arg))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5359
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5360
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5361
  disk_read_hook = disk_read_print_func;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5362
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5363
  /* Perform filesystem test on the specified file.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5364
  /* Read whole file first. */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5365
  grub_printf ("Whole file: ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5366
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5367
  grub_read ((char *) RAW_ADDR (0x100000), -1);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5368
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5369
  /* Now compare two sections of the file read differently.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5370
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5371
  for (i = 0; i < 0x10ac0; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5372
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5373
      *((unsigned char *) RAW_ADDR (0x200000 + i)) = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5374
      *((unsigned char *) RAW_ADDR (0x300000 + i)) = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5375
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5376
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5377
  /* First partial read.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5378
  grub_printf ("\nPartial read 1: ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5379
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5380
  grub_seek (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5381
  grub_read ((char *) RAW_ADDR (0x200000), 0x7);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5382
  grub_read ((char *) RAW_ADDR (0x200007), 0x100);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5383
  grub_read ((char *) RAW_ADDR (0x200107), 0x10);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5384
  grub_read ((char *) RAW_ADDR (0x200117), 0x999);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5385
  grub_read ((char *) RAW_ADDR (0x200ab0), 0x10);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5386
  grub_read ((char *) RAW_ADDR (0x200ac0), 0x10000);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5387
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5388
  /* Second partial read.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5389
  grub_printf ("\nPartial read 2: ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5390
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5391
  grub_seek (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5392
  grub_read ((char *) RAW_ADDR (0x300000), 0x10000);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5393
  grub_read ((char *) RAW_ADDR (0x310000), 0x10);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5394
  grub_read ((char *) RAW_ADDR (0x310010), 0x7);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5395
  grub_read ((char *) RAW_ADDR (0x310017), 0x10);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5396
  grub_read ((char *) RAW_ADDR (0x310027), 0x999);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5397
  grub_read ((char *) RAW_ADDR (0x3109c0), 0x100);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5398
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5399
  grub_printf ("\nHeader1 = 0x%x, next = 0x%x, next = 0x%x, next = 0x%x\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5400
	       *((int *) RAW_ADDR (0x200000)),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5401
	       *((int *) RAW_ADDR (0x200004)),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5402
	       *((int *) RAW_ADDR (0x200008)),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5403
	       *((int *) RAW_ADDR (0x20000c)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5404
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5405
  grub_printf ("Header2 = 0x%x, next = 0x%x, next = 0x%x, next = 0x%x\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5406
	       *((int *) RAW_ADDR (0x300000)),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5407
	       *((int *) RAW_ADDR (0x300004)),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5408
	       *((int *) RAW_ADDR (0x300008)),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5409
	       *((int *) RAW_ADDR (0x30000c)));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5410
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5411
  for (i = 0; i < 0x10ac0; i++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5412
    if (*((unsigned char *) RAW_ADDR (0x200000 + i))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5413
	!= *((unsigned char *) RAW_ADDR (0x300000 + i)))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5414
      break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5415
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5416
  grub_printf ("Max is 0x10ac0: i=0x%x, filepos=0x%x\n", i, filepos);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5417
  disk_read_hook = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5418
  grub_close ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5419
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5420
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5421
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5422
static struct builtin builtin_testload =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5423
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5424
  "testload",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5425
  testload_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5426
  BUILTIN_CMDLINE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5427
  "testload FILE",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5428
  "Read the entire contents of FILE in several different ways and"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5429
  " compares them, to test the filesystem code. The output is somewhat"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5430
  " cryptic, but if no errors are reported and the final `i=X,"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5431
  " filepos=Y' reading has X and Y equal, then it is definitely"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5432
  " consistent, and very likely works correctly subject to a"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5433
  " consistent offset error. If this test succeeds, then a good next"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5434
  " step is to try loading a kernel."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5435
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5436
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5437

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5438
/* testvbe MODE */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5439
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5440
testvbe_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5441
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5442
  int mode_number;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5443
  struct vbe_controller controller;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5444
  struct vbe_mode mode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5445
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5446
  if (! *arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5447
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5448
      errnum = ERR_BAD_ARGUMENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5449
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5450
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5451
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5452
  if (! safe_parse_maxint (&arg, &mode_number))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5453
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5454
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5455
  /* Preset `VBE2'.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5456
  grub_memmove (controller.signature, "VBE2", 4);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5457
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5458
  /* Detect VBE BIOS.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5459
  if (get_vbe_controller_info (&controller) != 0x004F)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5460
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5461
      grub_printf (" VBE BIOS is not present.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5462
      return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5463
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5464
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5465
  if (controller.version < 0x0200)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5466
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5467
      grub_printf (" VBE version %d.%d is not supported.\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5468
		   (int) (controller.version >> 8),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5469
		   (int) (controller.version & 0xFF));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5470
      return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5471
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5472
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5473
  if (get_vbe_mode_info (mode_number, &mode) != 0x004F
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5474
      || (mode.mode_attributes & 0x0091) != 0x0091)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5475
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5476
      grub_printf (" Mode 0x%x is not supported.\n", mode_number);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5477
      return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5478
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5479
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5480
  /* Now trip to the graphics mode.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5481
  if (set_vbe_mode (mode_number | (1 << 14)) != 0x004F)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5482
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5483
      grub_printf (" Switching to Mode 0x%x failed.\n", mode_number);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5484
      return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5485
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5486
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5487
  /* Draw something on the screen...  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5488
  {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5489
    unsigned char *base_buf = (unsigned char *) mode.phys_base;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5490
    int scanline = controller.version >= 0x0300
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5491
      ? mode.linear_bytes_per_scanline : mode.bytes_per_scanline;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5492
    /* FIXME: this assumes that any depth is a modulo of 8.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5493
    int bpp = mode.bits_per_pixel / 8;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5494
    int width = mode.x_resolution;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5495
    int height = mode.y_resolution;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5496
    int x, y;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5497
    unsigned color = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5498
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5499
    /* Iterate drawing on the screen, until the user hits any key.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5500
    while (checkkey () == -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5501
      {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5502
	for (y = 0; y < height; y++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5503
	  {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5504
	    unsigned char *line_buf = base_buf + scanline * y;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5505
	    
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5506
	    for (x = 0; x < width; x++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5507
	      {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5508
		unsigned char *buf = line_buf + bpp * x;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5509
		int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5510
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5511
		for (i = 0; i < bpp; i++, buf++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5512
		  *buf = (color >> (i * 8)) & 0xff;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5513
	      }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5514
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5515
	    color++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5516
	  }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5517
      }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5518
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5519
    /* Discard the input.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5520
    getkey ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5521
  }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5522
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5523
  /* Back to the default text mode.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5524
  if (set_vbe_mode (0x03) != 0x004F)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5525
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5526
      /* Why?!  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5527
      grub_reboot ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5528
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5529
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5530
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5531
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5532
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5533
static struct builtin builtin_testvbe =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5534
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5535
  "testvbe",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5536
  testvbe_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5537
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5538
  "testvbe MODE",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5539
  "Test the VBE mode MODE. Hit any key to return."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5540
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5541
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5542

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5543
#ifdef SUPPORT_NETBOOT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5544
/* tftpserver */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5545
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5546
tftpserver_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5547
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5548
  if (! *arg || ! ifconfig (0, 0, 0, arg))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5549
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5550
      errnum = ERR_BAD_ARGUMENT;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5551
      return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5552
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5553
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5554
  print_network_configuration ();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5555
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5556
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5557
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5558
static struct builtin builtin_tftpserver =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5559
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5560
  "tftpserver",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5561
  tftpserver_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5562
  BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5563
  "tftpserver IPADDR",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5564
  "Override the TFTP server address."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5565
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5566
#endif /* SUPPORT_NETBOOT */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5567
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5568

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5569
/* timeout */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5570
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5571
timeout_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5572
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5573
  if (! safe_parse_maxint (&arg, &grub_timeout))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5574
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5575
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5576
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5577
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5578
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5579
static struct builtin builtin_timeout =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5580
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5581
  "timeout",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5582
  timeout_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5583
  BUILTIN_MENU,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5584
#if 0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5585
  "timeout SEC",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5586
  "Set a timeout, in SEC seconds, before automatically booting the"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5587
  " default entry (normally the first entry defined)."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5588
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5589
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5590
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5591

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5592
/* title */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5593
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5594
title_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5595
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5596
  /* This function is not actually used at least currently.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5597
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5598
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5599
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5600
static struct builtin builtin_title =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5601
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5602
  "title",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5603
  title_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5604
  BUILTIN_TITLE,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5605
#if 0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5606
  "title [NAME ...]",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5607
  "Start a new boot entry, and set its name to the contents of the"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5608
  " rest of the line, starting with the first non-space character."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5609
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5610
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5611
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5612

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5613
/* unhide */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5614
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5615
unhide_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5616
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5617
  if (! set_device (arg))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5618
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5619
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5620
  if (! set_partition_hidden_flag (0))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5621
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5622
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5623
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5624
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5625
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5626
static struct builtin builtin_unhide =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5627
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5628
  "unhide",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5629
  unhide_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5630
  BUILTIN_CMDLINE | BUILTIN_MENU | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5631
  "unhide PARTITION",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5632
  "Unhide PARTITION by clearing the \"hidden\" bit in its"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5633
  " partition type code."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5634
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5635
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5636

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5637
/* uppermem */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5638
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5639
uppermem_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5640
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5641
  if (! safe_parse_maxint (&arg, (int *) &mbi.mem_upper))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5642
    return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5643
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5644
  mbi.flags &= ~MB_INFO_MEM_MAP;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5645
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5646
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5647
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5648
static struct builtin builtin_uppermem =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5649
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5650
  "uppermem",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5651
  uppermem_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5652
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5653
  "uppermem KBYTES",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5654
  "Force GRUB to assume that only KBYTES kilobytes of upper memory are"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5655
  " installed.  Any system address range maps are discarded."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5656
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5657
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5658

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5659
/* vbeprobe */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5660
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5661
vbeprobe_func (char *arg, int flags)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5662
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5663
  struct vbe_controller controller;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5664
  unsigned short *mode_list;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5665
  int mode_number = -1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5666
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5667
  auto unsigned long vbe_far_ptr_to_linear (unsigned long);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5668
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5669
  unsigned long vbe_far_ptr_to_linear (unsigned long ptr)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5670
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5671
      unsigned short seg = (ptr >> 16);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5672
      unsigned short off = (ptr & 0xFFFF);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5673
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5674
      return (seg << 4) + off;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5675
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5676
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5677
  if (*arg)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5678
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5679
      if (! safe_parse_maxint (&arg, &mode_number))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5680
	return 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5681
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5682
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5683
  /* Set the signature to `VBE2', to obtain VBE 3.0 information.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5684
  grub_memmove (controller.signature, "VBE2", 4);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5685
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5686
  if (get_vbe_controller_info (&controller) != 0x004F)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5687
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5688
      grub_printf (" VBE BIOS is not present.\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5689
      return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5690
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5691
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5692
  /* Check the version.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5693
  if (controller.version < 0x0200)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5694
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5695
      grub_printf (" VBE version %d.%d is not supported.\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5696
		   (int) (controller.version >> 8),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5697
		   (int) (controller.version & 0xFF));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5698
      return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5699
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5700
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5701
  /* Print some information.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5702
  grub_printf (" VBE version %d.%d\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5703
	       (int) (controller.version >> 8),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5704
	       (int) (controller.version & 0xFF));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5705
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5706
  /* Iterate probing modes.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5707
  for (mode_list
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5708
	 = (unsigned short *) vbe_far_ptr_to_linear (controller.video_mode);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5709
       *mode_list != 0xFFFF;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5710
       mode_list++)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5711
    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5712
      struct vbe_mode mode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5713
      
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5714
      if (get_vbe_mode_info (*mode_list, &mode) != 0x004F)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5715
	continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5716
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5717
      /* Skip this, if this is not supported or linear frame buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5718
	 mode is not support.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5719
      if ((mode.mode_attributes & 0x0081) != 0x0081)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5720
	continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5721
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5722
      if (mode_number == -1 || mode_number == *mode_list)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5723
	{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5724
	  char *model;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5725
	  switch (mode.memory_model)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5726
	    {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5727
	    case 0x00: model = "Text"; break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5728
	    case 0x01: model = "CGA graphics"; break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5729
	    case 0x02: model = "Hercules graphics"; break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5730
	    case 0x03: model = "Planar"; break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5731
	    case 0x04: model = "Packed pixel"; break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5732
	    case 0x05: model = "Non-chain 4, 256 color"; break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5733
	    case 0x06: model = "Direct Color"; break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5734
	    case 0x07: model = "YUV"; break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5735
	    default: model = "Unknown"; break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5736
	    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5737
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5738
	  grub_printf ("  0x%x: %s, %ux%ux%u\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5739
		       (unsigned) *mode_list,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5740
		       model,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5741
		       (unsigned) mode.x_resolution,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5742
		       (unsigned) mode.y_resolution,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5743
		       (unsigned) mode.bits_per_pixel);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5744
	  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5745
	  if (mode_number != -1)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5746
	    break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5747
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5748
    }
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5749
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5750
  if (mode_number != -1 && mode_number != *mode_list)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5751
    grub_printf ("  Mode 0x%x is not found or supported.\n", mode_number);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5752
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5753
  return 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5754
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5755
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5756
static struct builtin builtin_vbeprobe =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5757
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5758
  "vbeprobe",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5759
  vbeprobe_func,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5760
  BUILTIN_CMDLINE | BUILTIN_HELP_LIST,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5761
  "vbeprobe [MODE]",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5762
  "Probe VBE information. If the mode number MODE is specified, show only"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5763
  " the information about only the mode."
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5764
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5765
  
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5766

68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5767
/* The table of builtin commands. Sorted in dictionary order.  */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5768
struct builtin *builtin_table[] =
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5769
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5770
#ifdef SUPPORT_GRAPHICS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5771
  &builtin_background,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5772
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5773
  &builtin_blocklist,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5774
  &builtin_boot,
3912
f6891a60bd72 PSARC 2007/083 ZFS bootable datasets
lling
parents: 3446
diff changeset
  5775
  &builtin_bootfs,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5776
#ifdef SUPPORT_NETBOOT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5777
  &builtin_bootp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5778
#endif /* SUPPORT_NETBOOT */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5779
  &builtin_cat,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5780
  &builtin_chainloader,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5781
  &builtin_clear,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5782
  &builtin_cmp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5783
  &builtin_color,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5784
  &builtin_configfile,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5785
  &builtin_debug,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5786
  &builtin_default,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5787
#ifdef GRUB_UTIL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5788
  &builtin_device,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5789
#endif /* GRUB_UTIL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5790
#ifdef SUPPORT_NETBOOT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5791
  &builtin_dhcp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5792
#endif /* SUPPORT_NETBOOT */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5793
  &builtin_displayapm,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5794
  &builtin_displaymem,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5795
#ifdef GRUB_UTIL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5796
  &builtin_dump,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5797
#endif /* GRUB_UTIL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5798
  &builtin_embed,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5799
  &builtin_fallback,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5800
  &builtin_find,
6448
dfd58b2129f6 PSARC 2008/201 Grub Findroot
vikram
parents: 6423
diff changeset
  5801
  &builtin_findroot,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5802
#ifdef SUPPORT_GRAPHICS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5803
  &builtin_foreground,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5804
#endif
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5805
  &builtin_fstest,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5806
  &builtin_geometry,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5807
  &builtin_halt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5808
  &builtin_help,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5809
  &builtin_hiddenmenu,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5810
  &builtin_hide,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5811
#ifdef SUPPORT_NETBOOT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5812
  &builtin_ifconfig,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5813
#endif /* SUPPORT_NETBOOT */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5814
  &builtin_impsprobe,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5815
  &builtin_initrd,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5816
  &builtin_install,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5817
  &builtin_ioprobe,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5818
  &builtin_kernel,
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  5819
  &builtin_kernel_dollar,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5820
  &builtin_lock,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5821
  &builtin_makeactive,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5822
  &builtin_map,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5823
#ifdef USE_MD5_PASSWORDS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5824
  &builtin_md5crypt,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5825
#endif /* USE_MD5_PASSWORDS */
7563
84ec90ffc3f7 PSARC/2008/336 Extended VTOC
Prasad Singamsetty <Prasad.Singamsetty@Sun.COM>
parents: 7549
diff changeset
  5826
  &builtin_min_mem64,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5827
  &builtin_module,
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 3039
diff changeset
  5828
  &builtin_module_dollar,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5829
  &builtin_modulenounzip,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5830
  &builtin_pager,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5831
  &builtin_partnew,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5832
  &builtin_parttype,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5833
  &builtin_password,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5834
  &builtin_pause,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5835
#if defined(RPC_DEBUG) && defined(SUPPORT_NETBOOT)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5836
  &builtin_portmap,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5837
#endif /* RPC_DEBUG && SUPPORT_NETBOOT */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5838
#ifdef GRUB_UTIL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5839
  &builtin_quit,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5840
#endif /* GRUB_UTIL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5841
#ifdef SUPPORT_NETBOOT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5842
  &builtin_rarp,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5843
#endif /* SUPPORT_NETBOOT */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5844
  &builtin_read,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5845
  &builtin_reboot,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5846
  &builtin_root,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5847
  &builtin_rootnoverify,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5848
  &builtin_savedefault,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5849
#ifdef SUPPORT_SERIAL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5850
  &builtin_serial,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5851
#endif /* SUPPORT_SERIAL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5852
  &builtin_setkey,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5853
  &builtin_setup,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5854
#ifdef SUPPORT_GRAPHICS
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5855
  &builtin_splashimage,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5856
#endif /* SUPPORT_GRAPHICS */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5857
#if defined(SUPPORT_SERIAL) || defined(SUPPORT_HERCULES) || defined(SUPPORT_GRAPHICS)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5858
  &builtin_terminal,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5859
#endif /* SUPPORT_SERIAL || SUPPORT_HERCULES || SUPPORT_GRAPHICS */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5860
#ifdef SUPPORT_SERIAL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5861
  &builtin_terminfo,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5862
#endif /* SUPPORT_SERIAL */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5863
  &builtin_testload,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5864
  &builtin_testvbe,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5865
#ifdef SUPPORT_NETBOOT
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5866
  &builtin_tftpserver,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5867
#endif /* SUPPORT_NETBOOT */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5868
  &builtin_timeout,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5869
  &builtin_title,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5870
  &builtin_unhide,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5871
  &builtin_uppermem,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5872
  &builtin_vbeprobe,
1372
19fa0899b5f5 6362643 GRUB graphics still not in line with unified "coolstart" branding
setje
parents: 307
diff changeset
  5873
  &builtin_verbose,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5874
  0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
  5875
};