.. | .. |
---|
1 | 1 | #!/bin/sh |
---|
2 | 2 | # SPDX-License-Identifier: GPL-2.0 |
---|
3 | 3 | |
---|
4 | | -if [ $# -lt 2 ] |
---|
| 4 | +if [ $# -ne 2 ] |
---|
5 | 5 | then |
---|
6 | | - echo "Usage: headers_install.sh OUTDIR SRCDIR [FILES...]" |
---|
| 6 | + echo "Usage: headers_install.sh INFILE OUTFILE" |
---|
7 | 7 | echo |
---|
8 | 8 | echo "Prepares kernel header files for use by user space, by removing" |
---|
9 | 9 | echo "all compiler.h definitions and #includes, removing any" |
---|
10 | 10 | echo "#ifdef __KERNEL__ sections, and putting __underscores__ around" |
---|
11 | 11 | echo "asm/inline/volatile keywords." |
---|
12 | 12 | echo |
---|
13 | | - echo "OUTDIR: directory to write each userspace header FILE to." |
---|
14 | | - echo "SRCDIR: source directory where files are picked." |
---|
15 | | - echo "FILES: list of header files to operate on." |
---|
| 13 | + echo "INFILE: header file to operate on" |
---|
| 14 | + echo "OUTFILE: output file which the processed header is written to" |
---|
16 | 15 | |
---|
17 | 16 | exit 1 |
---|
18 | 17 | fi |
---|
19 | 18 | |
---|
20 | 19 | # Grab arguments |
---|
| 20 | +INFILE=$1 |
---|
| 21 | +OUTFILE=$2 |
---|
| 22 | +TMPFILE=$OUTFILE.tmp |
---|
21 | 23 | |
---|
22 | | -OUTDIR="$1" |
---|
23 | | -shift |
---|
24 | | -SRCDIR="$1" |
---|
25 | | -shift |
---|
| 24 | +trap 'rm -f $OUTFILE $TMPFILE' EXIT |
---|
26 | 25 | |
---|
27 | | -# Iterate through files listed on command line |
---|
| 26 | +# SPDX-License-Identifier with GPL variants must have "WITH Linux-syscall-note" |
---|
| 27 | +if [ -n "$(sed -n -e "/SPDX-License-Identifier:.*GPL-/{/WITH Linux-syscall-note/!p}" $INFILE)" ]; then |
---|
| 28 | + echo "error: $INFILE: missing \"WITH Linux-syscall-note\" for SPDX-License-Identifier" >&2 |
---|
| 29 | + exit 1 |
---|
| 30 | +fi |
---|
28 | 31 | |
---|
29 | | -FILE= |
---|
30 | | -trap 'rm -f "$OUTDIR/$FILE" "$OUTDIR/$FILE.sed"' EXIT |
---|
31 | | -for i in "$@" |
---|
| 32 | +sed -E -e ' |
---|
| 33 | + s/([[:space:](])(__user|__force|__iomem)[[:space:]]/\1/g |
---|
| 34 | + s/__attribute_const__([[:space:]]|$)/\1/g |
---|
| 35 | + s@^#include <linux/compiler(|_types).h>@@ |
---|
| 36 | + s/(^|[^a-zA-Z0-9])__packed([^a-zA-Z0-9_]|$)/\1__attribute__((packed))\2/g |
---|
| 37 | + s/(^|[[:space:](])(inline|asm|volatile)([[:space:](]|$)/\1__\2__\3/g |
---|
| 38 | + s@#(ifndef|define|endif[[:space:]]*/[*])[[:space:]]*_UAPI@#\1 @ |
---|
| 39 | +' $INFILE > $TMPFILE || exit 1 |
---|
| 40 | + |
---|
| 41 | +scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__ $TMPFILE > $OUTFILE |
---|
| 42 | +[ $? -gt 1 ] && exit 1 |
---|
| 43 | + |
---|
| 44 | +# Remove /* ... */ style comments, and find CONFIG_ references in code |
---|
| 45 | +configs=$(sed -e ' |
---|
| 46 | +:comment |
---|
| 47 | + s:/\*[^*][^*]*:/*: |
---|
| 48 | + s:/\*\*\**\([^/]\):/*\1: |
---|
| 49 | + t comment |
---|
| 50 | + s:/\*\*/: : |
---|
| 51 | + t comment |
---|
| 52 | + /\/\*/! b check |
---|
| 53 | + N |
---|
| 54 | + b comment |
---|
| 55 | +:print |
---|
| 56 | + P |
---|
| 57 | + D |
---|
| 58 | +:check |
---|
| 59 | + s:^\(CONFIG_[[:alnum:]_]*\):\1\n: |
---|
| 60 | + t print |
---|
| 61 | + s:^[[:alnum:]_][[:alnum:]_]*:: |
---|
| 62 | + s:^[^[:alnum:]_][^[:alnum:]_]*:: |
---|
| 63 | + t check |
---|
| 64 | + d |
---|
| 65 | +' $OUTFILE) |
---|
| 66 | + |
---|
| 67 | +# The entries in the following list do not result in an error. |
---|
| 68 | +# Please do not add a new entry. This list is only for existing ones. |
---|
| 69 | +# The list will be reduced gradually, and deleted eventually. (hopefully) |
---|
| 70 | +# |
---|
| 71 | +# The format is <file-name>:<CONFIG-option> in each line. |
---|
| 72 | +config_leak_ignores=" |
---|
| 73 | +include/uapi/linux/iio/types.h:CONFIG_NO_GKI |
---|
| 74 | +arch/alpha/include/uapi/asm/setup.h:CONFIG_ALPHA_LEGACY_START_ADDRESS |
---|
| 75 | +arch/arc/include/uapi/asm/page.h:CONFIG_ARC_PAGE_SIZE_16K |
---|
| 76 | +arch/arc/include/uapi/asm/page.h:CONFIG_ARC_PAGE_SIZE_4K |
---|
| 77 | +arch/arc/include/uapi/asm/swab.h:CONFIG_ARC_HAS_SWAPE |
---|
| 78 | +arch/arm/include/uapi/asm/ptrace.h:CONFIG_CPU_ENDIAN_BE8 |
---|
| 79 | +arch/hexagon/include/uapi/asm/ptrace.h:CONFIG_HEXAGON_ARCH_VERSION |
---|
| 80 | +arch/hexagon/include/uapi/asm/user.h:CONFIG_HEXAGON_ARCH_VERSION |
---|
| 81 | +arch/ia64/include/uapi/asm/cmpxchg.h:CONFIG_IA64_DEBUG_CMPXCHG |
---|
| 82 | +arch/m68k/include/uapi/asm/ptrace.h:CONFIG_COLDFIRE |
---|
| 83 | +arch/nios2/include/uapi/asm/swab.h:CONFIG_NIOS2_CI_SWAB_NO |
---|
| 84 | +arch/nios2/include/uapi/asm/swab.h:CONFIG_NIOS2_CI_SWAB_SUPPORT |
---|
| 85 | +arch/x86/include/uapi/asm/auxvec.h:CONFIG_IA32_EMULATION |
---|
| 86 | +arch/x86/include/uapi/asm/auxvec.h:CONFIG_X86_64 |
---|
| 87 | +arch/x86/include/uapi/asm/mman.h:CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS |
---|
| 88 | +include/uapi/asm-generic/fcntl.h:CONFIG_64BIT |
---|
| 89 | +include/uapi/linux/atmdev.h:CONFIG_COMPAT |
---|
| 90 | +include/uapi/linux/eventpoll.h:CONFIG_PM_SLEEP |
---|
| 91 | +include/uapi/linux/hw_breakpoint.h:CONFIG_HAVE_MIXED_BREAKPOINTS_REGS |
---|
| 92 | +include/uapi/linux/pktcdvd.h:CONFIG_CDROM_PKTCDVD_WCACHE |
---|
| 93 | +" |
---|
| 94 | + |
---|
| 95 | +for c in $configs |
---|
32 | 96 | do |
---|
33 | | - FILE="$(basename "$i")" |
---|
34 | | - sed -E \ |
---|
35 | | - -e 's/([[:space:](])(__user|__force|__iomem)[[:space:]]/\1/g' \ |
---|
36 | | - -e 's/__attribute_const__([[:space:]]|$)/\1/g' \ |
---|
37 | | - -e 's@^#include <linux/compiler(|_types).h>@@' \ |
---|
38 | | - -e 's/(^|[^a-zA-Z0-9])__packed([^a-zA-Z0-9_]|$)/\1__attribute__((packed))\2/g' \ |
---|
39 | | - -e 's/(^|[[:space:](])(inline|asm|volatile)([[:space:](]|$)/\1__\2__\3/g' \ |
---|
40 | | - -e 's@#(ifndef|define|endif[[:space:]]*/[*])[[:space:]]*_UAPI@#\1 @' \ |
---|
41 | | - "$SRCDIR/$i" > "$OUTDIR/$FILE.sed" || exit 1 |
---|
42 | | - scripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__ "$OUTDIR/$FILE.sed" \ |
---|
43 | | - > "$OUTDIR/$FILE" |
---|
44 | | - [ $? -gt 1 ] && exit 1 |
---|
45 | | - rm -f "$OUTDIR/$FILE.sed" |
---|
| 97 | + leak_error=1 |
---|
| 98 | + |
---|
| 99 | + for ignore in $config_leak_ignores |
---|
| 100 | + do |
---|
| 101 | + if echo "$INFILE:$c" | grep -q "$ignore$"; then |
---|
| 102 | + leak_error= |
---|
| 103 | + break |
---|
| 104 | + fi |
---|
| 105 | + done |
---|
| 106 | + |
---|
| 107 | + if [ "$leak_error" = 1 ]; then |
---|
| 108 | + echo "error: $INFILE: leak $c to user-space" >&2 |
---|
| 109 | + exit 1 |
---|
| 110 | + fi |
---|
46 | 111 | done |
---|
| 112 | + |
---|
| 113 | +rm -f $TMPFILE |
---|
47 | 114 | trap - EXIT |
---|