syscall_get_arch: add "struct task_struct *" argument
[linux-block.git] / arch / arc / include / asm / syscall.h
CommitLineData
4adeefe1
VG
1/*
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
67f2a8a2 12#include <uapi/linux/audit.h>
4adeefe1
VG
13#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))
352c1d95 22 return regs->r8;
4adeefe1
VG
23 else
24 return -1;
25}
26
27static inline void
28syscall_rollback(struct task_struct *task, struct pt_regs *regs)
29{
352c1d95 30 regs->r0 = regs->orig_r0;
4adeefe1
VG
31}
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,
59 unsigned int i, unsigned int n, unsigned long *args)
60{
61 unsigned long *inside_ptregs = &(regs->r0);
62 inside_ptregs -= i;
63
64 BUG_ON((i + n) > 6);
65
66 while (n--) {
67 args[i++] = (*inside_ptregs);
68 inside_ptregs--;
69 }
70}
71
67f2a8a2 72static inline int
16add411 73syscall_get_arch(struct task_struct *task)
67f2a8a2
DL
74{
75 return IS_ENABLED(CONFIG_ISA_ARCOMPACT)
76 ? (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN)
77 ? AUDIT_ARCH_ARCOMPACTBE : AUDIT_ARCH_ARCOMPACT)
78 : (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN)
79 ? AUDIT_ARCH_ARCV2BE : AUDIT_ARCH_ARCV2);
80}
81
4adeefe1 82#endif