~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/tools/perf/util/syscalltbl.c

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 // SPDX-License-Identifier: GPL-2.0-only
  2 /*
  3  * System call table mapper
  4  *
  5  * (C) 2016 Arnaldo Carvalho de Melo <acme@redhat.com>
  6  */
  7 
  8 #include "syscalltbl.h"
  9 #include <stdlib.h>
 10 #include <linux/compiler.h>
 11 #include <linux/zalloc.h>
 12 
 13 #ifdef HAVE_SYSCALL_TABLE_SUPPORT
 14 #include <string.h>
 15 #include "string2.h"
 16 
 17 #if defined(__x86_64__)
 18 #include <asm/syscalls_64.c>
 19 const int syscalltbl_native_max_id = SYSCALLTBL_x86_64_MAX_ID;
 20 static const char *const *syscalltbl_native = syscalltbl_x86_64;
 21 #elif defined(__s390x__)
 22 #include <asm/syscalls_64.c>
 23 const int syscalltbl_native_max_id = SYSCALLTBL_S390_64_MAX_ID;
 24 static const char *const *syscalltbl_native = syscalltbl_s390_64;
 25 #elif defined(__powerpc64__)
 26 #include <asm/syscalls_64.c>
 27 const int syscalltbl_native_max_id = SYSCALLTBL_POWERPC_64_MAX_ID;
 28 static const char *const *syscalltbl_native = syscalltbl_powerpc_64;
 29 #elif defined(__powerpc__)
 30 #include <asm/syscalls_32.c>
 31 const int syscalltbl_native_max_id = SYSCALLTBL_POWERPC_32_MAX_ID;
 32 static const char *const *syscalltbl_native = syscalltbl_powerpc_32;
 33 #elif defined(__aarch64__)
 34 #include <asm/syscalls.c>
 35 const int syscalltbl_native_max_id = SYSCALLTBL_ARM64_MAX_ID;
 36 static const char *const *syscalltbl_native = syscalltbl_arm64;
 37 #elif defined(__mips__)
 38 #include <asm/syscalls_n64.c>
 39 const int syscalltbl_native_max_id = SYSCALLTBL_MIPS_N64_MAX_ID;
 40 static const char *const *syscalltbl_native = syscalltbl_mips_n64;
 41 #elif defined(__loongarch__)
 42 #include <asm/syscalls.c>
 43 const int syscalltbl_native_max_id = SYSCALLTBL_LOONGARCH_MAX_ID;
 44 static const char *const *syscalltbl_native = syscalltbl_loongarch;
 45 #endif
 46 
 47 struct syscall {
 48         int id;
 49         const char *name;
 50 };
 51 
 52 static int syscallcmpname(const void *vkey, const void *ventry)
 53 {
 54         const char *key = vkey;
 55         const struct syscall *entry = ventry;
 56 
 57         return strcmp(key, entry->name);
 58 }
 59 
 60 static int syscallcmp(const void *va, const void *vb)
 61 {
 62         const struct syscall *a = va, *b = vb;
 63 
 64         return strcmp(a->name, b->name);
 65 }
 66 
 67 static int syscalltbl__init_native(struct syscalltbl *tbl)
 68 {
 69         int nr_entries = 0, i, j;
 70         struct syscall *entries;
 71 
 72         for (i = 0; i <= syscalltbl_native_max_id; ++i)
 73                 if (syscalltbl_native[i])
 74                         ++nr_entries;
 75 
 76         entries = tbl->syscalls.entries = malloc(sizeof(struct syscall) * nr_entries);
 77         if (tbl->syscalls.entries == NULL)
 78                 return -1;
 79 
 80         for (i = 0, j = 0; i <= syscalltbl_native_max_id; ++i) {
 81                 if (syscalltbl_native[i]) {
 82                         entries[j].name = syscalltbl_native[i];
 83                         entries[j].id = i;
 84                         ++j;
 85                 }
 86         }
 87 
 88         qsort(tbl->syscalls.entries, nr_entries, sizeof(struct syscall), syscallcmp);
 89         tbl->syscalls.nr_entries = nr_entries;
 90         tbl->syscalls.max_id     = syscalltbl_native_max_id;
 91         return 0;
 92 }
 93 
 94 struct syscalltbl *syscalltbl__new(void)
 95 {
 96         struct syscalltbl *tbl = malloc(sizeof(*tbl));
 97         if (tbl) {
 98                 if (syscalltbl__init_native(tbl)) {
 99                         free(tbl);
100                         return NULL;
101                 }
102         }
103         return tbl;
104 }
105 
106 void syscalltbl__delete(struct syscalltbl *tbl)
107 {
108         zfree(&tbl->syscalls.entries);
109         free(tbl);
110 }
111 
112 const char *syscalltbl__name(const struct syscalltbl *tbl __maybe_unused, int id)
113 {
114         return id <= syscalltbl_native_max_id ? syscalltbl_native[id]: NULL;
115 }
116 
117 int syscalltbl__id(struct syscalltbl *tbl, const char *name)
118 {
119         struct syscall *sc = bsearch(name, tbl->syscalls.entries,
120                                      tbl->syscalls.nr_entries, sizeof(*sc),
121                                      syscallcmpname);
122 
123         return sc ? sc->id : -1;
124 }
125 
126 int syscalltbl__id_at_idx(struct syscalltbl *tbl, int idx)
127 {
128         struct syscall *syscalls = tbl->syscalls.entries;
129 
130         return idx < tbl->syscalls.nr_entries ? syscalls[idx].id : -1;
131 }
132 
133 int syscalltbl__strglobmatch_next(struct syscalltbl *tbl, const char *syscall_glob, int *idx)
134 {
135         int i;
136         struct syscall *syscalls = tbl->syscalls.entries;
137 
138         for (i = *idx + 1; i < tbl->syscalls.nr_entries; ++i) {
139                 if (strglobmatch(syscalls[i].name, syscall_glob)) {
140                         *idx = i;
141                         return syscalls[i].id;
142                 }
143         }
144 
145         return -1;
146 }
147 
148 int syscalltbl__strglobmatch_first(struct syscalltbl *tbl, const char *syscall_glob, int *idx)
149 {
150         *idx = -1;
151         return syscalltbl__strglobmatch_next(tbl, syscall_glob, idx);
152 }
153 
154 #else /* HAVE_SYSCALL_TABLE_SUPPORT */
155 
156 #include <libaudit.h>
157 
158 struct syscalltbl *syscalltbl__new(void)
159 {
160         struct syscalltbl *tbl = zalloc(sizeof(*tbl));
161         if (tbl)
162                 tbl->audit_machine = audit_detect_machine();
163         return tbl;
164 }
165 
166 void syscalltbl__delete(struct syscalltbl *tbl)
167 {
168         free(tbl);
169 }
170 
171 const char *syscalltbl__name(const struct syscalltbl *tbl, int id)
172 {
173         return audit_syscall_to_name(id, tbl->audit_machine);
174 }
175 
176 int syscalltbl__id(struct syscalltbl *tbl, const char *name)
177 {
178         return audit_name_to_syscall(name, tbl->audit_machine);
179 }
180 
181 int syscalltbl__strglobmatch_next(struct syscalltbl *tbl __maybe_unused,
182                                   const char *syscall_glob __maybe_unused, int *idx __maybe_unused)
183 {
184         return -1;
185 }
186 
187 int syscalltbl__strglobmatch_first(struct syscalltbl *tbl, const char *syscall_glob, int *idx)
188 {
189         return syscalltbl__strglobmatch_next(tbl, syscall_glob, idx);
190 }
191 #endif /* HAVE_SYSCALL_TABLE_SUPPORT */
192 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php