syscall.h (1770B)
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 15extern void *sys_call_table[]; 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->r8; 22 else 23 return -1; 24} 25 26static inline void 27syscall_rollback(struct task_struct *task, struct pt_regs *regs) 28{ 29 regs->r0 = regs->orig_r0; 30} 31 32static inline long 33syscall_get_error(struct task_struct *task, struct pt_regs *regs) 34{ 35 /* 0 if syscall succeeded, otherwise -Errorcode */ 36 return IS_ERR_VALUE(regs->r0) ? regs->r0 : 0; 37} 38 39static inline long 40syscall_get_return_value(struct task_struct *task, struct pt_regs *regs) 41{ 42 return regs->r0; 43} 44 45static inline void 46syscall_set_return_value(struct task_struct *task, struct pt_regs *regs, 47 int error, long val) 48{ 49 regs->r0 = (long) error ?: val; 50} 51 52/* 53 * @i: argument index [0,5] 54 * @n: number of arguments; n+i must be [1,6]. 55 */ 56static inline void 57syscall_get_arguments(struct task_struct *task, struct pt_regs *regs, 58 unsigned long *args) 59{ 60 unsigned long *inside_ptregs = &(regs->r0); 61 unsigned int n = 6; 62 unsigned int i = 0; 63 64 while (n--) { 65 args[i++] = (*inside_ptregs); 66 inside_ptregs--; 67 } 68} 69 70static inline int 71syscall_get_arch(struct task_struct *task) 72{ 73 return IS_ENABLED(CONFIG_ISA_ARCOMPACT) 74 ? (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) 75 ? AUDIT_ARCH_ARCOMPACTBE : AUDIT_ARCH_ARCOMPACT) 76 : (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN) 77 ? AUDIT_ARCH_ARCV2BE : AUDIT_ARCH_ARCV2); 78} 79 80#endif