hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/scripts/headers_install.sh
....@@ -1,47 +1,114 @@
11 #!/bin/sh
22 # SPDX-License-Identifier: GPL-2.0
33
4
-if [ $# -lt 2 ]
4
+if [ $# -ne 2 ]
55 then
6
- echo "Usage: headers_install.sh OUTDIR SRCDIR [FILES...]"
6
+ echo "Usage: headers_install.sh INFILE OUTFILE"
77 echo
88 echo "Prepares kernel header files for use by user space, by removing"
99 echo "all compiler.h definitions and #includes, removing any"
1010 echo "#ifdef __KERNEL__ sections, and putting __underscores__ around"
1111 echo "asm/inline/volatile keywords."
1212 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"
1615
1716 exit 1
1817 fi
1918
2019 # Grab arguments
20
+INFILE=$1
21
+OUTFILE=$2
22
+TMPFILE=$OUTFILE.tmp
2123
22
-OUTDIR="$1"
23
-shift
24
-SRCDIR="$1"
25
-shift
24
+trap 'rm -f $OUTFILE $TMPFILE' EXIT
2625
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
2831
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
3296 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
46111 done
112
+
113
+rm -f $TMPFILE
47114 trap - EXIT