diff options
author | Bjoern Brandenburg <bbb@mpi-sws.org> | 2015-12-16 05:16:05 -0500 |
---|---|---|
committer | Bjoern Brandenburg <bbb@mpi-sws.org> | 2016-03-08 09:21:31 -0500 |
commit | e2a78015a8ea4648a543d475fcfd3438b2c50dac (patch) | |
tree | 39fd753bc81169a202e2ead199f3d8d3f85ad08d /litmus | |
parent | a8037999bfc074ddfc231ae5af10be3da1511878 (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.c | 97 |
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 | |||
123 | asmlinkage long sys_set_rt_task_param(pid_t pid, struct rt_task __user * param); | ||
124 | asmlinkage long sys_get_rt_task_param(pid_t pid, struct rt_task __user * param); | ||
125 | asmlinkage long sys_get_current_budget(lt_t __user * _expended, lt_t __user *_remaining); | ||
126 | asmlinkage long sys_null_call(cycles_t __user *ts); | ||
127 | asmlinkage long sys_od_open(int fd, int type, int obj_id, void* __user config); | ||
128 | asmlinkage long sys_od_close(int od); | ||
129 | asmlinkage long sys_complete_job(void); | ||
130 | asmlinkage long sys_litmus_lock(int lock_od); | ||
131 | asmlinkage long sys_litmus_unlock(int lock_od); | ||
132 | asmlinkage long sys_wait_for_job_release(unsigned int job); | ||
133 | asmlinkage long sys_wait_for_ts_release(void); | ||
134 | asmlinkage long sys_release_ts(lt_t __user *__delay); | ||
135 | |||
136 | static 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 | |||
119 | static struct file_operations litmus_ctrl_fops = { | 215 | static 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 | ||
124 | static struct miscdevice litmus_ctrl_dev = { | 221 | static struct miscdevice litmus_ctrl_dev = { |