Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.5.6.
 1/* SPDX-License-Identifier: GPL-2.0-only */
 2/*
 3 * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
 4 */
 5
 6#ifndef _ASM_ARC_SYSCALL_H
 7#define _ASM_ARC_SYSCALL_H  1
 8
 9#include <uapi/linux/audit.h>
10#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))
19		return regs->r8;
20	else
21		return -1;
22}
23
24static inline void
25syscall_rollback(struct task_struct *task, struct pt_regs *regs)
26{
27	regs->r0 = regs->orig_r0;
28}
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,
56		      unsigned long *args)
57{
58	unsigned long *inside_ptregs = &(regs->r0);
59	unsigned int n = 6;
60	unsigned int i = 0;
61
62	while (n--) {
63		args[i++] = (*inside_ptregs);
64		inside_ptregs--;
65	}
66}
67
68static inline int
69syscall_get_arch(struct task_struct *task)
70{
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
78#endif