Upgrade libressl. 1/2
[dragonfly.git] / share / examples / kld / firmware / wrap-fw_module.sh
1 #!/bin/sh
2
3 set -e
4
5 if [ "$#" -eq 0 ] || [ "$#" -gt 2 ]; then
6   echo "Usage: $(basename $0) fw.bin [module_prefix]"
7   exit 1
8 fi
9
10 if [ ! -f $1 ]; then
11    echo "File $1 does not exist"
12    exit 1
13 fi
14
15 if [ "$#" -eq 2 ]; then
16 MOD_PREFIX=$2
17 fi
18
19 MODULEDIR=${MODULEDIR:-/boot/modules.local}
20 WORKDIR=$(mktemp -d)
21 CURDIR=$PWD
22
23 FWFILE=$(basename "$1")
24 # strip .bin and .fw extensions
25 MODNAME=$(basename $(basename "$1" .bin) .fw)
26
27 # if module_prefix is provided, append to module name
28 if [ "$#" -eq 2 ]; then
29 MODNAME=${MOD_PREFIX}${MODNAME}
30 fi
31
32 # copy firmware file to workdir
33 cp -v "$1" "$WORKDIR"/"$FWFILE"
34
35 # prefer to use /sys build but provide workaround too
36 if [ -f /sys/tools/fw_stub.awk ];
37 then
38 echo "KMOD=     ${MODNAME}" >                   "$WORKDIR"/Makefile
39 echo "FIRMWS=   ${FWFILE}:${MODNAME}" >>        "$WORKDIR"/Makefile
40 echo ".include <bsd.kmod.mk>" >>                "$WORKDIR"/Makefile
41
42 (cd $WORKDIR && make)
43
44 else
45 # workaround case to build a local fw module version w/o kernel sources (should have no impact)
46 set -x
47
48 # ld/objcopy substitutes ' ', '-', '.' and '/' to '_'
49 FWSYM=$(echo ${FWFILE} |sed 's/ /_/g' | sed 's/-/_/g' |sed 's/\./_/g' |sed 's/\/_//g')
50 echo FWSYM=${FWSYM}
51
52 cd $WORKDIR
53 ld -b binary --no-warn-mismatch -r -d -o "${FWFILE}.fwo"  "${FWFILE}"
54
55 cat << EOF >> ${MODNAME}.c
56 #include <sys/param.h>
57 #include <sys/errno.h>
58 #include <sys/kernel.h>
59 #include <sys/module.h>
60 #include <sys/linker.h>
61 #include <sys/firmware.h>
62 //#include <sys/systm.h>
63
64 extern char _binary_${FWSYM}_start[], _binary_${FWSYM}_end[];
65
66 static int
67 ${MODNAME}_fw_modevent(module_t mod, int type, void *unused)
68 {
69   const struct firmware *fp;
70   int error;
71   switch (type) {
72   case MOD_LOAD:
73     fp = firmware_register("${MODNAME}", _binary_${FWSYM}_start , (size_t)(_binary_${FWSYM}_end - _binary_${FWSYM}_start), 0, NULL);
74     if (fp == NULL)
75       goto fail_0;
76     return (0);
77 fail_0:
78     return (ENXIO);
79   case MOD_UNLOAD:
80     error = firmware_unregister("${MODNAME}");
81     return (error);
82   }
83   return (EINVAL);
84 }
85
86 static moduledata_t ${MODNAME}_fw_mod = {
87   "${MODNAME}_fw",
88   ${MODNAME}_fw_modevent,
89   0
90 };
91 DECLARE_MODULE(${MODNAME}_fw, ${MODNAME}_fw_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST);
92 MODULE_VERSION(${MODNAME}_fw, 1);
93 MODULE_DEPEND(${MODNAME}_fw, firmware, 1, 1, 1);
94 EOF
95
96 FFLAGS="-fno-common -ffreestanding -fno-asynchronous-unwind-tables -fno-omit-frame-pointer -fno-stack-protector"
97 cc  -O -pipe   -D_KERNEL -Wall -std=c99 -Werror -DKLD_MODULE ${FFLAGS} -mcmodel=kernel -mno-red-zone -c "${MODNAME}.c"
98 ld  -r -d -o "${MODNAME}.ko" "${FWFILE}.fwo" "${MODNAME}.o"
99
100 fi
101
102
103 # copy firmware module to external modules dir
104 cp -v "$WORKDIR/$MODNAME.ko" "${MODULEDIR}/"
105
106 rm -rf "${WORKDIR}"