blob: 33ab3048e9b20a6447475ec417b3fc10a91a309a [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
12#include <linux/err.h>
13#include <linux/sched.h>
14#include <asm/unistd.h>
15#include <asm/ptrace.h> /* in_syscall() */
16
17static inline long
18syscall_get_nr(struct task_struct *task, struct pt_regs *regs)
19{
20 if (user_mode(regs) && in_syscall(regs))
21 return regs->orig_r8;
22 else
23 return -1;
24}
25
26static inline void
27syscall_rollback(struct task_struct *task, struct pt_regs *regs)
28{
29 /* XXX: I can't fathom how pt_regs->r8 will be clobbered ? */
30 regs->r8 = regs->orig_r8;
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
72#endif