aboutsummaryrefslogtreecommitdiffstats
path: root/src/syscalls.c
blob: d3ca5d89afe84573bc84fbf05b79d270f0ececc3 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/* To get syscall() we need to define _GNU_SOURCE
 * in modern glibc versions.
 */

/* imported from the kernel source tree */
#include "asm/unistd.h"

/* for syscall() */
#include <unistd.h>

#include "litmus.h"

/*	Syscall stub for setting RT mode and scheduling options */

pid_t gettid(void)
{
	return syscall(__NR_gettid);
}

int set_rt_task_param(pid_t pid, struct rt_task *param)
{
	if (param->budget_signal_policy != NO_SIGNALS) {
		/* drop all signals until they're explicitly activated by
		 * user code. */
		ignore_litmus_signals(SIG_BUDGET);
	}

	return syscall(__NR_set_rt_task_param, pid, param);
}

int get_rt_task_param(pid_t pid, struct rt_task *param)
{
	return syscall(__NR_get_rt_task_param, pid, param);
}

int sleep_next_period(void)
{
	return syscall(__NR_complete_job);
}

int od_openx(int fd, obj_type_t type, int obj_id, void *config)
{
	return syscall(__NR_od_open, fd, type, obj_id, config);
}

int od_close(int od)
{
	return syscall(__NR_od_close, od);
}

int litmus_lock(int od)
{
	return syscall(__NR_litmus_lock, od);
}

int litmus_unlock(int od)
{
	return syscall(__NR_litmus_unlock, od);
}

int litmus_dgl_lock(int *ods, int dgl_size)
{
	return syscall(__NR_litmus_dgl_lock, ods, dgl_size);
}

int litmus_dgl_unlock(int *ods, int dgl_size)
{
	return syscall(__NR_litmus_dgl_unlock, ods, dgl_size);
}

int get_job_no(unsigned int *job_no)
{
	return syscall(__NR_query_job_no, job_no);
}

int wait_for_job_release(unsigned int job_no)
{
	return syscall(__NR_wait_for_job_release, job_no);
}

int sched_setscheduler(pid_t pid, int policy, int* priority)
{
	return syscall(__NR_sched_setscheduler, pid, policy, priority);
}

int sched_getscheduler(pid_t pid)
{
	return syscall(__NR_sched_getscheduler, pid);
}

static int __wait_for_ts_release(struct timespec *release)
{
	return syscall(__NR_wait_for_ts_release, release);
}

int wait_for_ts_release(void)
{
	return __wait_for_ts_release(NULL);
}

int wait_for_ts_release2(struct timespec *release)
{
	return __wait_for_ts_release(release);
}

int release_ts(lt_t *delay)
{
	return syscall(__NR_release_ts, delay);
}

int null_call(cycles_t *timestamp)
{
	return syscall(__NR_null_call, timestamp);
}

int enable_aux_rt_tasks(int flags)
{
	return syscall(__NR_set_aux_tasks, flags | AUX_ENABLE);
}

int disable_aux_rt_tasks(int flags)
{
	return syscall(__NR_set_aux_tasks, flags & ~AUX_ENABLE);
}

int inject_name(void)
{
	return syscall(__NR_sched_trace_event, ST_INJECT_NAME, NULL);
}

int inject_param(void)
{
	return syscall(__NR_sched_trace_event, ST_INJECT_PARAM, NULL);
}

int inject_release(lt_t release, lt_t deadline, unsigned int job_no)
{
	struct st_inject_args args = {.release = release, .deadline = deadline, .job_no = job_no};
	return syscall(__NR_sched_trace_event, ST_INJECT_RELEASE, &args);
}

int inject_completion(unsigned int job_no)
{
	struct st_inject_args args = {.release = 0, .deadline = 0, .job_no = job_no};
	return syscall(__NR_sched_trace_event, ST_INJECT_COMPLETION, &args);
}

int inject_gpu_migration(unsigned int to, unsigned int from)
{
	struct st_inject_args args = {.to = to, .from = from};
	return syscall(__NR_sched_trace_event, ST_INJECT_MIGRATION, &args);
}

int __inject_action(unsigned int action)
{
	struct st_inject_args args = {.action = action};
	return syscall(__NR_sched_trace_event, ST_INJECT_ACTION, &args);
}