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 79