blob: 9cac959ca4e8fed8ab613ec8b7ad195f4428b737 [file] [log] [blame]
Vineet Gupta4adeefe2013-01-18 15:12:18 +05301/*
2 * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 as
6 * published by the Free Software Foundation.
7 */
8
9#ifndef _ASM_ARC_SYSCALL_H
10#define _ASM_ARC_SYSCALL_H 1
11
Dmitry V. Levin67f2a8a2019-03-18 02:28:47 +030012#include <uapi/linux/audit.h>
Vineet Gupta4adeefe2013-01-18 15:12:18 +053013#include <linux/err.h>
14#include <linux/sched.h>
15#include <asm/unistd.h>
16#include <asm/ptrace.h> /* in_syscall() */
17
18static inline long
19syscall_get_nr(struct task_struct *task, struct pt_regs *regs)
20{
21 if (user_mode(regs) && in_syscall(regs))
Vineet Gupta352c1d92013-06-22 12:38:59 +053022 return regs->r8;
Vineet Gupta4adeefe2013-01-18 15:12:18 +053023 else
24 return -1;
25}
26
27static inline void
28syscall_rollback(struct task_struct *task, struct pt_regs *regs)
29{
Vineet Gupta352c1d92013-06-22 12:38:59 +053030 regs->r0 = regs->orig_r0;
Vineet Gupta4adeefe2013-01-18 15:12:18 +053031}
32
33static inline long
34syscall_get_error(struct task_struct *task, struct pt_regs *regs)
35{
36 /* 0 if syscall succeeded, otherwise -Errorcode */
37 return IS_ERR_VALUE(regs->r0) ? regs->r0 : 0;
38}
39
40static inline long
41syscall_get_return_value(struct task_struct *task, struct pt_regs *regs)
42{
43 return regs->r0;
44}
45
46static inline void
47syscall_set_return_value(struct task_struct *task, struct pt_regs *regs,
48 int error, long val)
49{
50 regs->r0 = (long) error ?: val;
51}
52
53/*
54 * @i: argument index [0,5]
55 * @n: number of arguments; n+i must be [1,6].
56 */
57static inline void
58syscall_get_arguments(struct task_struct *task, struct pt_regs *regs,
Steven Rostedt (Red Hat)b35f5492016-11-07 16:26:37 -050059 unsigned long *args)
Vineet Gupta4adeefe2013-01-18 15:12:18 +053060{
61 unsigned long *inside_ptregs = &(regs->r0);
Steven Rostedt (Red Hat)b35f5492016-11-07 16:26:37 -050062 unsigned int n = 6;
63 unsigned int i = 0;
Vineet Gupta4adeefe2013-01-18 15:12:18 +053064
65 while (n--) {
66 args[i++] = (*inside_ptregs);
67 inside_ptregs--;
68 }
69}
70
Dmitry V. Levin67f2a8a2019-03-18 02:28:47 +030071static inline int
Dmitry V. Levin16add412019-03-18 02:30:18 +030072syscall_get_arch(struct task_struct *task)
Dmitry V. Levin67f2a8a2019-03-18 02:28:47 +030073{
74 return IS_ENABLED(CONFIG_ISA_ARCOMPACT)
75 ? (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN)
76 ? AUDIT_ARCH_ARCOMPACTBE : AUDIT_ARCH_ARCOMPACT)
77 : (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN)
78 ? AUDIT_ARCH_ARCV2BE : AUDIT_ARCH_ARCV2);
79}
80
Vineet Gupta4adeefe2013-01-18 15:12:18 +053081#endif