1/*	$NetBSD: src/sys/arch/ia64/stand/ia64/ski/main.c,v 1.2 2009-07-20 04:59:04 kiyohara Exp $	*/
2
3/*-
4 * Copyright (c) 1998 Michael Smith <msmith@freebsd.org>
5 * Copyright (c) 1998,2000 Doug Rabson <dfr@freebsd.org>
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 */
29
30#include <sys/cdefs.h>
31
32#include <lib/libsa/stand.h>
33#include <lib/libsa/loadfile.h>
34
35#include "bootstrap.h"
36#include "libski.h"
37
38static int command_quit(int argc, char *argv[]);
39
40extern char bootprog_name[];
41extern char bootprog_rev[];
42
43struct bootblk_command commands[] = {
44	COMMON_COMMANDS,
45	{ "quit",	"exit the loader",	command_quit },
46	{ NULL,		NULL,			NULL	     },
47};
48
49struct ski_devdesc	currdev;	/* our current device */
50struct arch_switch	archsw;		/* MI/MD interface boundary */
51
52static int
53ski_autoload(void)
54{
55
56	return (0);
57}
58
59void
60ski_main(void)
61{
62	static char malloc[512*1024];
63	int i;
64
65	/*
66	 * initialise the heap as early as possible.  Once this is done,
67	 * alloc() is usable. The stack is buried inside us, so this is
68	 * safe.
69	 */
70	setheap((void *)malloc, (void *)(malloc + 512*1024));
71
72	/*
73	 * XXX Chicken-and-egg problem; we want to have console output
74	 * early, but some console attributes may depend on reading from
75	 * eg. the boot device, which we can't do yet.  We can use
76	 * printf() etc. once this is done.
77	 */
78	cons_probe();
79
80	/*
81	 * Initialise the block cache XXX: Fixme: do we need the bcache ?
82	 */
83	/*	bcache_init(32, 512);	*/	/* 16k XXX tune this */
84
85	/* Initialise skifs.c */
86
87	skifs_dev_init();
88
89	printf("\n");
90	printf("%s, Revision %s\n", bootprog_name, bootprog_rev);
91#if 0
92	printf("Memory: %ld k\n", memsize() / 1024);
93#endif
94
95	/* XXX presumes that biosdisk is first in devsw */
96	currdev.d_dev = &devsw[0];
97	currdev.d_type = DEVT_DISK;
98	currdev.d_kind.skidisk.unit = 0;
99	/* XXX should be able to detect this, default to autoprobe */
100	currdev.d_kind.skidisk.slice = -1;
101	/* default to 'a' */
102	currdev.d_kind.skidisk.partition = 0;
103
104#if 0
105	/* Create arc-specific variables */
106	bootfile = GetEnvironmentVariable(ARCENV_BOOTFILE);
107	if (bootfile)
108		setenv("bootfile", bootfile, 1);
109#endif
110
111	env_setenv("currdev", EV_VOLATILE, ski_fmtdev(&currdev),
112	    (ev_sethook_t *) ski_setcurrdev, env_nounset);
113	env_setenv("loaddev", EV_VOLATILE, ski_fmtdev(&currdev), env_noset,
114	    env_nounset);
115
116	setenv("LINES", "24", 1);	/* optional */
117
118	archsw.arch_autoload = ski_autoload;
119	archsw.arch_getdev = ski_getdev;
120	archsw.arch_copyin = ski_copyin;
121	archsw.arch_copyout = ski_copyout;
122	archsw.arch_readin = ski_readin;
123
124	interact();			/* doesn't return */
125
126	exit(0);
127}
128
129static int
130command_quit(int argc, char *argv[])
131{
132	exit(0);
133	return (CMD_OK);
134}
135