xref: /netbsd-src/sys/arch/atari/stand/tostools/loadbsd/loadbsd.c (revision f0a7346d2148aa56c118f3e51cfffc26cebb09ce)
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