| // SPDX-License-Identifier: LGPL-2.1 |
| /* |
| * trace/beauty/pkey_alloc.c |
| * |
| * Copyright (C) 2017, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com> |
| */ |
| |
| #include "trace/beauty/beauty.h" |
| #include <linux/kernel.h> |
| #include <linux/log2.h> |
| |
| size_t strarray__scnprintf_flags(struct strarray *sa, char *bf, size_t size, bool show_prefix, unsigned long flags) |
| { |
| int i, printed = 0; |
| |
| if (flags == 0) { |
| const char *s = sa->entries[0]; |
| if (s) |
| return scnprintf(bf, size, "%s%s", show_prefix ? sa->prefix : "", s); |
| return scnprintf(bf, size, "%d", 0); |
| } |
| |
| for (i = 1; i < sa->nr_entries; ++i) { |
| unsigned long bit = 1UL << (i - 1); |
| |
| if (!(flags & bit)) |
| continue; |
| |
| if (printed != 0) |
| printed += scnprintf(bf + printed, size - printed, "|"); |
| |
| if (sa->entries[i] != NULL) |
| printed += scnprintf(bf + printed, size - printed, "%s%s", show_prefix ? sa->prefix : "", sa->entries[i]); |
| else |
| printed += scnprintf(bf + printed, size - printed, "0x%#", bit); |
| } |
| |
| return printed; |
| } |
| |
| static size_t pkey_alloc__scnprintf_access_rights(int access_rights, char *bf, size_t size, bool show_prefix) |
| { |
| #include "trace/beauty/generated/pkey_alloc_access_rights_array.c" |
| static DEFINE_STRARRAY(pkey_alloc_access_rights, "PKEY_"); |
| |
| return strarray__scnprintf_flags(&strarray__pkey_alloc_access_rights, bf, size, show_prefix, access_rights); |
| } |
| |
| size_t syscall_arg__scnprintf_pkey_alloc_access_rights(char *bf, size_t size, struct syscall_arg *arg) |
| { |
| unsigned long cmd = arg->val; |
| |
| return pkey_alloc__scnprintf_access_rights(cmd, bf, size, arg->show_string_prefix); |
| } |