fw_stub.awk revision 155055
1146515Sru#!/usr/bin/awk -f 2146515Sru 3146515Sru#- 4146515Sru# Copyright (c) 2006 Max Laier. 556160Sru# All rights reserved. 642660Smarkm# 756160Sru# Redistribution and use in source and binary forms, with or without 893139Sru# modification, are permitted provided that the following conditions 993139Sru# are met: 1093139Sru# 1. Redistributions of source code must retain the above copyright 1156160Sru# notice, this list of conditions and the following disclaimer. 1242660Smarkm# 2. Redistributions in binary form must reproduce the above copyright 13114472Sru# notice, this list of conditions and the following disclaimer in the 1456160Sru# documentation and/or other materials provided with the distribution. 1556160Sru# 1642660Smarkm# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS `AS IS'' AND 17146515Sru# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1893139Sru# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1942660Smarkm# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20114472Sru# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 2193139Sru# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2293139Sru# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2393139Sru# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2493139Sru# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2593139Sru# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2693139Sru# SUCH DAMAGE. 2793139Sru# 2842660Smarkm# $FreeBSD: head/sys/tools/fw_stub.awk 155055 2006-01-30 16:32:08Z mlaier $ 2993139Sru 3093139Sru# 3193139Sru# Script to generate module .c file from a list of firmware images 3242660Smarkm# 3393139Sru 3493139Srufunction usage () 3593139Sru{ 3693139Sru print "usage: fw_stub <firmware:name>* [-m modname] [-c outfile]"; 37114472Sru exit 1; 38114472Sru} 3942660Smarkm 40114472Sru# These are just for convenience ... 41114472Srufunction printc(s) 42114472Sru{ 43114472Sru if (opt_c) 44114472Sru print s > ctmpfilename; 4542660Smarkm else 4642660Smarkm print s > "/dev/stdout"; 4793139Sru} 4842660Smarkm 4993139SruBEGIN { 5042660Smarkm 5142660Smarkm# 52114472Sru# Process the command line. 5342660Smarkm# 5442660Smarkm 55146515Srunum_files = 0; 56146515Sru 5756160Srufor (i = 1; i < ARGC; i++) { 5856160Sru if (ARGV[i] ~ /^-/) { 5942660Smarkm # 6042660Smarkm # awk doesn't have getopt(), so we have to do it ourselves. 61114472Sru # This is a bit clumsy, but it works. 62114472Sru # 63114472Sru for (j = 2; j <= length(ARGV[i]); j++) { 6442660Smarkm o = substr(ARGV[i], j, 1); 65146515Sru if (o == "c") { 66146515Sru if (length(ARGV[i]) > j) { 67146515Sru opt_c = substr(ARGV[i], j + 1); 68146515Sru break; 69146515Sru } 7093139Sru else { 71114472Sru if (++i < ARGC) 72114472Sru opt_c = ARGV[i]; 73114472Sru else 7493139Sru usage(); 75114472Sru } 76114472Sru } else if (o == "m") { 77114472Sru if (length(ARGV[i]) > j) { 7893139Sru opt_m = substr(ARGV[i], j + 1); 7956160Sru break; 8042660Smarkm } 8142660Smarkm else { 8242660Smarkm if (++i < ARGC) 83114472Sru opt_m = ARGV[i]; 8456160Sru else 8593139Sru usage(); 8642660Smarkm } 8742660Smarkm } else 88114472Sru usage(); 8942660Smarkm } 9042660Smarkm } else { 9142660Smarkm split(ARGV[i], curr, ":"); 92146515Sru filenames[num_files] = curr[1]; 9342660Smarkm if (length(curr[2]) > 0) 9442660Smarkm shortnames[num_files] = curr[2]; 9593139Sru else 9642660Smarkm shortnames[num_files] = curr[2]; 9742660Smarkm if (length(curr[3]) > 0) 9893139Sru versions[num_files] = int(curr[3]); 9993139Sru else 10093139Sru versions[num_files] = 0; 10193139Sru num_files++; 10242660Smarkm } 10393139Sru} 10493139Sru 10593139Sruif (!num_files || !opt_m) 10642660Smarkm usage(); 10793139Sru 10893139Srucfilename = opt_c; 10942660Smarkmctmpfilename = cfilename ".tmp"; 11042660Smarkm 11142660Smarkmprintc("#include <sys/param.h>\ 11242660Smarkm#include <sys/errno.h>\ 11342660Smarkm#include <sys/kernel.h>\ 11493139Sru#include <sys/module.h>\ 11542660Smarkm#include <sys/linker.h>\ 11642660Smarkm#include <sys/firmware.h>\n"); 11793139Sru 11893139Srufor (file_i = 0; file_i < num_files; file_i++) { 119146515Sru symb = filenames[file_i]; 12042660Smarkm # '-', '.' and '/' are converted to '_' by ld/objcopy 12142660Smarkm gsub(/-|\.|\//, "_", symb); 12242660Smarkm printc("extern char _binary_" symb "_start[], _binary_" symb "_end[];"); 12342660Smarkm} 12442660Smarkm 12542660Smarkmprintc("\nstatic int\n"\ 12642660Smarkmopt_m "_fw_modevent(module_t mod, int type, void *unused)\ 12742660Smarkm{\ 12842660Smarkm struct firmware *fp;\ 12942660Smarkm switch (type) {\ 13093139Sru case MOD_LOAD:"); 13142660Smarkm 13242660Smarkmfor (file_i = 0; file_i < num_files; file_i++) { 133146515Sru short = shortnames[file_i]; 134146515Sru symb = filenames[file_i]; 135146515Sru version = versions[file_i]; 13693139Sru # '-', '.' and '/' are converted to '_' by ld/objcopy 137146515Sru gsub(/-|\.|\//, "_", symb); 138146515Sru 139146515Sru if (file_i == 0) 140146515Sru reg = "\t\tfp = "; 141146515Sru else 14242660Smarkm reg = "\t\t(void)"; 14342660Smarkm 14493139Sru reg = reg "firmware_register(\"" short "\", _binary_" symb "_start , "; 14542660Smarkm reg = reg "(size_t)(_binary_" symb "_end - _binary_" symb "_start), "; 14642660Smarkm reg = reg version ", "; 14793139Sru 14842660Smarkm if (file_i == 0) 14942660Smarkm reg = reg "NULL);"; 15093139Sru else 15142660Smarkm reg = reg "fp);"; 15293139Sru 15393139Sru printc(reg); 15442660Smarkm} 15542660Smarkm 15693139Sruprintc("\t\treturn (0);\ 15742660Smarkm case MOD_UNLOAD:"); 15842660Smarkm 15942660Smarkmfor (file_i = 1; file_i < num_files; file_i++) { 16093139Sru printc("\t\tfirmware_unregister(\"" shortnames[file_i] "\");"); 16193139Sru} 16293139Sru 16342660Smarkmprintc("\t\tfirmware_unregister(\"" shortnames[0] "\");"); 16442660Smarkm 16593139Sruprintc("\t\treturn (0);\ 16642660Smarkm }\ 16742660Smarkm return (EINVAL);\ 16842660Smarkm}\ 16993139Sru\ 17093139Srustatic moduledata_t " opt_m "_fw_mod = {\ 17193139Sru \"" opt_m "_fw\",\ 17293139Sru " opt_m "_fw_modevent,\ 17393139Sru 0\ 17493139Sru};\ 17593139SruDECLARE_MODULE(" opt_m "_fw, " opt_m "_fw_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST);\ 17693139SruMODULE_VERSION(" opt_m "_fw, 1);\ 17793139SruMODULE_DEPEND(" opt_m "_fw, firmware, 1, 1, 1);\ 17893139Sru"); 17993139Sru 18093139Sruif (opt_c) 18193139Sru if ((rc = system("mv -f " ctmpfilename " " cfilename))) { 18293139Sru print "'mv -f " ctmpfilename " " cfilename "' failed: " rc \ 18393139Sru > "/dev/stderr"; 18493139Sru exit 1; 18593139Sru } 18693139Sru 18793139Sruexit 0; 18893139Sru 18993139Sru} 19093139Sru