1/* 2 * Copyright (C) 2011 Texas Instruments Incorporated 3 * Author: Mark Salter <msalter@redhat.com> 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 */ 10 11#ifndef __ASM_C6X_SYSCALL_H 12#define __ASM_C6X_SYSCALL_H 13 14#include <linux/err.h> 15#include <linux/sched.h> 16 17static inline int syscall_get_nr(struct task_struct *task, 18 struct pt_regs *regs) 19{ 20 return regs->b0; 21} 22 23static inline void syscall_rollback(struct task_struct *task, 24 struct pt_regs *regs) 25{ 26 /* do nothing */ 27} 28 29static inline long syscall_get_error(struct task_struct *task, 30 struct pt_regs *regs) 31{ 32 return IS_ERR_VALUE(regs->a4) ? regs->a4 : 0; 33} 34 35static inline long syscall_get_return_value(struct task_struct *task, 36 struct pt_regs *regs) 37{ 38 return regs->a4; 39} 40 41static inline void syscall_set_return_value(struct task_struct *task, 42 struct pt_regs *regs, 43 int error, long val) 44{ 45 regs->a4 = error ?: val; 46} 47 48static inline void syscall_get_arguments(struct task_struct *task, 49 struct pt_regs *regs, unsigned int i, 50 unsigned int n, unsigned long *args) 51{ 52 switch (i) { 53 case 0: 54 if (!n--) 55 break; 56 *args++ = regs->a4; 57 case 1: 58 if (!n--) 59 break; 60 *args++ = regs->b4; 61 case 2: 62 if (!n--) 63 break; 64 *args++ = regs->a6; 65 case 3: 66 if (!n--) 67 break; 68 *args++ = regs->b6; 69 case 4: 70 if (!n--) 71 break; 72 *args++ = regs->a8; 73 case 5: 74 if (!n--) 75 break; 76 *args++ = regs->b8; 77 case 6: 78 if (!n--) 79 break; 80 default: 81 BUG(); 82 } 83} 84 85static inline void syscall_set_arguments(struct task_struct *task, 86 struct pt_regs *regs, 87 unsigned int i, unsigned int n, 88 const unsigned long *args) 89{ 90 switch (i) { 91 case 0: 92 if (!n--) 93 break; 94 regs->a4 = *args++; 95 case 1: 96 if (!n--) 97 break; 98 regs->b4 = *args++; 99 case 2: 100 if (!n--) 101 break; 102 regs->a6 = *args++; 103 case 3: 104 if (!n--) 105 break; 106 regs->b6 = *args++; 107 case 4: 108 if (!n--) 109 break; 110 regs->a8 = *args++; 111 case 5: 112 if (!n--) 113 break; 114 regs->a9 = *args++; 115 case 6: 116 if (!n) 117 break; 118 default: 119 BUG(); 120 } 121} 122 123#endif /* __ASM_C6X_SYSCALLS_H */ 124