162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2020 Collabora Ltd.
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci#ifndef _SYSCALL_USER_DISPATCH_H
662306a36Sopenharmony_ci#define _SYSCALL_USER_DISPATCH_H
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/thread_info.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#ifdef CONFIG_GENERIC_ENTRY
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_cistruct syscall_user_dispatch {
1362306a36Sopenharmony_ci	char __user	*selector;
1462306a36Sopenharmony_ci	unsigned long	offset;
1562306a36Sopenharmony_ci	unsigned long	len;
1662306a36Sopenharmony_ci	bool		on_dispatch;
1762306a36Sopenharmony_ci};
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ciint set_syscall_user_dispatch(unsigned long mode, unsigned long offset,
2062306a36Sopenharmony_ci			      unsigned long len, char __user *selector);
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#define clear_syscall_work_syscall_user_dispatch(tsk) \
2362306a36Sopenharmony_ci	clear_task_syscall_work(tsk, SYSCALL_USER_DISPATCH)
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ciint syscall_user_dispatch_get_config(struct task_struct *task, unsigned long size,
2662306a36Sopenharmony_ci				     void __user *data);
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ciint syscall_user_dispatch_set_config(struct task_struct *task, unsigned long size,
2962306a36Sopenharmony_ci				     void __user *data);
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci#else
3262306a36Sopenharmony_cistruct syscall_user_dispatch {};
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistatic inline int set_syscall_user_dispatch(unsigned long mode, unsigned long offset,
3562306a36Sopenharmony_ci					    unsigned long len, char __user *selector)
3662306a36Sopenharmony_ci{
3762306a36Sopenharmony_ci	return -EINVAL;
3862306a36Sopenharmony_ci}
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cistatic inline void clear_syscall_work_syscall_user_dispatch(struct task_struct *tsk)
4162306a36Sopenharmony_ci{
4262306a36Sopenharmony_ci}
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_cistatic inline int syscall_user_dispatch_get_config(struct task_struct *task,
4562306a36Sopenharmony_ci						   unsigned long size, void __user *data)
4662306a36Sopenharmony_ci{
4762306a36Sopenharmony_ci	return -EINVAL;
4862306a36Sopenharmony_ci}
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_cistatic inline int syscall_user_dispatch_set_config(struct task_struct *task,
5162306a36Sopenharmony_ci						   unsigned long size, void __user *data)
5262306a36Sopenharmony_ci{
5362306a36Sopenharmony_ci	return -EINVAL;
5462306a36Sopenharmony_ci}
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci#endif /* CONFIG_GENERIC_ENTRY */
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci#endif /* _SYSCALL_USER_DISPATCH_H */
59