1/* 2 * Copyright (C) 2008-2009 Red Hat, Inc. All rights reserved. 3 * Copyright 2010 Tilera Corporation. All Rights Reserved. 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU General Public License 7 * as published by the Free Software Foundation, version 2. 8 * 9 * This program is distributed in the hope that it will be useful, but 10 * WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or 12 * NON INFRINGEMENT. See the GNU General Public License for 13 * more details. 14 * 15 * See asm-generic/syscall.h for descriptions of what we must do here. 16 */ 17 18#ifndef _ASM_TILE_SYSCALL_H 19#define _ASM_TILE_SYSCALL_H 20 21#include <linux/sched.h> 22#include <linux/err.h> 23#include <arch/abi.h> 24 25/* The array of function pointers for syscalls. */ 26extern void *sys_call_table[]; 27#ifdef CONFIG_COMPAT 28extern void *compat_sys_call_table[]; 29#endif 30 31/* 32 * Only the low 32 bits of orig_r0 are meaningful, so we return int. 33 * This importantly ignores the high bits on 64-bit, so comparisons 34 * sign-extend the low 32 bits. 35 */ 36static inline int syscall_get_nr(struct task_struct *t, struct pt_regs *regs) 37{ 38 return regs->regs[TREG_SYSCALL_NR]; 39} 40 41static inline void syscall_rollback(struct task_struct *task, 42 struct pt_regs *regs) 43{ 44 regs->regs[0] = regs->orig_r0; 45} 46 47static inline long syscall_get_error(struct task_struct *task, 48 struct pt_regs *regs) 49{ 50 unsigned long error = regs->regs[0]; 51 return IS_ERR_VALUE(error) ? error : 0; 52} 53 54static inline long syscall_get_return_value(struct task_struct *task, 55 struct pt_regs *regs) 56{ 57 return regs->regs[0]; 58} 59 60static inline void syscall_set_return_value(struct task_struct *task, 61 struct pt_regs *regs, 62 int error, long val) 63{ 64 regs->regs[0] = (long) error ?: val; 65} 66 67static inline void syscall_get_arguments(struct task_struct *task, 68 struct pt_regs *regs, 69 unsigned int i, unsigned int n, 70 unsigned long *args) 71{ 72 BUG_ON(i + n > 6); 73 memcpy(args, ®s[i], n * sizeof(args[0])); 74} 75 76static inline void syscall_set_arguments(struct task_struct *task, 77 struct pt_regs *regs, 78 unsigned int i, unsigned int n, 79 const unsigned long *args) 80{ 81 BUG_ON(i + n > 6); 82 memcpy(®s[i], args, n * sizeof(args[0])); 83} 84 85#endif /* _ASM_TILE_SYSCALL_H */ 86