11446e1dfSGabriel Krisman Bertazi /* SPDX-License-Identifier: GPL-2.0 */
21446e1dfSGabriel Krisman Bertazi /*
31446e1dfSGabriel Krisman Bertazi  * Copyright (C) 2020 Collabora Ltd.
41446e1dfSGabriel Krisman Bertazi  */
51446e1dfSGabriel Krisman Bertazi #ifndef _SYSCALL_USER_DISPATCH_H
61446e1dfSGabriel Krisman Bertazi #define _SYSCALL_USER_DISPATCH_H
71446e1dfSGabriel Krisman Bertazi 
81446e1dfSGabriel Krisman Bertazi #include <linux/thread_info.h>
91446e1dfSGabriel Krisman Bertazi 
101446e1dfSGabriel Krisman Bertazi #ifdef CONFIG_GENERIC_ENTRY
111446e1dfSGabriel Krisman Bertazi 
121446e1dfSGabriel Krisman Bertazi struct syscall_user_dispatch {
131446e1dfSGabriel Krisman Bertazi 	char __user	*selector;
141446e1dfSGabriel Krisman Bertazi 	unsigned long	offset;
151446e1dfSGabriel Krisman Bertazi 	unsigned long	len;
161446e1dfSGabriel Krisman Bertazi 	bool		on_dispatch;
171446e1dfSGabriel Krisman Bertazi };
181446e1dfSGabriel Krisman Bertazi 
191446e1dfSGabriel Krisman Bertazi int set_syscall_user_dispatch(unsigned long mode, unsigned long offset,
201446e1dfSGabriel Krisman Bertazi 			      unsigned long len, char __user *selector);
211446e1dfSGabriel Krisman Bertazi 
221446e1dfSGabriel Krisman Bertazi #define clear_syscall_work_syscall_user_dispatch(tsk) \
231446e1dfSGabriel Krisman Bertazi 	clear_task_syscall_work(tsk, SYSCALL_USER_DISPATCH)
241446e1dfSGabriel Krisman Bertazi 
25*3f67987cSGregory Price int syscall_user_dispatch_get_config(struct task_struct *task, unsigned long size,
26*3f67987cSGregory Price 				     void __user *data);
27*3f67987cSGregory Price 
28*3f67987cSGregory Price int syscall_user_dispatch_set_config(struct task_struct *task, unsigned long size,
29*3f67987cSGregory Price 				     void __user *data);
30*3f67987cSGregory Price 
311446e1dfSGabriel Krisman Bertazi #else
321446e1dfSGabriel Krisman Bertazi struct syscall_user_dispatch {};
331446e1dfSGabriel Krisman Bertazi 
set_syscall_user_dispatch(unsigned long mode,unsigned long offset,unsigned long len,char __user * selector)341446e1dfSGabriel Krisman Bertazi static inline int set_syscall_user_dispatch(unsigned long mode, unsigned long offset,
351446e1dfSGabriel Krisman Bertazi 					    unsigned long len, char __user *selector)
361446e1dfSGabriel Krisman Bertazi {
371446e1dfSGabriel Krisman Bertazi 	return -EINVAL;
381446e1dfSGabriel Krisman Bertazi }
391446e1dfSGabriel Krisman Bertazi 
clear_syscall_work_syscall_user_dispatch(struct task_struct * tsk)401446e1dfSGabriel Krisman Bertazi static inline void clear_syscall_work_syscall_user_dispatch(struct task_struct *tsk)
411446e1dfSGabriel Krisman Bertazi {
421446e1dfSGabriel Krisman Bertazi }
431446e1dfSGabriel Krisman Bertazi 
syscall_user_dispatch_get_config(struct task_struct * task,unsigned long size,void __user * data)44*3f67987cSGregory Price static inline int syscall_user_dispatch_get_config(struct task_struct *task,
45*3f67987cSGregory Price 						   unsigned long size, void __user *data)
46*3f67987cSGregory Price {
47*3f67987cSGregory Price 	return -EINVAL;
48*3f67987cSGregory Price }
49*3f67987cSGregory Price 
syscall_user_dispatch_set_config(struct task_struct * task,unsigned long size,void __user * data)50*3f67987cSGregory Price static inline int syscall_user_dispatch_set_config(struct task_struct *task,
51*3f67987cSGregory Price 						   unsigned long size, void __user *data)
52*3f67987cSGregory Price {
53*3f67987cSGregory Price 	return -EINVAL;
54*3f67987cSGregory Price }
55*3f67987cSGregory Price 
561446e1dfSGabriel Krisman Bertazi #endif /* CONFIG_GENERIC_ENTRY */
571446e1dfSGabriel Krisman Bertazi 
581446e1dfSGabriel Krisman Bertazi #endif /* _SYSCALL_USER_DISPATCH_H */
59