14adeefe1SVineet Gupta /* 24adeefe1SVineet Gupta * Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com) 34adeefe1SVineet Gupta * 44adeefe1SVineet Gupta * This program is free software; you can redistribute it and/or modify 54adeefe1SVineet Gupta * it under the terms of the GNU General Public License version 2 as 64adeefe1SVineet Gupta * published by the Free Software Foundation. 74adeefe1SVineet Gupta */ 84adeefe1SVineet Gupta 94adeefe1SVineet Gupta #ifndef _ASM_ARC_SYSCALL_H 104adeefe1SVineet Gupta #define _ASM_ARC_SYSCALL_H 1 114adeefe1SVineet Gupta 124adeefe1SVineet Gupta #include <linux/err.h> 134adeefe1SVineet Gupta #include <linux/sched.h> 144adeefe1SVineet Gupta #include <asm/unistd.h> 154adeefe1SVineet Gupta #include <asm/ptrace.h> /* in_syscall() */ 164adeefe1SVineet Gupta 174adeefe1SVineet Gupta static inline long 184adeefe1SVineet Gupta syscall_get_nr(struct task_struct *task, struct pt_regs *regs) 194adeefe1SVineet Gupta { 204adeefe1SVineet Gupta if (user_mode(regs) && in_syscall(regs)) 21352c1d95SVineet Gupta return regs->r8; 224adeefe1SVineet Gupta else 234adeefe1SVineet Gupta return -1; 244adeefe1SVineet Gupta } 254adeefe1SVineet Gupta 264adeefe1SVineet Gupta static inline void 274adeefe1SVineet Gupta syscall_rollback(struct task_struct *task, struct pt_regs *regs) 284adeefe1SVineet Gupta { 29352c1d95SVineet Gupta regs->r0 = regs->orig_r0; 304adeefe1SVineet Gupta } 314adeefe1SVineet Gupta 324adeefe1SVineet Gupta static inline long 334adeefe1SVineet Gupta syscall_get_error(struct task_struct *task, struct pt_regs *regs) 344adeefe1SVineet Gupta { 354adeefe1SVineet Gupta /* 0 if syscall succeeded, otherwise -Errorcode */ 364adeefe1SVineet Gupta return IS_ERR_VALUE(regs->r0) ? regs->r0 : 0; 374adeefe1SVineet Gupta } 384adeefe1SVineet Gupta 394adeefe1SVineet Gupta static inline long 404adeefe1SVineet Gupta syscall_get_return_value(struct task_struct *task, struct pt_regs *regs) 414adeefe1SVineet Gupta { 424adeefe1SVineet Gupta return regs->r0; 434adeefe1SVineet Gupta } 444adeefe1SVineet Gupta 454adeefe1SVineet Gupta static inline void 464adeefe1SVineet Gupta syscall_set_return_value(struct task_struct *task, struct pt_regs *regs, 474adeefe1SVineet Gupta int error, long val) 484adeefe1SVineet Gupta { 494adeefe1SVineet Gupta regs->r0 = (long) error ?: val; 504adeefe1SVineet Gupta } 514adeefe1SVineet Gupta 524adeefe1SVineet Gupta /* 534adeefe1SVineet Gupta * @i: argument index [0,5] 544adeefe1SVineet Gupta * @n: number of arguments; n+i must be [1,6]. 554adeefe1SVineet Gupta */ 564adeefe1SVineet Gupta static inline void 574adeefe1SVineet Gupta syscall_get_arguments(struct task_struct *task, struct pt_regs *regs, 584adeefe1SVineet Gupta unsigned int i, unsigned int n, unsigned long *args) 594adeefe1SVineet Gupta { 604adeefe1SVineet Gupta unsigned long *inside_ptregs = &(regs->r0); 614adeefe1SVineet Gupta inside_ptregs -= i; 624adeefe1SVineet Gupta 634adeefe1SVineet Gupta BUG_ON((i + n) > 6); 644adeefe1SVineet Gupta 654adeefe1SVineet Gupta while (n--) { 664adeefe1SVineet Gupta args[i++] = (*inside_ptregs); 674adeefe1SVineet Gupta inside_ptregs--; 684adeefe1SVineet Gupta } 694adeefe1SVineet Gupta } 704adeefe1SVineet Gupta 714adeefe1SVineet Gupta #endif 72