]>
Commit | Line | Data |
---|---|---|
608e8e66 | 1 | #!/bin/bash |
4f19048f | 2 | # SPDX-License-Identifier: GPL-2.0-only |
608e8e66 MG |
3 | # Translate the bits making up a GFP mask |
4 | # (c) 2009, Mel Gorman <[email protected]> | |
608e8e66 MG |
5 | SOURCE= |
6 | GFPMASK=none | |
7 | ||
8 | # Helper function to report failures and exit | |
9 | die() { | |
10 | echo ERROR: $@ | |
11 | if [ "$TMPFILE" != "" ]; then | |
12 | rm -f $TMPFILE | |
13 | fi | |
14 | exit -1 | |
15 | } | |
16 | ||
17 | usage() { | |
18 | echo "usage: gfp-translate [-h] [ --source DIRECTORY ] gfpmask" | |
19 | exit 0 | |
20 | } | |
21 | ||
3ad2f3fb | 22 | # Parse command-line arguments |
608e8e66 MG |
23 | while [ $# -gt 0 ]; do |
24 | case $1 in | |
25 | --source) | |
26 | SOURCE=$2 | |
27 | shift 2 | |
28 | ;; | |
29 | -h) | |
30 | usage | |
31 | ;; | |
32 | --help) | |
33 | usage | |
34 | ;; | |
35 | *) | |
36 | GFPMASK=$1 | |
37 | shift | |
38 | ;; | |
39 | esac | |
40 | done | |
41 | ||
42 | # Guess the kernel source directory if it's not set. Preference is in order of | |
43 | # o current directory | |
44 | # o /usr/src/linux | |
45 | if [ "$SOURCE" = "" ]; then | |
46 | if [ -r "/usr/src/linux/Makefile" ]; then | |
47 | SOURCE=/usr/src/linux | |
48 | fi | |
49 | if [ -r "`pwd`/Makefile" ]; then | |
50 | SOURCE=`pwd` | |
51 | fi | |
52 | fi | |
53 | ||
54 | # Confirm that a source directory exists | |
55 | if [ ! -r "$SOURCE/Makefile" ]; then | |
56 | die "Could not locate kernel source directory or it is invalid" | |
57 | fi | |
58 | ||
59 | # Confirm that a GFP mask has been specified | |
60 | if [ "$GFPMASK" = "none" ]; then | |
61 | usage | |
62 | fi | |
63 | ||
64 | # Extract GFP flags from the kernel source | |
a3f6a89c | 65 | TMPFILE=`mktemp -t gfptranslate-XXXXXX.c` || exit 1 |
608e8e66 | 66 | |
608e8e66 MG |
67 | echo Source: $SOURCE |
68 | echo Parsing: $GFPMASK | |
608e8e66 | 69 | |
a3f6a89c MZ |
70 | ( |
71 | cat <<EOF | |
72 | #include <stdint.h> | |
73 | #include <stdio.h> | |
74 | ||
75 | // Try to fool compiler.h into not including extra stuff | |
76 | #define __ASSEMBLY__ 1 | |
77 | ||
78 | #include <generated/autoconf.h> | |
79 | #include <linux/gfp_types.h> | |
80 | ||
81 | static const char *masks[] = { | |
82 | EOF | |
83 | ||
84 | sed -nEe 's/^[[:space:]]+(___GFP_.*)_BIT,.*$/\1/p' $SOURCE/include/linux/gfp_types.h | | |
85 | while read b; do | |
86 | cat <<EOF | |
87 | #if defined($b) && ($b > 0) | |
88 | [${b}_BIT] = "$b", | |
89 | #endif | |
90 | EOF | |
91 | done | |
92 | ||
93 | cat <<EOF | |
94 | }; | |
95 | ||
96 | int main(int argc, char *argv[]) | |
97 | { | |
98 | unsigned long long mask = $GFPMASK; | |
99 | ||
100 | for (int i = 0; i < sizeof(mask) * 8; i++) { | |
101 | unsigned long long bit = 1ULL << i; | |
102 | if (mask & bit) | |
103 | printf("\t%-25s0x%llx\n", | |
104 | (i < ___GFP_LAST_BIT && masks[i]) ? | |
105 | masks[i] : "*** INVALID ***", | |
106 | bit); | |
107 | } | |
108 | ||
109 | return 0; | |
110 | } | |
111 | EOF | |
112 | ) > $TMPFILE | |
113 | ||
114 | ${CC:-gcc} -Wall -o ${TMPFILE}.bin -I $SOURCE/include $TMPFILE && ${TMPFILE}.bin | |
115 | ||
116 | rm -f $TMPFILE ${TMPFILE}.bin | |
117 | ||
608e8e66 | 118 | exit 0 |