xref: /netbsd-src/sys/arch/ews4800mips/stand/common/inckern.c (revision ce099b40997c43048fb78bd578195f81d2456523)
1*ce099b40Smartin /*	$NetBSD: inckern.c,v 1.2 2008/04/28 20:23:18 martin Exp $	*/
204faabf0Stsutsui 
304faabf0Stsutsui /*-
404faabf0Stsutsui  * Copyright (c) 2004 The NetBSD Foundation, Inc.
504faabf0Stsutsui  * All rights reserved.
604faabf0Stsutsui  *
704faabf0Stsutsui  * This code is derived from software contributed to The NetBSD Foundation
804faabf0Stsutsui  * by UCHIYAMA Yasushi.
904faabf0Stsutsui  *
1004faabf0Stsutsui  * Redistribution and use in source and binary forms, with or without
1104faabf0Stsutsui  * modification, are permitted provided that the following conditions
1204faabf0Stsutsui  * are met:
1304faabf0Stsutsui  * 1. Redistributions of source code must retain the above copyright
1404faabf0Stsutsui  *    notice, this list of conditions and the following disclaimer.
1504faabf0Stsutsui  * 2. Redistributions in binary form must reproduce the above copyright
1604faabf0Stsutsui  *    notice, this list of conditions and the following disclaimer in the
1704faabf0Stsutsui  *    documentation and/or other materials provided with the distribution.
1804faabf0Stsutsui  *
1904faabf0Stsutsui  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
2004faabf0Stsutsui  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2104faabf0Stsutsui  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2204faabf0Stsutsui  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2304faabf0Stsutsui  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2404faabf0Stsutsui  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2504faabf0Stsutsui  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2604faabf0Stsutsui  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2704faabf0Stsutsui  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2804faabf0Stsutsui  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2904faabf0Stsutsui  * POSSIBILITY OF SUCH DAMAGE.
3004faabf0Stsutsui  */
3104faabf0Stsutsui 
3204faabf0Stsutsui #include <stdio.h>
3304faabf0Stsutsui #include <unistd.h>
3404faabf0Stsutsui 
3504faabf0Stsutsui enum { TMPBUF_SIZE = 0x2000 };
3604faabf0Stsutsui 
3704faabf0Stsutsui int
main(int argc,char * argv[])3804faabf0Stsutsui main(int argc, char *argv[])
3904faabf0Stsutsui {
4004faabf0Stsutsui 	unsigned char buf[TMPBUF_SIZE];
4104faabf0Stsutsui 	FILE *ifd, *ofd;
4204faabf0Stsutsui 	int err, i, n, total, nulldata;
4304faabf0Stsutsui 
4404faabf0Stsutsui 	nulldata = 0;
4504faabf0Stsutsui 	err = 1;
4604faabf0Stsutsui 	total = 0;
4704faabf0Stsutsui 	ifd = stdin;
4804faabf0Stsutsui 	ofd = stdout;
4904faabf0Stsutsui 	while ((i = getopt(argc, argv, "d:i:o:")) != -1) {
5004faabf0Stsutsui 		switch (i) {
5104faabf0Stsutsui 		case 'd':	/* Generate dummy file */
5204faabf0Stsutsui 			if ((optarg == 0) || (ifd != stdin))
5304faabf0Stsutsui 				goto bye;
5404faabf0Stsutsui 			total = strtoul(optarg, 0, 0);
5504faabf0Stsutsui 			nulldata = 1;
5604faabf0Stsutsui 			break;
5704faabf0Stsutsui 		case 'i':	/* Specify input file */
5804faabf0Stsutsui 			if ((optarg == 0) || (total != 0) ||
5904faabf0Stsutsui 			    (ifd = fopen(optarg, "r")) == 0)
6004faabf0Stsutsui 				goto bye;
6104faabf0Stsutsui 			break;
6204faabf0Stsutsui 		case 'o':	/* Specify output file */
6304faabf0Stsutsui 			if ((optarg == 0) || (ofd = fopen(optarg, "w")) == 0)
6404faabf0Stsutsui 				goto bye;
6504faabf0Stsutsui 			break;
6604faabf0Stsutsui 		}
6704faabf0Stsutsui 	}
6804faabf0Stsutsui 
6904faabf0Stsutsui 	fprintf(ofd, "#include <lib/libsa/stand.h>\n");
7004faabf0Stsutsui 	fprintf(ofd, "#include <lib/libkern/libkern.h>\n");
7104faabf0Stsutsui 	fprintf(ofd, "#include \"local.h\"\n");
7204faabf0Stsutsui 	fprintf(ofd, "uint8_t kernel_binary[");
7304faabf0Stsutsui 	if (nulldata) {
7404faabf0Stsutsui 		fprintf(ofd, "%d];\n", total);
7504faabf0Stsutsui 		fprintf(ofd, "int kernel_binary_size = %d;\n", total);
7604faabf0Stsutsui 	} else {
7704faabf0Stsutsui 		fprintf(ofd, "] = {\n\t");
7804faabf0Stsutsui 		while ((n = fread(buf, 1, TMPBUF_SIZE, ifd)) > 0) {
7904faabf0Stsutsui 			for (i = 0; i < n; i++) {
8004faabf0Stsutsui 				fprintf(ofd, "0x%02x, ", buf[i]);
8104faabf0Stsutsui 				if (((i + 1) & 0x7) == 0)
8204faabf0Stsutsui 					fprintf(ofd, "\n\t");
8304faabf0Stsutsui 			}
8404faabf0Stsutsui 			total += n;
8504faabf0Stsutsui 		}
8604faabf0Stsutsui 		fprintf(ofd, "\n};\nint kernel_binary_size = %d;\n", total);
8704faabf0Stsutsui 	}
8804faabf0Stsutsui 	err = 0;
8904faabf0Stsutsui 
9004faabf0Stsutsui  bye:
9104faabf0Stsutsui 	if (err)
9204faabf0Stsutsui 		perror(0);
9304faabf0Stsutsui 
9404faabf0Stsutsui 	if (ifd != stdin)
9504faabf0Stsutsui 		fclose(ifd);
9604faabf0Stsutsui 	if (ofd != stdout)
9704faabf0Stsutsui 		fclose(ofd);
9804faabf0Stsutsui 
9904faabf0Stsutsui 	return err;
10004faabf0Stsutsui }
101