aboutsummaryrefslogtreecommitdiffstats
path: root/litmus
diff options
context:
space:
mode:
authorBjoern Brandenburg <bbb@mpi-sws.org>2015-12-16 05:16:05 -0500
committerBjoern Brandenburg <bbb@mpi-sws.org>2016-03-08 09:21:31 -0500
commite2a78015a8ea4648a543d475fcfd3438b2c50dac (patch)
tree39fd753bc81169a202e2ead199f3d8d3f85ad08d /litmus
parenta8037999bfc074ddfc231ae5af10be3da1511878 (diff)
Expose LITMUS^RT system calls via control page ioctl()
Rationale: make LITMUS^RT ops available in a way that does not create merge conflicts each time we rebase LITMUS^RT on top of a new kernel version. This also helps with portability to different architectures, as we no longer need to patch each architecture's syscall table.
Diffstat (limited to 'litmus')
-rw-r--r--litmus/ctrldev.c97
1 files changed, 97 insertions, 0 deletions
diff --git a/litmus/ctrldev.c b/litmus/ctrldev.c
index 877f2786b4c8..3c8bbdb7c782 100644
--- a/litmus/ctrldev.c
+++ b/litmus/ctrldev.c
@@ -3,6 +3,8 @@
3#include <linux/fs.h> 3#include <linux/fs.h>
4#include <linux/miscdevice.h> 4#include <linux/miscdevice.h>
5#include <linux/module.h> 5#include <linux/module.h>
6#include <linux/uaccess.h>
7
6 8
7#include <litmus/litmus.h> 9#include <litmus/litmus.h>
8 10
@@ -116,9 +118,104 @@ static int litmus_ctrl_mmap(struct file* filp, struct vm_area_struct* vma)
116 return err; 118 return err;
117} 119}
118 120
121/* LITMUS^RT system calls */
122
123asmlinkage long sys_set_rt_task_param(pid_t pid, struct rt_task __user * param);
124asmlinkage long sys_get_rt_task_param(pid_t pid, struct rt_task __user * param);
125asmlinkage long sys_get_current_budget(lt_t __user * _expended, lt_t __user *_remaining);
126asmlinkage long sys_null_call(cycles_t __user *ts);
127asmlinkage long sys_od_open(int fd, int type, int obj_id, void* __user config);
128asmlinkage long sys_od_close(int od);
129asmlinkage long sys_complete_job(void);
130asmlinkage long sys_litmus_lock(int lock_od);
131asmlinkage long sys_litmus_unlock(int lock_od);
132asmlinkage long sys_wait_for_job_release(unsigned int job);
133asmlinkage long sys_wait_for_ts_release(void);
134asmlinkage long sys_release_ts(lt_t __user *__delay);
135
136static long litmus_ctrl_ioctl(struct file *filp,
137 unsigned int cmd, unsigned long arg)
138{
139 long err = -ENOIOCTLCMD;
140
141 /* LITMUS^RT syscall emulation: we expose LITMUS^RT-specific operations
142 * via ioctl() to avoid merge conflicts with the syscall tables when
143 * rebasing LITMUS^RT. Whi this is not the most elegant way to expose
144 * syscall-like functionality, it helps with reducing the effort
145 * required to maintain LITMUS^RT out of tree.
146 */
147
148 union litmus_syscall_args syscall_args;
149
150 switch (cmd) {
151 case LRT_set_rt_task_param:
152 case LRT_get_rt_task_param:
153 case LRT_get_current_budget:
154 case LRT_od_open:
155 /* multiple arguments => need to get args via pointer */
156 /* get syscall parameters */
157 if (copy_from_user(&syscall_args, (void*) arg,
158 sizeof(syscall_args))) {
159 return -EFAULT;
160 }
161
162 switch (cmd) {
163 case LRT_set_rt_task_param:
164 return sys_set_rt_task_param(
165 syscall_args.get_set_task_param.pid,
166 syscall_args.get_set_task_param.param);
167 case LRT_get_rt_task_param:
168 return sys_get_rt_task_param(
169 syscall_args.get_set_task_param.pid,
170 syscall_args.get_set_task_param.param);
171 case LRT_get_current_budget:
172 return sys_get_current_budget(
173 syscall_args.get_current_budget.expended,
174 syscall_args.get_current_budget.remaining);
175 case LRT_od_open:
176 return sys_od_open(
177 syscall_args.od_open.fd,
178 syscall_args.od_open.obj_type,
179 syscall_args.od_open.obj_id,
180 syscall_args.od_open.config);
181 }
182
183
184 case LRT_null_call:
185 return sys_null_call((cycles_t __user *) arg);
186
187 case LRT_od_close:
188 return sys_od_close(arg);
189
190 case LRT_complete_job:
191 return sys_complete_job();
192
193 case LRT_litmus_lock:
194 return sys_litmus_lock(arg);
195
196 case LRT_litmus_unlock:
197 return sys_litmus_unlock(arg);
198
199 case LRT_wait_for_job_release:
200 return sys_wait_for_job_release(arg);
201
202 case LRT_wait_for_ts_release:
203 return sys_wait_for_ts_release();
204
205 case LRT_release_ts:
206 return sys_release_ts((lt_t __user *) arg);
207
208 default:
209 printk(KERN_DEBUG "ctrldev: strange ioctl (%u, %lu)\n", cmd, arg);
210 };
211
212 return err;
213}
214
119static struct file_operations litmus_ctrl_fops = { 215static struct file_operations litmus_ctrl_fops = {
120 .owner = THIS_MODULE, 216 .owner = THIS_MODULE,
121 .mmap = litmus_ctrl_mmap, 217 .mmap = litmus_ctrl_mmap,
218 .unlocked_ioctl = litmus_ctrl_ioctl,
122}; 219};
123 220
124static struct miscdevice litmus_ctrl_dev = { 221static struct miscdevice litmus_ctrl_dev = {