blob: 94529e89dff0cb871ec41f5a8952b686de17ab45 [file] [log] [blame]
Thomas Gleixnerd2912cb2019-06-04 10:11:33 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Vineet Gupta4adeefe2013-01-18 15:12:18 +05302/*
3 * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
Vineet Gupta4adeefe2013-01-18 15:12:18 +05304 */
5
6#ifndef _ASM_ARC_SYSCALL_H
7#define _ASM_ARC_SYSCALL_H 1
8
Dmitry V. Levin67f2a8a2019-03-18 02:28:47 +03009#include <uapi/linux/audit.h>
Vineet Gupta4adeefe2013-01-18 15:12:18 +053010#include <linux/err.h>
11#include <linux/sched.h>
12#include <asm/unistd.h>
13#include <asm/ptrace.h> /* in_syscall() */
14
15static inline long
16syscall_get_nr(struct task_struct *task, struct pt_regs *regs)
17{
18 if (user_mode(regs) && in_syscall(regs))
Vineet Gupta352c1d92013-06-22 12:38:59 +053019 return regs->r8;
Vineet Gupta4adeefe2013-01-18 15:12:18 +053020 else
21 return -1;
22}
23
24static inline void
25syscall_rollback(struct task_struct *task, struct pt_regs *regs)
26{
Vineet Gupta352c1d92013-06-22 12:38:59 +053027 regs->r0 = regs->orig_r0;
Vineet Gupta4adeefe2013-01-18 15:12:18 +053028}
29
30static inline long
31syscall_get_error(struct task_struct *task, struct pt_regs *regs)
32{
33 /* 0 if syscall succeeded, otherwise -Errorcode */
34 return IS_ERR_VALUE(regs->r0) ? regs->r0 : 0;
35}
36
37static inline long
38syscall_get_return_value(struct task_struct *task, struct pt_regs *regs)
39{
40 return regs->r0;
41}
42
43static inline void
44syscall_set_return_value(struct task_struct *task, struct pt_regs *regs,
45 int error, long val)
46{
47 regs->r0 = (long) error ?: val;
48}
49
50/*
51 * @i: argument index [0,5]
52 * @n: number of arguments; n+i must be [1,6].
53 */
54static inline void
55syscall_get_arguments(struct task_struct *task, struct pt_regs *regs,
Steven Rostedt (Red Hat)b35f5492016-11-07 16:26:37 -050056 unsigned long *args)
Vineet Gupta4adeefe2013-01-18 15:12:18 +053057{
58 unsigned long *inside_ptregs = &(regs->r0);
Steven Rostedt (Red Hat)b35f5492016-11-07 16:26:37 -050059 unsigned int n = 6;
60 unsigned int i = 0;
Vineet Gupta4adeefe2013-01-18 15:12:18 +053061
62 while (n--) {
63 args[i++] = (*inside_ptregs);
64 inside_ptregs--;
65 }
66}
67
Dmitry V. Levin67f2a8a2019-03-18 02:28:47 +030068static inline int
Dmitry V. Levin16add412019-03-18 02:30:18 +030069syscall_get_arch(struct task_struct *task)
Dmitry V. Levin67f2a8a2019-03-18 02:28:47 +030070{
71 return IS_ENABLED(CONFIG_ISA_ARCOMPACT)
72 ? (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN)
73 ? AUDIT_ARCH_ARCOMPACTBE : AUDIT_ARCH_ARCOMPACT)
74 : (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN)
75 ? AUDIT_ARCH_ARCV2BE : AUDIT_ARCH_ARCV2);
76}
77
Vineet Gupta4adeefe2013-01-18 15:12:18 +053078#endif