xref: /OK3568_Linux_fs/kernel/scripts/gfp-translate (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/bash
2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0-only
3*4882a593Smuzhiyun# Translate the bits making up a GFP mask
4*4882a593Smuzhiyun# (c) 2009, Mel Gorman <mel@csn.ul.ie>
5*4882a593SmuzhiyunSOURCE=
6*4882a593SmuzhiyunGFPMASK=none
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun# Helper function to report failures and exit
9*4882a593Smuzhiyundie() {
10*4882a593Smuzhiyun	echo ERROR: $@
11*4882a593Smuzhiyun	if [ "$TMPFILE" != "" ]; then
12*4882a593Smuzhiyun		rm -f $TMPFILE
13*4882a593Smuzhiyun	fi
14*4882a593Smuzhiyun	exit -1
15*4882a593Smuzhiyun}
16*4882a593Smuzhiyun
17*4882a593Smuzhiyunusage() {
18*4882a593Smuzhiyun	echo "usage: gfp-translate [-h] [ --source DIRECTORY ] gfpmask"
19*4882a593Smuzhiyun	exit 0
20*4882a593Smuzhiyun}
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun# Parse command-line arguments
23*4882a593Smuzhiyunwhile [ $# -gt 0 ]; do
24*4882a593Smuzhiyun	case $1 in
25*4882a593Smuzhiyun		--source)
26*4882a593Smuzhiyun			SOURCE=$2
27*4882a593Smuzhiyun			shift 2
28*4882a593Smuzhiyun			;;
29*4882a593Smuzhiyun		-h)
30*4882a593Smuzhiyun			usage
31*4882a593Smuzhiyun			;;
32*4882a593Smuzhiyun		--help)
33*4882a593Smuzhiyun			usage
34*4882a593Smuzhiyun			;;
35*4882a593Smuzhiyun		*)
36*4882a593Smuzhiyun			GFPMASK=$1
37*4882a593Smuzhiyun			shift
38*4882a593Smuzhiyun			;;
39*4882a593Smuzhiyun	esac
40*4882a593Smuzhiyundone
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun# Guess the kernel source directory if it's not set. Preference is in order of
43*4882a593Smuzhiyun# o current directory
44*4882a593Smuzhiyun# o /usr/src/linux
45*4882a593Smuzhiyunif [ "$SOURCE" = "" ]; then
46*4882a593Smuzhiyun	if [ -r "/usr/src/linux/Makefile" ]; then
47*4882a593Smuzhiyun		SOURCE=/usr/src/linux
48*4882a593Smuzhiyun	fi
49*4882a593Smuzhiyun	if [ -r "`pwd`/Makefile" ]; then
50*4882a593Smuzhiyun		SOURCE=`pwd`
51*4882a593Smuzhiyun	fi
52*4882a593Smuzhiyunfi
53*4882a593Smuzhiyun
54*4882a593Smuzhiyun# Confirm that a source directory exists
55*4882a593Smuzhiyunif [ ! -r "$SOURCE/Makefile" ]; then
56*4882a593Smuzhiyun	die "Could not locate kernel source directory or it is invalid"
57*4882a593Smuzhiyunfi
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun# Confirm that a GFP mask has been specified
60*4882a593Smuzhiyunif [ "$GFPMASK" = "none" ]; then
61*4882a593Smuzhiyun	usage
62*4882a593Smuzhiyunfi
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun# Extract GFP flags from the kernel source
65*4882a593SmuzhiyunTMPFILE=`mktemp -t gfptranslate-XXXXXX` || exit 1
66*4882a593Smuzhiyungrep -q ___GFP $SOURCE/include/linux/gfp.h
67*4882a593Smuzhiyunif [ $? -eq 0 ]; then
68*4882a593Smuzhiyun	grep "^#define ___GFP" $SOURCE/include/linux/gfp.h | sed -e 's/u$//' | grep -v GFP_BITS > $TMPFILE
69*4882a593Smuzhiyunelse
70*4882a593Smuzhiyun	grep "^#define __GFP" $SOURCE/include/linux/gfp.h | sed -e 's/(__force gfp_t)//' | sed -e 's/u)/)/' | grep -v GFP_BITS | sed -e 's/)\//) \//' > $TMPFILE
71*4882a593Smuzhiyunfi
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun# Parse the flags
74*4882a593SmuzhiyunIFS="
75*4882a593Smuzhiyun"
76*4882a593Smuzhiyunecho Source: $SOURCE
77*4882a593Smuzhiyunecho Parsing: $GFPMASK
78*4882a593Smuzhiyunfor LINE in `cat $TMPFILE`; do
79*4882a593Smuzhiyun	MASK=`echo $LINE | awk '{print $3}'`
80*4882a593Smuzhiyun	if [ $(($GFPMASK&$MASK)) -ne 0 ]; then
81*4882a593Smuzhiyun		echo $LINE
82*4882a593Smuzhiyun	fi
83*4882a593Smuzhiyundone
84*4882a593Smuzhiyun
85*4882a593Smuzhiyunrm -f $TMPFILE
86*4882a593Smuzhiyunexit 0
87