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