162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci#ifndef __ASM_SYSCALL_H
462306a36Sopenharmony_ci#define __ASM_SYSCALL_H
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <linux/sched.h>
762306a36Sopenharmony_ci#include <linux/err.h>
862306a36Sopenharmony_ci#include <abi/regdef.h>
962306a36Sopenharmony_ci#include <uapi/linux/audit.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ciextern void *sys_call_table[];
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_cistatic inline int
1462306a36Sopenharmony_cisyscall_get_nr(struct task_struct *task, struct pt_regs *regs)
1562306a36Sopenharmony_ci{
1662306a36Sopenharmony_ci	return regs_syscallid(regs);
1762306a36Sopenharmony_ci}
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cistatic inline void
2062306a36Sopenharmony_cisyscall_set_nr(struct task_struct *task, struct pt_regs *regs,
2162306a36Sopenharmony_ci	       int sysno)
2262306a36Sopenharmony_ci{
2362306a36Sopenharmony_ci	regs_syscallid(regs) = sysno;
2462306a36Sopenharmony_ci}
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_cistatic inline void
2762306a36Sopenharmony_cisyscall_rollback(struct task_struct *task, struct pt_regs *regs)
2862306a36Sopenharmony_ci{
2962306a36Sopenharmony_ci	regs->a0 = regs->orig_a0;
3062306a36Sopenharmony_ci}
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_cistatic inline long
3362306a36Sopenharmony_cisyscall_get_error(struct task_struct *task, struct pt_regs *regs)
3462306a36Sopenharmony_ci{
3562306a36Sopenharmony_ci	unsigned long error = regs->a0;
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	return IS_ERR_VALUE(error) ? error : 0;
3862306a36Sopenharmony_ci}
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cistatic inline long
4162306a36Sopenharmony_cisyscall_get_return_value(struct task_struct *task, struct pt_regs *regs)
4262306a36Sopenharmony_ci{
4362306a36Sopenharmony_ci	return regs->a0;
4462306a36Sopenharmony_ci}
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_cistatic inline void
4762306a36Sopenharmony_cisyscall_set_return_value(struct task_struct *task, struct pt_regs *regs,
4862306a36Sopenharmony_ci		int error, long val)
4962306a36Sopenharmony_ci{
5062306a36Sopenharmony_ci	regs->a0 = (long) error ?: val;
5162306a36Sopenharmony_ci}
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cistatic inline void
5462306a36Sopenharmony_cisyscall_get_arguments(struct task_struct *task, struct pt_regs *regs,
5562306a36Sopenharmony_ci		      unsigned long *args)
5662306a36Sopenharmony_ci{
5762306a36Sopenharmony_ci	args[0] = regs->orig_a0;
5862306a36Sopenharmony_ci	args++;
5962306a36Sopenharmony_ci	memcpy(args, &regs->a1, 5 * sizeof(args[0]));
6062306a36Sopenharmony_ci}
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_cistatic inline int
6362306a36Sopenharmony_cisyscall_get_arch(struct task_struct *task)
6462306a36Sopenharmony_ci{
6562306a36Sopenharmony_ci	return AUDIT_ARCH_CSKY;
6662306a36Sopenharmony_ci}
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci#endif	/* __ASM_SYSCALL_H */
69