162306a36Sopenharmony_ci// SPDX-License-Identifier: LGPL-2.1
262306a36Sopenharmony_ci#include <sched.h>
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci/*
562306a36Sopenharmony_ci * Not defined anywhere else, probably, just to make sure we
662306a36Sopenharmony_ci * catch future flags
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci#define SCHED_POLICY_MASK 0xff
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifndef SCHED_DEADLINE
1162306a36Sopenharmony_ci#define SCHED_DEADLINE 6
1262306a36Sopenharmony_ci#endif
1362306a36Sopenharmony_ci#ifndef SCHED_RESET_ON_FORK
1462306a36Sopenharmony_ci#define SCHED_RESET_ON_FORK 0x40000000
1562306a36Sopenharmony_ci#endif
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_cistatic size_t syscall_arg__scnprintf_sched_policy(char *bf, size_t size,
1862306a36Sopenharmony_ci						  struct syscall_arg *arg)
1962306a36Sopenharmony_ci{
2062306a36Sopenharmony_ci	bool show_prefix = arg->show_string_prefix;
2162306a36Sopenharmony_ci	const char *prefix = "SCHED_";
2262306a36Sopenharmony_ci	const char *policies[] = {
2362306a36Sopenharmony_ci		"NORMAL", "FIFO", "RR", "BATCH", "ISO", "IDLE", "DEADLINE",
2462306a36Sopenharmony_ci	};
2562306a36Sopenharmony_ci	size_t printed;
2662306a36Sopenharmony_ci	int policy = arg->val,
2762306a36Sopenharmony_ci	    flags = policy & ~SCHED_POLICY_MASK;
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci	policy &= SCHED_POLICY_MASK;
3062306a36Sopenharmony_ci	if (policy <= SCHED_DEADLINE)
3162306a36Sopenharmony_ci		printed = scnprintf(bf, size, "%s%s", show_prefix ? prefix : "", policies[policy]);
3262306a36Sopenharmony_ci	else
3362306a36Sopenharmony_ci		printed = scnprintf(bf, size, "%#x", policy);
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci#define	P_POLICY_FLAG(n) \
3662306a36Sopenharmony_ci	if (flags & SCHED_##n) { \
3762306a36Sopenharmony_ci		printed += scnprintf(bf + printed, size - printed, "|%s%s", show_prefix ? prefix : "",  #n); \
3862306a36Sopenharmony_ci		flags &= ~SCHED_##n; \
3962306a36Sopenharmony_ci	}
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci	P_POLICY_FLAG(RESET_ON_FORK);
4262306a36Sopenharmony_ci#undef P_POLICY_FLAG
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci	if (flags)
4562306a36Sopenharmony_ci		printed += scnprintf(bf + printed, size - printed, "|%#x", flags);
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	return printed;
4862306a36Sopenharmony_ci}
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci#define SCA_SCHED_POLICY syscall_arg__scnprintf_sched_policy
51