1*beb929a9Schuck /* $NetBSD: sboot.c,v 1.7 2011/02/02 17:53:41 chuck Exp $ */
2015e898cSperry
30b036e11Schuck /*
40b036e11Schuck * Copyright (c) 1995 Charles D. Cranor and Seth Widoff
50b036e11Schuck * All rights reserved.
60b036e11Schuck *
70b036e11Schuck * Redistribution and use in source and binary forms, with or without
80b036e11Schuck * modification, are permitted provided that the following conditions
90b036e11Schuck * are met:
100b036e11Schuck * 1. Redistributions of source code must retain the above copyright
110b036e11Schuck * notice, this list of conditions and the following disclaimer.
120b036e11Schuck * 2. Redistributions in binary form must reproduce the above copyright
130b036e11Schuck * notice, this list of conditions and the following disclaimer in the
140b036e11Schuck * documentation and/or other materials provided with the distribution.
150b036e11Schuck *
160b036e11Schuck * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
170b036e11Schuck * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
180b036e11Schuck * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
190b036e11Schuck * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
200b036e11Schuck * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
210b036e11Schuck * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
220b036e11Schuck * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
230b036e11Schuck * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
240b036e11Schuck * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
250b036e11Schuck * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
260b036e11Schuck */
270b036e11Schuck /*
280b036e11Schuck * main driver, plus machdep stuff
290b036e11Schuck */
300b036e11Schuck
310b036e11Schuck #include "sboot.h"
320b036e11Schuck
33921705c3Sjdolecek void sboot(void);
340b036e11Schuck
35921705c3Sjdolecek extern char bootprog_rev[];
36921705c3Sjdolecek
37921705c3Sjdolecek void
sboot(void)38a07f7c80Stsutsui sboot(void)
390b036e11Schuck {
40b416b21aSchuck char buf[128], *ebuf;
41a07f7c80Stsutsui
420b036e11Schuck buf[0] = '0';
430b036e11Schuck consinit();
44a07f7c80Stsutsui printf("\nsboot: serial line bootstrap program (&end = %p) [%s]\n\n",
45a07f7c80Stsutsui &end, bootprog_rev);
460b036e11Schuck if (reboot) { /* global flag from AAstart.s */
470b036e11Schuck reboot = 0;
480b036e11Schuck printf("[rebooting...]\n");
49b416b21aSchuck buf[0] = 'b';
50b416b21aSchuck buf[1] = 0;
51b416b21aSchuck do_cmd(buf, &buf[1]);
520b036e11Schuck }
53a07f7c80Stsutsui for (;;) {
540b036e11Schuck printf(">>> ");
55b416b21aSchuck ebuf = ngets(buf, sizeof(buf));
56b416b21aSchuck do_cmd(buf, ebuf);
570b036e11Schuck }
580b036e11Schuck /* not reached */
590b036e11Schuck }
600b036e11Schuck
610b036e11Schuck /*
620b036e11Schuck * exit to rom
630b036e11Schuck */
640b036e11Schuck
65a07f7c80Stsutsui void
callrom(void)66a07f7c80Stsutsui callrom(void)
670b036e11Schuck {
68a07f7c80Stsutsui
692d65de24Sperry __asm("trap #15; .word 0x0063");
700b036e11Schuck }
710b036e11Schuck
720b036e11Schuck /*
730b036e11Schuck * do_cmd: do a command
740b036e11Schuck */
750b036e11Schuck
76a07f7c80Stsutsui void
do_cmd(char * buf,char * ebuf)77a07f7c80Stsutsui do_cmd(char *buf, char *ebuf)
780b036e11Schuck {
79a07f7c80Stsutsui
800b036e11Schuck switch (*buf) {
810b036e11Schuck case '\0':
820b036e11Schuck return;
830b036e11Schuck case 'a':
840b036e11Schuck if (rev_arp()) {
85a07f7c80Stsutsui printf("My ip address is: %d.%d.%d.%d\n",
86a07f7c80Stsutsui myip[0], myip[1], myip[2], myip[3]);
87a07f7c80Stsutsui printf("Server ip address is: %d.%d.%d.%d\n",
88a07f7c80Stsutsui servip[0], servip[1], servip[2], servip[3]);
890b036e11Schuck } else {
900b036e11Schuck printf("Failed.\n");
910b036e11Schuck }
920b036e11Schuck return;
930b036e11Schuck case 'e':
940b036e11Schuck printf("exiting to ROM\n");
950b036e11Schuck callrom();
960b036e11Schuck return;
970b036e11Schuck case 'f':
980b036e11Schuck if (do_get_file() == 1) {
990b036e11Schuck printf("Download Failed\n");
1000b036e11Schuck } else {
1010b036e11Schuck printf("Download was a success!\n");
1020b036e11Schuck }
1030b036e11Schuck return;
1040b036e11Schuck case 'b':
1050b036e11Schuck le_init();
1060b036e11Schuck if (rev_arp()) {
107a07f7c80Stsutsui printf("My ip address is: %d.%d.%d.%d\n",
108a07f7c80Stsutsui myip[0], myip[1], myip[2], myip[3]);
109a07f7c80Stsutsui printf("Server ip address is: %d.%d.%d.%d\n",
110a07f7c80Stsutsui servip[0], servip[1], servip[2], servip[3]);
1110b036e11Schuck } else {
1120b036e11Schuck printf("REVARP: Failed.\n");
1130b036e11Schuck return;
1140b036e11Schuck }
1150b036e11Schuck if (do_get_file() == 1) {
1160b036e11Schuck printf("Download Failed\n");
1170b036e11Schuck return;
1180b036e11Schuck } else {
1190b036e11Schuck printf("Download was a success!\n");
1200b036e11Schuck }
121b416b21aSchuck /*FALLTHROUGH*/
122b416b21aSchuck case 'g':
123b416b21aSchuck printf("Start @ 0x%x ... \n", LOAD_ADDR);
124b416b21aSchuck go(LOAD_ADDR, buf+1, ebuf);
1250b036e11Schuck return;
1260b036e11Schuck case 'h':
1270b036e11Schuck case '?':
1280b036e11Schuck printf("valid commands\n");
1290b036e11Schuck printf("a - send a RARP\n");
1300b036e11Schuck printf("b - boot the system\n");
1310b036e11Schuck printf("e - exit to ROM\n");
1320b036e11Schuck printf("f - ftp the boot file\n");
1330b036e11Schuck printf("g - execute the boot file\n");
1340b036e11Schuck printf("h - help\n");
1350b036e11Schuck printf("i - init LANCE enet chip\n");
1360b036e11Schuck return;
1370b036e11Schuck case 'i':
1380b036e11Schuck le_init();
1390b036e11Schuck return;
1400b036e11Schuck default:
1410b036e11Schuck printf("sboot: %s: Unknown command\n", buf);
1420b036e11Schuck }
1430b036e11Schuck }
144