1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Copyright Altera Corporation (C) <2014>. All rights reserved
4 */
5
6#ifndef __ASM_NIOS2_SYSCALL_H__
7#define __ASM_NIOS2_SYSCALL_H__
8
9#include <uapi/linux/audit.h>
10#include <linux/err.h>
11#include <linux/sched.h>
12
13static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs)
14{
15	return regs->r2;
16}
17
18static inline void syscall_rollback(struct task_struct *task,
19				struct pt_regs *regs)
20{
21	regs->r2 = regs->orig_r2;
22	regs->r7 = regs->orig_r7;
23}
24
25static inline long syscall_get_error(struct task_struct *task,
26				struct pt_regs *regs)
27{
28	return regs->r7 ? regs->r2 : 0;
29}
30
31static inline long syscall_get_return_value(struct task_struct *task,
32	struct pt_regs *regs)
33{
34	return regs->r2;
35}
36
37static inline void syscall_set_return_value(struct task_struct *task,
38	struct pt_regs *regs, int error, long val)
39{
40	if (error) {
41		/* error < 0, but nios2 uses > 0 return value */
42		regs->r2 = -error;
43		regs->r7 = 1;
44	} else {
45		regs->r2 = val;
46		regs->r7 = 0;
47	}
48}
49
50static inline void syscall_get_arguments(struct task_struct *task,
51	struct pt_regs *regs, unsigned long *args)
52{
53	*args++ = regs->r4;
54	*args++ = regs->r5;
55	*args++ = regs->r6;
56	*args++ = regs->r7;
57	*args++ = regs->r8;
58	*args   = regs->r9;
59}
60
61static inline int syscall_get_arch(struct task_struct *task)
62{
63	return AUDIT_ARCH_NIOS2;
64}
65
66#endif
67