usr/src/psm/stand/cpr/sparcv9/sun4u/cprboot.c
author gw25295
Fri, 11 Apr 2008 18:36:28 -0700
changeset 6423 437422a29d3a
parent 5648 161f8007cab9
child 7632 91aa3d8541b5
permissions -rw-r--r--
PSARC 2006/370 ZFS Boot Support 5008936 ZFS and/or zvol should support dumps 5070124 dumpadm -d /dev/... does not enforce block device requirement for savecore 6521468 ZFS Boot support Phase 2 6553503 bfu can't find 'rootdev' from /etc/vfstab on a zfs root filesystem 6574993 zfs_mountroot() may need to call clkset() to set the boot_time kstat 6633197 zvol should not permit newfs or createpool while it's in use by swap or dump 6661127 zfs_name_valid() does not support ZFS_TYPE_POOL 6684121 The changes to smf scripts for supporting canmount=noauto will cause a boot failure.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     1
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     2
 * CDDL HEADER START
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     3
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 785
diff changeset
     5
 * Common Development and Distribution License (the "License").
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 785
diff changeset
     6
 * You may not use this file except in compliance with the License.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     7
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    11
 * and limitations under the License.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    12
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    18
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    19
 * CDDL HEADER END
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    20
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    21
/*
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5648
diff changeset
    22
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    23
 * Use is subject to license terms.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    24
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    25
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    26
#pragma ident	"%Z%%M%	%I%	%E% SMI"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    27
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    28
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    29
 * cprboot - prom client that restores kadb/kernel pages
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    30
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    31
 * simple cprboot overview:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    32
 *	reset boot-file/boot-device to their original values
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    33
 * 	open cpr statefile, usually "/.CPR"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    34
 *	read in statefile
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    35
 *	close statefile
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    36
 *	restore kernel pages
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    37
 *	jump back into kernel text
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    38
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    39
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    40
 * cprboot supports a restartable statefile for FAA/STARS,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    41
 * Federal Aviation Administration
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    42
 * Standard Terminal Automation Replacement System
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    43
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    44
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    45
#include <sys/types.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    46
#include <sys/cpr.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    47
#include <sys/promimpl.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    48
#include <sys/ddi.h>
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    49
#include "cprboot.h"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    50
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5648
diff changeset
    51
char *volname = NULL;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    52
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    53
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    54
 * local defs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    55
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    56
#define	CB_MAXPROP	256
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    57
#define	CB_MAXARGS	8
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    58
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    59
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    60
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    61
 * globals
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    62
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    63
struct statefile sfile;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    64
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    65
char cpr_statefile[OBP_MAXPATHLEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    66
char cpr_filesystem[OBP_MAXPATHLEN];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    67
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    68
int cpr_debug;				/* cpr debug, set with uadmin 3 10x */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    69
uint_t cb_msec;				/* cprboot start runtime */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    70
uint_t cb_dents;			/* number of dtlb entries */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    71
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    72
int do_halt = 0;			/* halt (enter mon) after load */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    73
int verbose = 0;			/* verbose, traces cprboot ops */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    74
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    75
char rsvp[] = "please reboot";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    76
char prog[] = "cprboot";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    77
char entry[] = "ENTRY";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    78
char ent_fmt[] = "\n%s %s\n";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    79
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    80
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    81
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    82
 * file scope
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    83
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    84
static char cb_argbuf[CB_MAXPROP];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    85
static char *cb_args[CB_MAXARGS];
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    86
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    87
static int reusable;
5648
161f8007cab9 6521412 PSARC 2006/525: new boot sparc
setje
parents: 3446
diff changeset
    88
