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