2019-06-04 10:11:33 +02:00
/* SPDX-License-Identifier: GPL-2.0-only */
2013-01-18 15:12:18 +05:30
/*
* Copyright ( C ) 2004 , 2007 - 2010 , 2011 - 2012 Synopsys , Inc . ( www . synopsys . com )
*/
# ifndef _ASM_ARC_SYSCALL_H
# define _ASM_ARC_SYSCALL_H 1
2019-03-18 02:28:47 +03:00
# include <uapi/linux/audit.h>
2013-01-18 15:12:18 +05:30
# include <linux/err.h>
# include <linux/sched.h>
# include <asm/unistd.h>
# include <asm/ptrace.h> /* in_syscall() */
2022-04-14 11:17:23 +03:00
extern void * sys_call_table [ ] ;
2013-01-18 15:12:18 +05:30
static inline long
syscall_get_nr ( struct task_struct * task , struct pt_regs * regs )
{
if ( user_mode ( regs ) & & in_syscall ( regs ) )
2013-06-22 12:38:59 +05:30
return regs - > r8 ;
2013-01-18 15:12:18 +05:30
else
return - 1 ;
}
static inline void
syscall_rollback ( struct task_struct * task , struct pt_regs * regs )
{
2013-06-22 12:38:59 +05:30
regs - > r0 = regs - > orig_r0 ;
2013-01-18 15:12:18 +05:30
}
static inline long
syscall_get_error ( struct task_struct * task , struct pt_regs * regs )
{
/* 0 if syscall succeeded, otherwise -Errorcode */
return IS_ERR_VALUE ( regs - > r0 ) ? regs - > r0 : 0 ;
}
static inline long
syscall_get_return_value ( struct task_struct * task , struct pt_regs * regs )
{
return regs - > r0 ;
}
static inline void
syscall_set_return_value ( struct task_struct * task , struct pt_regs * regs ,
int error , long val )
{
regs - > r0 = ( long ) error ? : val ;
}
/*
* @ i : argument index [ 0 , 5 ]
* @ n : number of arguments ; n + i must be [ 1 , 6 ] .
*/
static inline void
syscall_get_arguments ( struct task_struct * task , struct pt_regs * regs ,
2016-11-07 16:26:37 -05:00
unsigned long * args )
2013-01-18 15:12:18 +05:30
{
unsigned long * inside_ptregs = & ( regs - > r0 ) ;
2016-11-07 16:26:37 -05:00
unsigned int n = 6 ;
unsigned int i = 0 ;
2013-01-18 15:12:18 +05:30
while ( n - - ) {
args [ i + + ] = ( * inside_ptregs ) ;
inside_ptregs - - ;
}
}
2019-03-18 02:28:47 +03:00
static inline int
2019-03-18 02:30:18 +03:00
syscall_get_arch ( struct task_struct * task )
2019-03-18 02:28:47 +03:00
{
return IS_ENABLED ( CONFIG_ISA_ARCOMPACT )
? ( IS_ENABLED ( CONFIG_CPU_BIG_ENDIAN )
? AUDIT_ARCH_ARCOMPACTBE : AUDIT_ARCH_ARCOMPACT )
: ( IS_ENABLED ( CONFIG_CPU_BIG_ENDIAN )
? AUDIT_ARCH_ARCV2BE : AUDIT_ARCH_ARCV2 ) ;
}
2013-01-18 15:12:18 +05:30
# endif