162306a36Sopenharmony_ci#!/bin/sh 262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0 362306a36Sopenharmony_ci 462306a36Sopenharmony_ciif [ $# -ne 2 ] 562306a36Sopenharmony_cithen 662306a36Sopenharmony_ci echo "Usage: headers_install.sh INFILE OUTFILE" 762306a36Sopenharmony_ci echo 862306a36Sopenharmony_ci echo "Prepares kernel header files for use by user space, by removing" 962306a36Sopenharmony_ci echo "all compiler.h definitions and #includes, removing any" 1062306a36Sopenharmony_ci echo "#ifdef __KERNEL__ sections, and putting __underscores__ around" 1162306a36Sopenharmony_ci echo "asm/inline/volatile keywords." 1262306a36Sopenharmony_ci echo 1362306a36Sopenharmony_ci echo "INFILE: header file to operate on" 1462306a36Sopenharmony_ci echo "OUTFILE: output file which the processed header is written to" 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci exit 1 1762306a36Sopenharmony_cifi 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci# Grab arguments 2062306a36Sopenharmony_ciINFILE=$1 2162306a36Sopenharmony_ciOUTFILE=$2 2262306a36Sopenharmony_ciTMPFILE=$OUTFILE.tmp 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_citrap 'rm -f $OUTFILE $TMPFILE' EXIT 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci# SPDX-License-Identifier with GPL variants must have "WITH Linux-syscall-note" 2762306a36Sopenharmony_ciif [ -n "$(sed -n -e "/SPDX-License-Identifier:.*GPL-/{/WITH Linux-syscall-note/!p}" $INFILE)" ]; then 2862306a36Sopenharmony_ci echo "error: $INFILE: missing \"WITH Linux-syscall-note\" for SPDX-License-Identifier" >&2 2962306a36Sopenharmony_ci exit 1 3062306a36Sopenharmony_cifi 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_cised -E -e ' 3362306a36Sopenharmony_ci s/([[:space:](])(__user|__force|__iomem)[[:space:]]/\1/g 3462306a36Sopenharmony_ci s/__attribute_const__([[:space:]]|$)/\1/g 3562306a36Sopenharmony_ci s@^#include <linux/compiler(|_types).h>@@ 3662306a36Sopenharmony_ci s/(^|[^a-zA-Z0-9])__packed([^a-zA-Z0-9_]|$)/\1__attribute__((packed))\2/g 3762306a36Sopenharmony_ci s/(^|[[:space:](])(inline|asm|volatile)([[:space:](]|$)/\1__\2__\3/g 3862306a36Sopenharmony_ci s@#(ifndef|define|endif[[:space:]]*/[*])[[:space:]]*_UAPI@#\1 @ 3962306a36Sopenharmony_ci' $INFILE > $TMPFILE || exit 1 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ciscripts/unifdef -U__KERNEL__ -D__EXPORTED_HEADERS__ $TMPFILE > $OUTFILE 4262306a36Sopenharmony_ci[ $? -gt 1 ] && exit 1 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci# Remove /* ... */ style comments, and find CONFIG_ references in code 4562306a36Sopenharmony_ciconfigs=$(sed -e ' 4662306a36Sopenharmony_ci:comment 4762306a36Sopenharmony_ci s:/\*[^*][^*]*:/*: 4862306a36Sopenharmony_ci s:/\*\*\**\([^/]\):/*\1: 4962306a36Sopenharmony_ci t comment 5062306a36Sopenharmony_ci s:/\*\*/: : 5162306a36Sopenharmony_ci t comment 5262306a36Sopenharmony_ci /\/\*/! b check 5362306a36Sopenharmony_ci N 5462306a36Sopenharmony_ci b comment 5562306a36Sopenharmony_ci:print 5662306a36Sopenharmony_ci P 5762306a36Sopenharmony_ci D 5862306a36Sopenharmony_ci:check 5962306a36Sopenharmony_ci s:^\(CONFIG_[[:alnum:]_]*\):\1\n: 6062306a36Sopenharmony_ci t print 6162306a36Sopenharmony_ci s:^[[:alnum:]_][[:alnum:]_]*:: 6262306a36Sopenharmony_ci s:^[^[:alnum:]_][^[:alnum:]_]*:: 6362306a36Sopenharmony_ci t check 6462306a36Sopenharmony_ci d 6562306a36Sopenharmony_ci' $OUTFILE) 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_ci# The entries in the following list do not result in an error. 6862306a36Sopenharmony_ci# Please do not add a new entry. This list is only for existing ones. 6962306a36Sopenharmony_ci# The list will be reduced gradually, and deleted eventually. (hopefully) 7062306a36Sopenharmony_ci# 7162306a36Sopenharmony_ci# The format is <file-name>:<CONFIG-option> in each line. 7262306a36Sopenharmony_ciconfig_leak_ignores=" 7362306a36Sopenharmony_ciarch/arc/include/uapi/asm/page.h:CONFIG_ARC_PAGE_SIZE_16K 7462306a36Sopenharmony_ciarch/arc/include/uapi/asm/page.h:CONFIG_ARC_PAGE_SIZE_4K 7562306a36Sopenharmony_ciarch/arc/include/uapi/asm/swab.h:CONFIG_ARC_HAS_SWAPE 7662306a36Sopenharmony_ciarch/arm/include/uapi/asm/ptrace.h:CONFIG_CPU_ENDIAN_BE8 7762306a36Sopenharmony_ciarch/hexagon/include/uapi/asm/ptrace.h:CONFIG_HEXAGON_ARCH_VERSION 7862306a36Sopenharmony_ciarch/hexagon/include/uapi/asm/user.h:CONFIG_HEXAGON_ARCH_VERSION 7962306a36Sopenharmony_ciarch/m68k/include/uapi/asm/ptrace.h:CONFIG_COLDFIRE 8062306a36Sopenharmony_ciarch/nios2/include/uapi/asm/swab.h:CONFIG_NIOS2_CI_SWAB_NO 8162306a36Sopenharmony_ciarch/nios2/include/uapi/asm/swab.h:CONFIG_NIOS2_CI_SWAB_SUPPORT 8262306a36Sopenharmony_ciarch/x86/include/uapi/asm/auxvec.h:CONFIG_IA32_EMULATION 8362306a36Sopenharmony_ciarch/x86/include/uapi/asm/auxvec.h:CONFIG_X86_64 8462306a36Sopenharmony_ci" 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_cifor c in $configs 8762306a36Sopenharmony_cido 8862306a36Sopenharmony_ci leak_error=1 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci for ignore in $config_leak_ignores 9162306a36Sopenharmony_ci do 9262306a36Sopenharmony_ci if echo "$INFILE:$c" | grep -q "$ignore$"; then 9362306a36Sopenharmony_ci leak_error= 9462306a36Sopenharmony_ci break 9562306a36Sopenharmony_ci fi 9662306a36Sopenharmony_ci done 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci if [ "$leak_error" = 1 ]; then 9962306a36Sopenharmony_ci echo "error: $INFILE: leak $c to user-space" >&2 10062306a36Sopenharmony_ci exit 1 10162306a36Sopenharmony_ci fi 10262306a36Sopenharmony_cidone 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_cirm -f $TMPFILE 10562306a36Sopenharmony_citrap - EXIT 106