Commit | Line | Data |
---|---|---|
b7150b71 | 1 | #!/bin/bash |
b7cdc182 | 2 | # SPDX-License-Identifier: (GPL-2.0-only or LGPL-2.1-only) |
b75d00c4 MD |
3 | |
4 | # example usage: | |
644d6e9c | 5 | # lttng-get-syscall-inout.sh table-syscall-inout.txt select 1 |
b75d00c4 | 6 | |
9497697f | 7 | ARCH_NAME=$1 |
b75d00c4 MD |
8 | SYSCALL_NAME=$2 |
9 | ARG_NR=$3 | |
2879dbbc | 10 | TMPFILE=$(mktemp) |
9497697f | 11 | GENERIC_INOUT_DESCRIPTION_FILE="$(dirname "$0")/table-syscall-inout.txt" |
2879dbbc MJ |
12 | |
13 | # Delete temp file on exit | |
14 | trap 'rm -f "$TMPFILE"' EXIT | |
15 | ||
9497697f | 16 | if [ x"${GENERIC_INOUT_DESCRIPTION_FILE}" = x"" ]; then |
2879dbbc | 17 | echo "Error: Please specify input file name as first argument" >&2 |
b75d00c4 MD |
18 | exit 1 |
19 | fi | |
20 | ||
21 | if [ x"${SYSCALL_NAME}" = x"" ]; then | |
2879dbbc | 22 | echo "Error: Please specify system call name as second argument" >&2 |
b75d00c4 MD |
23 | exit 1 |
24 | fi | |
25 | ||
26 | if [[ x"${ARG_NR}" = x"" || ${ARG_NR} == 0 ]]; then | |
2879dbbc | 27 | echo "Error: Please specify argument number larger than 0 as third argument" >&2 |
b75d00c4 MD |
28 | exit 1 |
29 | fi | |
30 | ||
9497697f JG |
31 | # Search for the in/out description of a syscall. This function attempts to find |
32 | # a matching description in the per-architecture description override file (if it exists) | |
33 | # and falls back to the generic description file otherwise. | |
34 | # | |
35 | # Returns 0 if a description was found and written to the output file, 1 otherwise. | |
36 | function write_inout_description () | |
37 | { | |
38 | local arch_name=$1 | |
39 | local syscall_name=$2 | |
40 | local output_file=$3 | |
41 | local description_files=("$(dirname "$0")/table-syscall-inout-${arch_name}-override.txt" "$GENERIC_INOUT_DESCRIPTION_FILE") | |
42 | local found=0 | |
43 | ||
44 | for file in ${description_files[@]}; do | |
45 | if [ ! -f "$file" ]; then | |
46 | continue | |
47 | fi | |
48 | ||
49 | # Look for the syscall's in/out description | |
50 | grep "syscall ${syscall_name} " "${file}" > "${output_file}" || true | |
51 | ||
52 | # Error out if we got more than one syscall | |
53 | local match_count=$(wc -l < "${output_file}") | |
54 | if [ "${match_count}" -gt 1 ]; then | |
55 | # Fatal error; invalid description file | |
56 | echo "Error: more than one system call match" >&2 | |
57 | exit 1 | |
58 | elif [ "${match_count}" -eq 1 ]; then | |
59 | # Description found | |
60 | return 0 | |
61 | fi | |
62 | done | |
63 | ||
64 | return 1 | |
65 | } | |
66 | ||
2879dbbc MJ |
67 | # Abort on error and undefined variable |
68 | set -eu | |
69 | ||
b75d00c4 | 70 | |
2879dbbc | 71 | # Default to sc_inout for unknown syscalls |
9497697f | 72 | if ! write_inout_description "$ARCH_NAME" "$SYSCALL_NAME" "$TMPFILE"; then |
2879dbbc | 73 | echo "Warning: no match for syscall '${SYSCALL_NAME}', set to 'inout'" >&2 |
b75d00c4 MD |
74 | # no match, default to inout |
75 | echo "sc_inout" | |
76 | exit 0 | |
77 | fi | |
78 | ||
2879dbbc MJ |
79 | # Get the number of argument |
80 | SC_ARGS=$(sed 's/^syscall \([^ ]*\) nbargs \([^ ]*\) .*/\2/g' "${TMPFILE}") | |
b75d00c4 | 81 | |
2879dbbc MJ |
82 | if [ "${ARG_NR}" -gt "${SC_ARGS}" ]; then |
83 | echo "Error: argument number (${ARG_NR}) is larger than number of syscall arguments (${SC_ARGS})" >&2 | |
b75d00c4 MD |
84 | exit 1 |
85 | fi | |
86 | ||
2879dbbc MJ |
87 | if [ "${ARG_NR}" == 1 ]; then |
88 | SC_ARG_TYPE=$(sed 's/^syscall \([^ ]*\) nbargs \([^ ]*\) rw: (\([^,)]*\).*/\3/g' "${TMPFILE}") | |
b75d00c4 MD |
89 | fi |
90 | ||
2879dbbc MJ |
91 | if [ "${ARG_NR}" == 2 ]; then |
92 | SC_ARG_TYPE=$(sed 's/^syscall \([^ ]*\) nbargs \([^ ]*\) rw: ([^,]*, \([^,)]*\).*/\3/g' "${TMPFILE}") | |
b75d00c4 MD |
93 | fi |
94 | ||
2879dbbc MJ |
95 | if [ "${ARG_NR}" == 3 ]; then |
96 | SC_ARG_TYPE=$(sed 's/^syscall \([^ ]*\) nbargs \([^ ]*\) rw: ([^,]*, [^,]*, \([^,)]*\).*/\3/g' "${TMPFILE}") | |
b75d00c4 MD |
97 | fi |
98 | ||
2879dbbc MJ |
99 | if [ "${ARG_NR}" == 4 ]; then |
100 | SC_ARG_TYPE=$(sed 's/^syscall \([^ ]*\) nbargs \([^ ]*\) rw: ([^,]*, [^,]*, [^,]*, \([^,)]*\).*/\3/g' "${TMPFILE}") | |
b75d00c4 MD |
101 | fi |
102 | ||
2879dbbc MJ |
103 | if [ "${ARG_NR}" == 5 ]; then |
104 | SC_ARG_TYPE=$(sed 's/^syscall \([^ ]*\) nbargs \([^ ]*\) rw: ([^,]*, [^,]*, [^,]*, [^,]*, \([^,)]*\).*/\3/g' "${TMPFILE}") | |
b75d00c4 MD |
105 | fi |
106 | ||
2879dbbc MJ |
107 | if [ "${ARG_NR}" == 6 ]; then |
108 | SC_ARG_TYPE=$(sed 's/^syscall \([^ ]*\) nbargs \([^ ]*\) rw: ([^,]*, [^,]*, [^,]*, [^,]*, [^,]*, \([^,)]*\).*/\3/g' "${TMPFILE}") | |
b75d00c4 MD |
109 | fi |
110 | ||
b75d00c4 | 111 | |
2879dbbc | 112 | if [ "${SC_ARG_TYPE}" = "r" ]; then |
b75d00c4 MD |
113 | echo "sc_in" |
114 | fi | |
2879dbbc | 115 | if [ "${SC_ARG_TYPE}" = "w" ]; then |
b75d00c4 MD |
116 | echo "sc_out" |
117 | fi | |
2879dbbc | 118 | if [ "${SC_ARG_TYPE}" = "rw" ]; then |
b75d00c4 MD |
119 | echo "sc_inout" |
120 | fi | |
121 | ||
2879dbbc | 122 | # EOF |