char *specialstate;
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    89
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    90
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    91
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    92
cb_intro(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    93
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    94
	static char cstr[] = "\014" "\033[1P" "\033[18;21H";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    95
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    96
	CB_VENTRY(cb_intro);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    97
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    98
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
    99
	 * build/debug aid; this condition should not occur
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   100
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   101
	if ((uintptr_t)_end > CB_SRC_VIRT) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   102
		prom_printf("\ndata collision:\n"
785
a0797646b335 6310483 boot needs some more help for gcc on SPARC
eota
parents: 0
diff changeset
   103
		    "(_end=0x%p > CB_LOW_VIRT=0x%x), recompile...\n",
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   104
		    _end, CB_SRC_VIRT);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   105
		return (ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   106
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   107
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   108
	/* clear console */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   109
	prom_printf(cstr);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   110
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   111
	prom_printf("Restoring the System. Please Wait... ");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   112
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   113
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   114
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   115
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   116
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   117
 * read bootargs and convert to arg vector
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   118
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   119
 * sets globals:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   120
 *	cb_argbuf
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   121
 *	cb_args
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   122
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   123
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   124
get_bootargs(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   125
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   126
	char *cp, *tail, *argp, **argv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   127
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   128
	CB_VENTRY(get_bootargs);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   129
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   130
	(void) prom_strcpy(cb_argbuf, prom_bootargs());
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   131
	tail = cb_argbuf + prom_strlen(cb_argbuf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   132
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   133
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   134
	 * scan to the trailing NULL so the last arg
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   135
	 * will be found without any special-case code
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   136
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   137
	argv = cb_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   138
	for (cp = argp = cb_argbuf; cp <= tail; cp++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   139
		if (prom_strchr(" \t\n\r", *cp) == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   140
			continue;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   141
		*cp = '\0';
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   142
		if (cp - argp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   143
			*argv++ = argp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   144
			if ((argv - cb_args) == (CB_MAXARGS - 1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   145
				break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   146
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   147
		argp = cp + 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   148
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   149
	*argv = NULLP;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   150
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   151
	if (verbose) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   152
		for (argv = cb_args; *argv; argv++) {
785
a0797646b335 6310483 boot needs some more help for gcc on SPARC
eota
parents: 0
diff changeset
   153
			prom_printf("    %ld: \"%s\"\n",
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   154
			    (argv - cb_args), *argv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   155
		}
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
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   160
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   161
usage(char *expect, char *got)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   162
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   163
	if (got == NULL)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   164
		got = "(NULL)";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   165
	prom_printf("\nbad OBP boot args: expect %s, got %s\n"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   166
	    "Usage: boot -F %s [-R] [-S <diskpath>]\n%s\n\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   167
	    expect, got, prog, rsvp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   168
	prom_exit_to_mon();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   169
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   170
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   171
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   172
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   173
 * bootargs should start with "-F cprboot"
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   174
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   175
 * may set globals:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   176
 *	specialstate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   177
 *	reusable
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   178
 *	do_halt
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   179
 *	verbose
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   180
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   181
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   182
check_bootargs(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   183
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   184
	char **argv, *str, *cp;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   185
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   186
	argv = cb_args;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   187
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   188
	/* expect "-F" */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   189
	str = "-F";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   190
	if (*argv == NULL || prom_strcmp(*argv, str))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   191
		usage(str, *argv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   192
	argv++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   193
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   194
	/* expect "cprboot*" */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   195
	if (*argv == NULL || prom_strncmp(*argv, prog, sizeof (prog) - 1))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   196
		usage(prog, *argv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   197
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   198
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   199
	 * optional args
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   200
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   201
	str = "-[SR]";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   202
	for (argv++; *argv; argv++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   203
		cp = *argv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   204
		if (*cp != '-')
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   205
			usage(str, *argv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   206
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   207
		switch (*++cp) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   208
		case 'R':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   209
		case 'r':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   210
			reusable = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   211
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   212
		case 'S':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   213
		case 's':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   214
			if (*++argv)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   215
				specialstate = *argv;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   216
			else
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   217
				usage("statefile-path", *argv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   218
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   219
		case 'h':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   220
			do_halt = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   221
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   222
		case 'v':
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   223
			verbose = 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   224
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   225
		default:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   226
			usage(str, *argv);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   227
			break;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   228
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   229
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   230
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   231
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   232
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   233
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   234
 * reset prom props and get statefile info
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   235
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   236
 * sets globals:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   237
 *	cpr_filesystem
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   238
 *	cpr_statefile
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   239
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   240
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   241
cb_startup(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   242
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   243
	CB_VENTRY(cb_startup);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   244
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   245
	if (!reusable) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   246
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   247
		 * Restore the original values of the nvram properties modified
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   248
		 * during suspend.  Note: if we can't get this info from the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   249
		 * defaults file, the state file may be obsolete or bad, so we
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   250
		 * abort.  However, failure to restore one or more properties
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   251
		 * is NOT fatal (better to continue the resume).
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   252
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   253
		if (cpr_reset_properties() == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   254
			prom_printf("\n%s: cannot read saved "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   255
			    "nvram info, %s\n", prog, rsvp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   256
			return (ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   257
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   258
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   259
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   260
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   261
	 * simple copy if using specialstate,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   262
	 * otherwise read in fs and statefile from a config file
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   263
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   264
	if (specialstate)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   265
		(void) prom_strcpy(cpr_statefile, specialstate);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   266
	else if (cpr_locate_statefile(cpr_statefile, cpr_filesystem) == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   267
		prom_printf("\n%s: cannot find cpr statefile, %s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   268
		    prog, rsvp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   269
		return (ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   270
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   271
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   272
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   273
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   274
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   275
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   276
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   277
cb_open_sf(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   278
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   279
	CB_VENTRY(cb_open_sf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   280
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   281
	sfile.fd = cpr_statefile_open(cpr_statefile, cpr_filesystem);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   282
	if (sfile.fd == -1) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   283
		prom_printf("\n%s: can't open %s", prog, cpr_statefile);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   284
		if (specialstate)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   285
			prom_printf(" on %s", cpr_filesystem);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   286
		prom_printf("\n%s\n", rsvp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   287
		return (ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   288
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   289
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   290
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   291
	 * for block devices, seek past the disk label and bootblock
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   292
	 */
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5648
diff changeset
   293
	if (volname)
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5648
diff changeset
   294
		(void) cpr_fs_seek(sfile.fd, CPR_SPEC_OFFSET);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5648
diff changeset
   295
	else if (specialstate)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   296
		(void) prom_seek(sfile.fd, CPR_SPEC_OFFSET);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   297
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   298
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   299
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   300
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   301
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   302
cb_close_sf(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   303
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   304
	CB_VENTRY(cb_close_sf);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   305
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   306
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   307
	 * close the device so the prom will free up 20+ pages
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   308
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   309
	(void) cpr_statefile_close(sfile.fd);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   310
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   311
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   312
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   313
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   314
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   315
 * to restore kernel pages, we have to open a prom device to read-in
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   316
 * the statefile contents; a prom "open" request triggers the driver
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   317
 * and various packages to allocate 20+ pages; unfortunately, some or
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   318
 * all of those pages always clash with kernel pages, and we cant write
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   319
 * to them without corrupting the prom.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   320
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   321
 * to solve that problem, the only real solution is to close the device
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   322
 * to free up those pages; this means we need to open, read-in the entire
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   323
 * statefile, and close; and to store the statefile, we need to allocate
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   324
 * plenty of space, usually around 2 to 60 MB.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   325
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   326
 * the simplest alloc means is prom_alloc(), which will "claim" both
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   327
 * virt and phys pages, and creates mappings with a "map" request;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   328
 * "map" also causes the prom to alloc pages, and again these clash
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   329
 * with kernel pages...
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   330
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   331
 * to solve the "map" problem, we just reserve virt and phys pages and
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   332
 * manage the translations by creating our own tlb entries instead of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   333
 * relying on the prom.
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   334
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   335
 * sets globals:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   336
 *	cpr_test_mode
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   337
 *	sfile.kpages
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   338
 *	sfile.size
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   339
 * 	sfile.buf
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   340
 * 	sfile.low_ppn
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   341
 * 	sfile.high_ppn
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   342
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   343
static int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   344
cb_read_statefile(void)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   345
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   346
	size_t alsize, len, resid;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   347
	physaddr_t phys, dst_phys;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   348
	char *str, *dst_virt;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   349
	int err, cnt, mmask;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   350
	uint_t dtlb_index;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   351
	ssize_t nread;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   352
	cdd_t cdump;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   353
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   354
	str = "cb_read_statefile";
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   355
	CB_VPRINTF((ent_fmt, str, entry));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   356
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   357
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   358
	 * read-in and check cpr dump header
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   359
	 */
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5648
diff changeset
   360
	if (cpr_read_cdump(sfile.fd, &cdump, CPR_MACHTYPE_4U) == -1)
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   361
		return (ERR);
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5648
diff changeset
   362
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   363
	if (cpr_debug)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   364
		prom_printf("\n");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   365
	cb_nbitmaps = cdump.cdd_bitmaprec;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   366
	cpr_test_mode = cdump.cdd_test_mode;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   367
	sfile.kpages = cdump.cdd_dumppgsize;
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 785
diff changeset
   368
	CPR_DEBUG(CPR_DEBUG4, "%s: total kpages %d\n", prog, sfile.kpages);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   369
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   370
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   371
	 * alloc virt and phys space with 512K alignment;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   372
	 * alloc size should be (n * tte size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   373
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   374
	sfile.size = PAGE_ROUNDUP(cdump.cdd_filesize);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   375
	alsize = (cdump.cdd_filesize + MMU_PAGEOFFSET512K) &
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   376
	    MMU_PAGEMASK512K;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   377
	phys = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   378
	err = cb_alloc(alsize, MMU_PAGESIZE512K, &sfile.buf, &phys);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   379
	CB_VPRINTF(("%s:\n    alloc size 0x%lx, buf size 0x%lx\n"
785
a0797646b335 6310483 boot needs some more help for gcc on SPARC
eota
parents: 0
diff changeset
   380
	    "    virt 0x%p, phys 0x%llx\n",
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   381
	    str, alsize, sfile.size, sfile.buf, phys));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   382
	if (err) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   383
		prom_printf("%s: cant alloc statefile buf, size 0x%lx\n%s\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   384
		    str, sfile.size, rsvp);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   385
		return (ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   386
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   387
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   388
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   389
	 * record low and high phys page numbers for sfile.buf
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   390
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   391
	sfile.low_ppn = ADDR_TO_PN(phys);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   392
	sfile.high_ppn = sfile.low_ppn + mmu_btop(sfile.size) - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   393
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   394
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   395
	 * setup destination virt and phys addrs for reads;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   396
	 * mapin-mask tells when to create a new tlb entry for the
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   397
	 * next set of reads;  NB: the read and tlb method needs
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   398
	 * ((big-pagesize % read-size) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   399
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   400
	dst_phys = phys;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   401
	mmask = (MMU_PAGESIZE512K / PROM_MAX_READ) - 1;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   402
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   403
	cnt = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   404
	dtlb_index = cb_dents - 1;
6423
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5648
diff changeset
   405
	if (volname)
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5648
diff changeset
   406
		(void) cpr_fs_seek(sfile.fd, CPR_SPEC_OFFSET);
437422a29d3a PSARC 2006/370 ZFS Boot Support
gw25295
parents: 5648
diff changeset
   407
	else if (specialstate)
5648
161f8007cab9 6521412 PSARC 2006/525: new boot sparc
setje
parents: 3446
diff changeset
   408
		(void) prom_seek(sfile.fd, CPR_SPEC_OFFSET);
161f8007cab9 6521412 PSARC 2006/525: new boot sparc
setje
parents: 3446
diff changeset
   409
	else
161f8007cab9 6521412 PSARC 2006/525: new boot sparc
setje
parents: 3446
diff changeset
   410
		(void) cpr_fs_seek(sfile.fd, 0);
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 785
diff changeset
   411
	CPR_DEBUG(CPR_DEBUG1, "%s: reading statefile... ", prog);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   412
	for (resid = cdump.cdd_filesize; resid; resid -= len) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   413
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   414
		 * do a full spin (4 spin chars)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   415
		 * for every MB read (8 reads = 256K)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   416
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   417
		if ((cnt & 0x7) == 0)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   418
			cb_spin();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   419
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   420
		/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   421
		 * map-in statefile buf pages in 512K blocks;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   422
		 * see MMU_PAGESIZE512K above
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   423
		 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   424
		if ((cnt & mmask) == 0) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   425
			dst_virt = sfile.buf;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   426
			cb_mapin(dst_virt, ADDR_TO_PN(dst_phys),
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   427
			    TTE512K, TTE_HWWR_INT, dtlb_index);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   428
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   429
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   430
		cnt++;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   431
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   432
		len = min(PROM_MAX_READ, resid);
5648
161f8007cab9 6521412 PSARC 2006/525: new boot sparc
setje
parents: 3446
diff changeset
   433
		nread = cpr_read(sfile.fd, dst_virt, len);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   434
		if (nread != (ssize_t)len) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   435
			prom_printf("\n%s: prom read error, "
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   436
			    "expect %ld, got %ld\n", str, len, nread);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   437
			return (ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   438
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   439
		dst_virt += len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   440
		dst_phys += len;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   441
	}
3446
5903aece022d PSARC 2006/469 EOF and removal of eeprom -I
mrj
parents: 785
diff changeset
   442
	CPR_DEBUG(CPR_DEBUG1, " \b\n");
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   443
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   444
	/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   445
	 * free up any unused phys pages trailing the statefile buffer;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   446
	 * these pages will later appear on the physavail list
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   447
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   448
	if (alsize > sfile.size) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   449
		len = alsize - sfile.size;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   450
		prom_free_phys(len, phys + sfile.size);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   451
		CB_VPRINTF(("%s: freed %ld phys pages (0x%lx - 0x%lx)\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   452
		    str, mmu_btop(len), phys + sfile.size, phys + alsize));
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   453
	}
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
	 * start the statefile buffer offset at the base of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   457
	 * the statefile buffer and skip past the dump header
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   458
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   459
	sfile.buf_offset = 0;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   460
	SF_ADV(sizeof (cdump));
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
	 * finish with the first block mapped-in to provide easy virt access
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   464
	 * to machdep structs and the bitmap; for 2.8, the combined size of
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   465
	 * (cdd_t + cmd_t + csu_md_t + prom_words + cbd_t) is about 1K,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   466
	 * leaving room for a bitmap representing nearly 32GB
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   467
	 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   468
	cb_mapin(sfile.buf, sfile.low_ppn,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   469
	    TTE512K, TTE_HWWR_INT, dtlb_index);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   470
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   471
	return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   472
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   473
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   474
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   475
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   476
 * cprboot first stage worklist
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   477
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   478
static int (*first_worklist[])(void) = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   479
	cb_intro,
5648
161f8007cab9 6521412 PSARC 2006/525: new boot sparc
setje
parents: 3446
diff changeset
   480
	cb_mountroot,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   481
	cb_startup,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   482
	cb_get_props,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   483
	cb_usb_setup,
5648
161f8007cab9 6521412 PSARC 2006/525: new boot sparc
setje
parents: 3446
diff changeset
   484
	cb_unmountroot,
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   485
	cb_open_sf,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   486
	cb_read_statefile,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   487
	cb_close_sf,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   488
	cb_check_machdep,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   489
	cb_interpret,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   490
	cb_get_physavail,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   491
	cb_set_bitmap,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   492
	cb_get_newstack,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   493
	NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   494
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   495
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   496
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   497
 * cprboot second stage worklist
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   498
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   499
static int (*second_worklist[])(void) = {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   500
	cb_relocate,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   501
	cb_tracking_setup,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   502
	cb_restore_kpages,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   503
	cb_terminator,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   504
	cb_ksetup,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   505
	cb_mpsetup,
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   506
	NULL
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   507
};
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   508
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   509
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   510
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   511
 * simple loop driving major cprboot operations;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   512
 * exits to prom if any error is returned
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   513
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   514
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   515
cb_drive(int (**worklist)(void))
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   516
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   517
	int i;
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   518
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   519
	for (i = 0; worklist[i] != NULL; i++) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   520
		if (worklist[i]())
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   521
			cb_exit_to_mon();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   522
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   523
}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   524
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   525
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   526
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   527
 * debugging support: drop to prom if do_halt is set
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   528
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   529
static void
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   530
check_halt(char *str)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   531
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   532
	if (do_halt) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   533
		prom_printf("\n%s halted by -h flag\n==> before %s\n\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   534
		    prog, str);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   535
		cb_enter_mon();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   536
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   537
}
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
/*
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   541
 * main is called twice from "cb_srt0.s", args are:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   542
 *	cookie	  ieee1275 cif handle
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   543
 *	first	  (true): first stage, (false): second stage
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   544
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   545
 * first stage summary:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   546
 *	various setup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   547
 *	allocate a big statefile buffer
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   548
 *	read in the statefile
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   549
 *	setup the bitmap
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   550
 *	create a new stack
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   551
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   552
 * return to "cb_srt0.s", switch to new stack
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   553
 *
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   554
 * second stage summary:
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   555
 *	relocate cprboot phys pages
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   556
 *	setup tracking for statefile buffer pages
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   557
 *	restore kernel pages
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   558
 *	various cleanup
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   559
 *	install tlb entries for the nucleus and cpr module
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   560
 *	restore registers and jump into cpr module
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   561
 */
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   562
int
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   563
main(void *cookie, int first)
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   564
{
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   565
	if (first) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   566
		prom_init(prog, cookie);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   567
		cb_msec = prom_gettime();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   568
		get_bootargs();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   569
		check_bootargs();
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   570
		check_halt("first_worklist");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   571
		cb_drive(first_worklist);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   572
		return (0);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   573
	} else {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   574
		cb_drive(second_worklist);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   575
		if (verbose || CPR_DBG(1)) {
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   576
			prom_printf("%s: milliseconds %d\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   577
			    prog, prom_gettime() - cb_msec);
785
a0797646b335 6310483 boot needs some more help for gcc on SPARC
eota
parents: 0
diff changeset
   578
			prom_printf("%s: resume pc 0x%lx\n",
a0797646b335 6310483 boot needs some more help for gcc on SPARC
eota
parents: 0
diff changeset
   579
			    prog, mdinfo.func);
0
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   580
			prom_printf("%s: exit_to_kernel(0x%p, 0x%p)\n\n",
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   581
			    prog, cookie, &mdinfo);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   582
		}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   583
		check_halt("exit_to_kernel");
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   584
		exit_to_kernel(cookie, &mdinfo);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   585
		return (ERR);
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   586
	}
68f95e015346 OpenSolaris Launch
stevel@tonic-gate
parents:
diff changeset
   587
}