1*f0a7346dSsnj /* $NetBSD: loadbsd.c,v 1.22 2014/10/18 08:33:25 snj Exp $ */
28b0113cfSleo
38b0113cfSleo /*
48b0113cfSleo * Copyright (c) 1995 L. Weppelman
58b0113cfSleo * All rights reserved.
68b0113cfSleo *
78b0113cfSleo * Redistribution and use in source and binary forms, with or without
88b0113cfSleo * modification, are permitted provided that the following conditions
98b0113cfSleo * are met:
108b0113cfSleo * 1. Redistributions of source code must retain the above copyright
118b0113cfSleo * notice, this list of conditions and the following disclaimer.
128b0113cfSleo * 2. Redistributions in binary form must reproduce the above copyright
138b0113cfSleo * notice, this list of conditions and the following disclaimer in the
148b0113cfSleo * documentation and/or other materials provided with the distribution.
158b0113cfSleo *
168b0113cfSleo * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
178b0113cfSleo * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
188b0113cfSleo * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
198b0113cfSleo * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
208b0113cfSleo * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
218b0113cfSleo * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
228b0113cfSleo * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
238b0113cfSleo * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
248b0113cfSleo * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
258b0113cfSleo * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
268b0113cfSleo */
278b0113cfSleo
288b0113cfSleo /*
298b0113cfSleo * NetBSD loader for the Atari-TT.
308b0113cfSleo */
318b0113cfSleo
328b0113cfSleo #include <fcntl.h>
33783817ccSleo #include <stdio.h>
348b0113cfSleo #include <osbind.h>
358b0113cfSleo #include <stdarg.h>
36783817ccSleo #include <stdlib.h>
37783817ccSleo #include <string.h>
38783817ccSleo #include <unistd.h>
39783817ccSleo #include "libtos.h"
40d6d66d66Sleo #include "tosdefs.h"
4113a1055eSleo #include "cread.h"
427a4fed29Sleo
438b0113cfSleo char *Progname; /* How are we called */
448b093b18Sleo int d_flag = 0; /* Output debugging output? */
45783817ccSleo int h_flag = 0; /* show help */
46984d919cSleo int N_flag = 0; /* No symbols? */
478b093b18Sleo int s_flag = 0; /* St-ram only */
48783817ccSleo int t_flag = 0; /* Just test, do not execute */
49783817ccSleo int v_flag = 0; /* show version */
508b0113cfSleo
51*f0a7346dSsnj const char version[] = "$Revision: 1.22 $";
528b0113cfSleo
538b0113cfSleo /*
548b0113cfSleo * Default name of kernel to boot, large enough to patch
558b0113cfSleo */
568b0113cfSleo char kname[80] = "n:/netbsd";
578b0113cfSleo
58d6d66d66Sleo static osdsc_t kernelparms;
598b0113cfSleo
60783817ccSleo void help PROTO((void));
61783817ccSleo void usage PROTO((void));
62d6d66d66Sleo void get_sys_info PROTO((osdsc_t *));
63d6d66d66Sleo void start_kernel PROTO((osdsc_t *));
648b0113cfSleo
65783817ccSleo int
main(int argc,char ** argv)66454af1c0Sdsl main(int argc, char **argv)
678b0113cfSleo {
688b0113cfSleo /*
698b0113cfSleo * Option parsing
708b0113cfSleo */
718b0113cfSleo extern int optind;
728b0113cfSleo extern char *optarg;
73d6d66d66Sleo int ch, err;
74d6d66d66Sleo char *errmsg;
758b0113cfSleo int fd;
76d6d66d66Sleo osdsc_t *od;
778b0113cfSleo
78783817ccSleo init_toslib(argv[0]);
798b0113cfSleo Progname = argv[0];
808b0113cfSleo
81d6d66d66Sleo od = &kernelparms;
82d6d66d66Sleo od->boothowto = RB_SINGLE;
838b0113cfSleo
84984d919cSleo while ((ch = getopt(argc, argv, "abdDhNstVwo:S:T:")) != -1) {
858b0113cfSleo switch (ch) {
868b0113cfSleo case 'a':
87d6d66d66Sleo od->boothowto &= ~(RB_SINGLE);
88d6d66d66Sleo od->boothowto |= RB_AUTOBOOT;
898b0113cfSleo break;
908b0113cfSleo case 'b':
91d6d66d66Sleo od->boothowto |= RB_ASKNAME;
928b0113cfSleo break;
938b0113cfSleo case 'd':
94d6d66d66Sleo od->boothowto |= RB_KDB;
958b0113cfSleo break;
968b093b18Sleo case 'D':
978b093b18Sleo d_flag = 1;
988b093b18Sleo break;
99783817ccSleo case 'h':
100783817ccSleo h_flag = 1;
101783817ccSleo break;
102984d919cSleo case 'N':
103984d919cSleo N_flag = 1;
104984d919cSleo break;
105783817ccSleo case 'o':
106783817ccSleo redirect_output(optarg);
107783817ccSleo break;
1088b093b18Sleo case 's':
1098b093b18Sleo s_flag = 1;
1108b093b18Sleo break;
1118b093b18Sleo case 'S':
112d6d66d66Sleo od->stmem_size = atoi(optarg);
1138b093b18Sleo break;
1148b0113cfSleo case 't':
1158b0113cfSleo t_flag = 1;
1168b0113cfSleo break;
117176d4dd6Sleo case 'T':
118d6d66d66Sleo od->ttmem_size = atoi(optarg);
119176d4dd6Sleo break;
120783817ccSleo case 'V':
121783817ccSleo v_flag = 1;
1228b0113cfSleo break;
123783817ccSleo case 'w':
124783817ccSleo set_wait_for_key();
125783817ccSleo break;
1268b0113cfSleo default:
1278b0113cfSleo usage();
1288b0113cfSleo }
1298b0113cfSleo }
1308b0113cfSleo argc -= optind;
1318b0113cfSleo argv += optind;
1328b0113cfSleo if (argc == 1)
1338b0113cfSleo strcpy(kname, argv[0]);
1348b0113cfSleo
135783817ccSleo if (h_flag)
136783817ccSleo help();
137783817ccSleo if (v_flag)
138783817ccSleo eprintf("%s\r\n", version);
139783817ccSleo
1408b0113cfSleo /*
1414458e460Sleo * Get system info to pass to NetBSD
1428b0113cfSleo */
143d6d66d66Sleo get_sys_info(od);
144d6d66d66Sleo if (d_flag) {
145d6d66d66Sleo eprintf("Machine info:\r\n");
146d6d66d66Sleo eprintf("ST-RAM size\t: %10d bytes\r\n",od->stmem_size);
147d6d66d66Sleo eprintf("TT-RAM size\t: %10d bytes\r\n",od->ttmem_size);
148d6d66d66Sleo eprintf("TT-RAM start\t: 0x%08x\r\n", od->ttmem_start);
149d6d66d66Sleo eprintf("Cpu-type\t: 0x%08x\r\n", od->cputype);
150d6d66d66Sleo }
1518b0113cfSleo
1528b0113cfSleo /*
153*f0a7346dSsnj * Find the kernel to boot and read its exec-header
1548b0113cfSleo */
1558b0113cfSleo if ((fd = open(kname, O_RDONLY)) < 0)
156783817ccSleo fatal(-1, "Cannot open kernel '%s'", kname);
157d6d66d66Sleo if ((err = elf_load(fd, od, &errmsg, !N_flag)) == -1) {
158d6d66d66Sleo /*
159d6d66d66Sleo * Not ELF, try a.out
160d6d66d66Sleo */
161d6d66d66Sleo if (err = aout_load(fd, od, &errmsg, !N_flag)) {
162d6d66d66Sleo if (err == -1)
163d6d66d66Sleo errmsg = "Not an ELF or NMAGIC file '%s'";
164d6d66d66Sleo fatal(-1, errmsg, kname);
165d6d66d66Sleo }
166d6d66d66Sleo }
167d6d66d66Sleo else {
168d6d66d66Sleo if (err)
169d6d66d66Sleo fatal(-1, errmsg);
170d6d66d66Sleo }
171d6d66d66Sleo
172984d919cSleo close(fd);
173984d919cSleo
174984d919cSleo if (d_flag) {
175984d919cSleo eprintf("\r\nKernel info:\r\n");
176d6d66d66Sleo eprintf("Kernel loadaddr\t: 0x%08x\r\n", od->kstart);
177d6d66d66Sleo eprintf("Kernel size\t: %10d bytes\r\n", od->ksize);
178d6d66d66Sleo eprintf("Kernel entry\t: 0x%08x\r\n", od->kentry);
179d6d66d66Sleo eprintf("Kernel esym\t: 0x%08x\r\n", od->k_esym);
180984d919cSleo }
181984d919cSleo
182984d919cSleo if (!t_flag)
183d6d66d66Sleo start_kernel(od);
184984d919cSleo /* NOT REACHED */
185984d919cSleo
186984d919cSleo eprintf("Kernel '%s' was loaded OK\r\n", kname);
187984d919cSleo xexit(0);
188984d919cSleo return 0;
189984d919cSleo }
190984d919cSleo
191783817ccSleo void
get_sys_info(osdsc_t * od)192454af1c0Sdsl get_sys_info(osdsc_t *od)
1938b0113cfSleo {
1948b0113cfSleo long stck;
1958b0113cfSleo
1968b0113cfSleo stck = Super(0);
1978b0113cfSleo
198d6d66d66Sleo sys_info(od);
199633db03bSleo
200d6d66d66Sleo if (!(od->cputype & ATARI_ANYCPU))
201783817ccSleo fatal(-1, "Cannot determine CPU-type");
2028b0113cfSleo
203783817ccSleo (void)Super(stck);
204d6d66d66Sleo if (s_flag)
205d6d66d66Sleo od->ttmem_size = od->ttmem_start = 0;
2068b0113cfSleo }
2078b0113cfSleo
208783817ccSleo void
help(void)209df7f595eScegger help(void)
2108b0113cfSleo {
211783817ccSleo eprintf("\r
2128b093b18Sleo NetBSD loader for the Atari-TT\r
2138b093b18Sleo \r
214783817ccSleo Usage: %s [-abdhstVD] [-S <stram-size>] [-T <ttram-size>] [kernel]\r
2158b093b18Sleo \r
2168b093b18Sleo Description of options:\r
2178b093b18Sleo \r
2188b093b18Sleo \t-a Boot up to multi-user mode.\r
2198b093b18Sleo \t-b Ask for root device to use.\r
2208b093b18Sleo \t-d Enter kernel debugger.\r
221783817ccSleo \t-D printout debug information while loading\r
222485b90b6Sleo \t-h What you're getting right now.\r
223984d919cSleo `t-N No symbols must be loaded.\r
224783817ccSleo \t-o Write output to both <output file> and stdout.\r
2258b093b18Sleo \t-s Use only ST-compatible RAM\r
2268b093b18Sleo \t-S Set amount of ST-compatible RAM\r
227176d4dd6Sleo \t-T Set amount of TT-compatible RAM\r
2288b093b18Sleo \t-t Test the loader. It will do everything except executing the\r
2298b093b18Sleo \t loaded kernel.\r
230783817ccSleo \t-V Print loader version.\r
231783817ccSleo \t-w Wait for a keypress before exiting.\r
2328b0113cfSleo ", Progname);
233783817ccSleo xexit(0);
2348b0113cfSleo }
2358b0113cfSleo
236783817ccSleo void
usage(void)237df7f595eScegger usage(void)
2388b0113cfSleo {
239783817ccSleo eprintf("Usage: %s [-abdhstVD] [-S <stram-size>] "
240783817ccSleo "[-T <ttram-size>] [kernel]\r\n", Progname);
241783817ccSleo xexit(1);
2428b093b18Sleo }
2438b093b18Sleo
244783817ccSleo void
start_kernel(osdsc_t * od)245454af1c0Sdsl start_kernel(osdsc_t *od)
2468b0113cfSleo {
2478b0113cfSleo long stck;
2488b0113cfSleo
2498b0113cfSleo stck = Super(0);
250d6d66d66Sleo bsd_startup(&(od->kp));
2518b0113cfSleo /* NOT REACHED */
2528b0113cfSleo
253783817ccSleo (void)Super(stck);
2548b0113cfSleo }
255