xref: /utopia/UTPA2-700.0.x/projects/build/scripts/gfp-translate (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1*53ee8cc1Swenshuai.xi#!/bin/bash
2*53ee8cc1Swenshuai.xi# Translate the bits making up a GFP mask
3*53ee8cc1Swenshuai.xi# (c) 2009, Mel Gorman <mel@csn.ul.ie>
4*53ee8cc1Swenshuai.xi# Licensed under the terms of the GNU GPL License version 2
5*53ee8cc1Swenshuai.xiSOURCE=
6*53ee8cc1Swenshuai.xiGFPMASK=none
7*53ee8cc1Swenshuai.xi
8*53ee8cc1Swenshuai.xi# Helper function to report failures and exit
9*53ee8cc1Swenshuai.xidie() {
10*53ee8cc1Swenshuai.xi	echo ERROR: $@
11*53ee8cc1Swenshuai.xi	if [ "$TMPFILE" != "" ]; then
12*53ee8cc1Swenshuai.xi		rm -f $TMPFILE
13*53ee8cc1Swenshuai.xi	fi
14*53ee8cc1Swenshuai.xi	exit -1
15*53ee8cc1Swenshuai.xi}
16*53ee8cc1Swenshuai.xi
17*53ee8cc1Swenshuai.xiusage() {
18*53ee8cc1Swenshuai.xi	echo "usage: gfp-translate [-h] [ --source DIRECTORY ] gfpmask"
19*53ee8cc1Swenshuai.xi	exit 0
20*53ee8cc1Swenshuai.xi}
21*53ee8cc1Swenshuai.xi
22*53ee8cc1Swenshuai.xi# Parse command-line arguments
23*53ee8cc1Swenshuai.xiwhile [ $# -gt 0 ]; do
24*53ee8cc1Swenshuai.xi	case $1 in
25*53ee8cc1Swenshuai.xi		--source)
26*53ee8cc1Swenshuai.xi			SOURCE=$2
27*53ee8cc1Swenshuai.xi			shift 2
28*53ee8cc1Swenshuai.xi			;;
29*53ee8cc1Swenshuai.xi		-h)
30*53ee8cc1Swenshuai.xi			usage
31*53ee8cc1Swenshuai.xi			;;
32*53ee8cc1Swenshuai.xi		--help)
33*53ee8cc1Swenshuai.xi			usage
34*53ee8cc1Swenshuai.xi			;;
35*53ee8cc1Swenshuai.xi		*)
36*53ee8cc1Swenshuai.xi			GFPMASK=$1
37*53ee8cc1Swenshuai.xi			shift
38*53ee8cc1Swenshuai.xi			;;
39*53ee8cc1Swenshuai.xi	esac
40*53ee8cc1Swenshuai.xidone
41*53ee8cc1Swenshuai.xi
42*53ee8cc1Swenshuai.xi# Guess the kernel source directory if it's not set. Preference is in order of
43*53ee8cc1Swenshuai.xi# o current directory
44*53ee8cc1Swenshuai.xi# o /usr/src/linux
45*53ee8cc1Swenshuai.xiif [ "$SOURCE" = "" ]; then
46*53ee8cc1Swenshuai.xi	if [ -r "/usr/src/linux/Makefile" ]; then
47*53ee8cc1Swenshuai.xi		SOURCE=/usr/src/linux
48*53ee8cc1Swenshuai.xi	fi
49*53ee8cc1Swenshuai.xi	if [ -r "`pwd`/Makefile" ]; then
50*53ee8cc1Swenshuai.xi		SOURCE=`pwd`
51*53ee8cc1Swenshuai.xi	fi
52*53ee8cc1Swenshuai.xifi
53*53ee8cc1Swenshuai.xi
54*53ee8cc1Swenshuai.xi# Confirm that a source directory exists
55*53ee8cc1Swenshuai.xiif [ ! -r "$SOURCE/Makefile" ]; then
56*53ee8cc1Swenshuai.xi	die "Could not locate kernel source directory or it is invalid"
57*53ee8cc1Swenshuai.xifi
58*53ee8cc1Swenshuai.xi
59*53ee8cc1Swenshuai.xi# Confirm that a GFP mask has been specified
60*53ee8cc1Swenshuai.xiif [ "$GFPMASK" = "none" ]; then
61*53ee8cc1Swenshuai.xi	usage
62*53ee8cc1Swenshuai.xifi
63*53ee8cc1Swenshuai.xi
64*53ee8cc1Swenshuai.xi# Extract GFP flags from the kernel source
65*53ee8cc1Swenshuai.xiTMPFILE=`mktemp -t gfptranslate-XXXXXX` || exit 1
66*53ee8cc1Swenshuai.xigrep -q ___GFP $SOURCE/include/linux/gfp.h
67*53ee8cc1Swenshuai.xiif [ $? -eq 0 ]; then
68*53ee8cc1Swenshuai.xi	grep "^#define ___GFP" $SOURCE/include/linux/gfp.h | sed -e 's/u$//' | grep -v GFP_BITS > $TMPFILE
69*53ee8cc1Swenshuai.xielse
70*53ee8cc1Swenshuai.xi	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*53ee8cc1Swenshuai.xifi
72*53ee8cc1Swenshuai.xi
73*53ee8cc1Swenshuai.xi# Parse the flags
74*53ee8cc1Swenshuai.xiIFS="
75*53ee8cc1Swenshuai.xi"
76*53ee8cc1Swenshuai.xiecho Source: $SOURCE
77*53ee8cc1Swenshuai.xiecho Parsing: $GFPMASK
78*53ee8cc1Swenshuai.xifor LINE in `cat $TMPFILE`; do
79*53ee8cc1Swenshuai.xi	MASK=`echo $LINE | awk '{print $3}'`
80*53ee8cc1Swenshuai.xi	if [ $(($GFPMASK&$MASK)) -ne 0 ]; then
81*53ee8cc1Swenshuai.xi		echo $LINE
82*53ee8cc1Swenshuai.xi	fi
83*53ee8cc1Swenshuai.xidone
84*53ee8cc1Swenshuai.xi
85*53ee8cc1Swenshuai.xirm -f $TMPFILE
86*53ee8cc1Swenshuai.xiexit 0
87