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