162306a36Sopenharmony_ci#!/bin/bash
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0-only
362306a36Sopenharmony_ci# Translate the bits making up a GFP mask
462306a36Sopenharmony_ci# (c) 2009, Mel Gorman <mel@csn.ul.ie>
562306a36Sopenharmony_ciSOURCE=
662306a36Sopenharmony_ciGFPMASK=none
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci# Helper function to report failures and exit
962306a36Sopenharmony_cidie() {
1062306a36Sopenharmony_ci	echo ERROR: $@
1162306a36Sopenharmony_ci	if [ "$TMPFILE" != "" ]; then
1262306a36Sopenharmony_ci		rm -f $TMPFILE
1362306a36Sopenharmony_ci	fi
1462306a36Sopenharmony_ci	exit -1
1562306a36Sopenharmony_ci}
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ciusage() {
1862306a36Sopenharmony_ci	echo "usage: gfp-translate [-h] [ --source DIRECTORY ] gfpmask"
1962306a36Sopenharmony_ci	exit 0
2062306a36Sopenharmony_ci}
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci# Parse command-line arguments
2362306a36Sopenharmony_ciwhile [ $# -gt 0 ]; do
2462306a36Sopenharmony_ci	case $1 in
2562306a36Sopenharmony_ci		--source)
2662306a36Sopenharmony_ci			SOURCE=$2
2762306a36Sopenharmony_ci			shift 2
2862306a36Sopenharmony_ci			;;
2962306a36Sopenharmony_ci		-h)
3062306a36Sopenharmony_ci			usage
3162306a36Sopenharmony_ci			;;
3262306a36Sopenharmony_ci		--help)
3362306a36Sopenharmony_ci			usage
3462306a36Sopenharmony_ci			;;
3562306a36Sopenharmony_ci		*)
3662306a36Sopenharmony_ci			GFPMASK=$1
3762306a36Sopenharmony_ci			shift
3862306a36Sopenharmony_ci			;;
3962306a36Sopenharmony_ci	esac
4062306a36Sopenharmony_cidone
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci# Guess the kernel source directory if it's not set. Preference is in order of
4362306a36Sopenharmony_ci# o current directory
4462306a36Sopenharmony_ci# o /usr/src/linux
4562306a36Sopenharmony_ciif [ "$SOURCE" = "" ]; then
4662306a36Sopenharmony_ci	if [ -r "/usr/src/linux/Makefile" ]; then
4762306a36Sopenharmony_ci		SOURCE=/usr/src/linux
4862306a36Sopenharmony_ci	fi
4962306a36Sopenharmony_ci	if [ -r "`pwd`/Makefile" ]; then
5062306a36Sopenharmony_ci		SOURCE=`pwd`
5162306a36Sopenharmony_ci	fi
5262306a36Sopenharmony_cifi
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci# Confirm that a source directory exists
5562306a36Sopenharmony_ciif [ ! -r "$SOURCE/Makefile" ]; then
5662306a36Sopenharmony_ci	die "Could not locate kernel source directory or it is invalid"
5762306a36Sopenharmony_cifi
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci# Confirm that a GFP mask has been specified
6062306a36Sopenharmony_ciif [ "$GFPMASK" = "none" ]; then
6162306a36Sopenharmony_ci	usage
6262306a36Sopenharmony_cifi
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci# Extract GFP flags from the kernel source
6562306a36Sopenharmony_ciTMPFILE=`mktemp -t gfptranslate-XXXXXX` || exit 1
6662306a36Sopenharmony_cigrep -q ___GFP $SOURCE/include/linux/gfp_types.h
6762306a36Sopenharmony_ciif [ $? -eq 0 ]; then
6862306a36Sopenharmony_ci	grep "^#define ___GFP" $SOURCE/include/linux/gfp_types.h | sed -e 's/u$//' | grep -v GFP_BITS > $TMPFILE
6962306a36Sopenharmony_cielse
7062306a36Sopenharmony_ci	grep "^#define __GFP" $SOURCE/include/linux/gfp_types.h | sed -e 's/(__force gfp_t)//' | sed -e 's/u)/)/' | grep -v GFP_BITS | sed -e 's/)\//) \//' > $TMPFILE
7162306a36Sopenharmony_cifi
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci# Parse the flags
7462306a36Sopenharmony_ciIFS="
7562306a36Sopenharmony_ci"
7662306a36Sopenharmony_ciecho Source: $SOURCE
7762306a36Sopenharmony_ciecho Parsing: $GFPMASK
7862306a36Sopenharmony_cifor LINE in `cat $TMPFILE`; do
7962306a36Sopenharmony_ci	MASK=`echo $LINE | awk '{print $3}'`
8062306a36Sopenharmony_ci	if [ $(($GFPMASK&$MASK)) -ne 0 ]; then
8162306a36Sopenharmony_ci		echo $LINE
8262306a36Sopenharmony_ci	fi
8362306a36Sopenharmony_cidone
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_cirm -f $TMPFILE
8662306a36Sopenharmony_ciexit 0
87