162306a36Sopenharmony_ci// SPDX-License-Identifier: LGPL-2.1 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * trace/beauty/pkey_alloc.c 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2017, Red Hat Inc, Arnaldo Carvalho de Melo <acme@redhat.com> 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include "trace/beauty/beauty.h" 962306a36Sopenharmony_ci#include <linux/kernel.h> 1062306a36Sopenharmony_ci#include <linux/log2.h> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_cisize_t strarray__scnprintf_flags(struct strarray *sa, char *bf, size_t size, bool show_prefix, unsigned long flags) 1362306a36Sopenharmony_ci{ 1462306a36Sopenharmony_ci int i, printed = 0; 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci if (flags == 0) { 1762306a36Sopenharmony_ci const char *s = sa->entries[0]; 1862306a36Sopenharmony_ci if (s) 1962306a36Sopenharmony_ci return scnprintf(bf, size, "%s%s", show_prefix ? sa->prefix : "", s); 2062306a36Sopenharmony_ci return scnprintf(bf, size, "%d", 0); 2162306a36Sopenharmony_ci } 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci for (i = 1; i < sa->nr_entries; ++i) { 2462306a36Sopenharmony_ci unsigned long bit = 1UL << (i - 1); 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci if (!(flags & bit)) 2762306a36Sopenharmony_ci continue; 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci if (printed != 0) 3062306a36Sopenharmony_ci printed += scnprintf(bf + printed, size - printed, "|"); 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci if (sa->entries[i] != NULL) 3362306a36Sopenharmony_ci printed += scnprintf(bf + printed, size - printed, "%s%s", show_prefix ? sa->prefix : "", sa->entries[i]); 3462306a36Sopenharmony_ci else 3562306a36Sopenharmony_ci printed += scnprintf(bf + printed, size - printed, "0x%#", bit); 3662306a36Sopenharmony_ci } 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci return printed; 3962306a36Sopenharmony_ci} 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_cistatic size_t pkey_alloc__scnprintf_access_rights(int access_rights, char *bf, size_t size, bool show_prefix) 4262306a36Sopenharmony_ci{ 4362306a36Sopenharmony_ci#include "trace/beauty/generated/pkey_alloc_access_rights_array.c" 4462306a36Sopenharmony_ci static DEFINE_STRARRAY(pkey_alloc_access_rights, "PKEY_"); 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci return strarray__scnprintf_flags(&strarray__pkey_alloc_access_rights, bf, size, show_prefix, access_rights); 4762306a36Sopenharmony_ci} 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cisize_t syscall_arg__scnprintf_pkey_alloc_access_rights(char *bf, size_t size, struct syscall_arg *arg) 5062306a36Sopenharmony_ci{ 5162306a36Sopenharmony_ci unsigned long cmd = arg->val; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci return pkey_alloc__scnprintf_access_rights(cmd, bf, size, arg->show_string_prefix); 5462306a36Sopenharmony_ci} 55