1#include "defs.h"
2
3enum {
4	IOPRIO_WHO_PROCESS = 1,
5	IOPRIO_WHO_PGRP,
6	IOPRIO_WHO_USER
7};
8
9#include "xlat/ioprio_who.h"
10
11enum {
12	IOPRIO_CLASS_NONE,
13	IOPRIO_CLASS_RT,
14	IOPRIO_CLASS_BE,
15	IOPRIO_CLASS_IDLE
16};
17
18#include "xlat/ioprio_class.h"
19
20#define IOPRIO_CLASS_SHIFT	(13)
21#define IOPRIO_PRIO_MASK	((1ul << IOPRIO_CLASS_SHIFT) - 1)
22
23#define IOPRIO_PRIO_CLASS(mask)	((mask) >> IOPRIO_CLASS_SHIFT)
24#define IOPRIO_PRIO_DATA(mask)	((mask) & IOPRIO_PRIO_MASK)
25
26static const char *
27sprint_ioprio(int ioprio)
28{
29	static char outstr[256];
30	const char *str;
31	int class, data;
32
33	class = IOPRIO_PRIO_CLASS(ioprio);
34	data = IOPRIO_PRIO_DATA(ioprio);
35	str = xlookup(ioprio_class, class);
36	if (str)
37		sprintf(outstr, "IOPRIO_PRIO_VALUE(%s,%d)", str, data);
38	else
39		sprintf(outstr, "IOPRIO_PRIO_VALUE(%#x /* %s */,%d)",
40			class, "IOPRIO_CLASS_???", data);
41
42	return outstr;
43}
44
45int
46sys_ioprio_get(struct tcb *tcp)
47{
48	if (entering(tcp)) {
49		/* int which */
50		printxval(ioprio_who, tcp->u_arg[0], "IOPRIO_WHO_???");
51		/* int who */
52		tprintf(", %d", (int) tcp->u_arg[1]);
53		return 0;
54	} else {
55		if (syserror(tcp))
56			return 0;
57
58		tcp->auxstr = sprint_ioprio(tcp->u_rval);
59		return RVAL_STR;
60	}
61}
62
63int
64sys_ioprio_set(struct tcb *tcp)
65{
66	if (entering(tcp)) {
67		/* int which */
68		printxval(ioprio_who, tcp->u_arg[0], "IOPRIO_WHO_???");
69		/* int who */
70		tprintf(", %d, ", (int) tcp->u_arg[1]);
71		/* int ioprio */
72		tprints(sprint_ioprio(tcp->u_arg[2]));
73	}
74	return 0;
75}
76