MN10300: Implement asm/syscall.h

Implement asm/syscall.h for the MN10300 arch.

Signed-off-by: David Howells <dhowells@redhat.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by David Howells and committed by Linus Torvalds a9df42e1 59e57c62

+117
+117
arch/mn10300/include/asm/syscall.h
··· 1 + /* Access to user system call parameters and results 2 + * 3 + * See asm-generic/syscall.h for function descriptions. 4 + * 5 + * Copyright (C) 2010 Red Hat, Inc. All Rights Reserved. 6 + * Written by David Howells (dhowells@redhat.com) 7 + * 8 + * This program is free software; you can redistribute it and/or 9 + * modify it under the terms of the GNU General Public Licence 10 + * as published by the Free Software Foundation; either version 11 + * 2 of the Licence, or (at your option) any later version. 12 + */ 13 + 14 + #ifndef _ASM_SYSCALL_H 15 + #define _ASM_SYSCALL_H 16 + 17 + #include <linux/sched.h> 18 + #include <linux/err.h> 19 + 20 + extern const unsigned long sys_call_table[]; 21 + 22 + static inline int syscall_get_nr(struct task_struct *task, struct pt_regs *regs) 23 + { 24 + return regs->orig_d0; 25 + } 26 + 27 + static inline void syscall_rollback(struct task_struct *task, 28 + struct pt_regs *regs) 29 + { 30 + regs->d0 = regs->orig_d0; 31 + } 32 + 33 + static inline long syscall_get_error(struct task_struct *task, 34 + struct pt_regs *regs) 35 + { 36 + unsigned long error = regs->d0; 37 + return IS_ERR_VALUE(error) ? error : 0; 38 + } 39 + 40 + static inline long syscall_get_return_value(struct task_struct *task, 41 + struct pt_regs *regs) 42 + { 43 + return regs->d0; 44 + } 45 + 46 + static inline void syscall_set_return_value(struct task_struct *task, 47 + struct pt_regs *regs, 48 + int error, long val) 49 + { 50 + regs->d0 = (long) error ?: val; 51 + } 52 + 53 + static inline void syscall_get_arguments(struct task_struct *task, 54 + struct pt_regs *regs, 55 + unsigned int i, unsigned int n, 56 + unsigned long *args) 57 + { 58 + switch (i) { 59 + case 0: 60 + if (!n--) break; 61 + *args++ = regs->a0; 62 + case 1: 63 + if (!n--) break; 64 + *args++ = regs->d1; 65 + case 2: 66 + if (!n--) break; 67 + *args++ = regs->a3; 68 + case 3: 69 + if (!n--) break; 70 + *args++ = regs->a2; 71 + case 4: 72 + if (!n--) break; 73 + *args++ = regs->d3; 74 + case 5: 75 + if (!n--) break; 76 + *args++ = regs->d2; 77 + case 6: 78 + if (!n--) break; 79 + default: 80 + BUG(); 81 + break; 82 + } 83 + } 84 + 85 + static 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--) break; 93 + regs->a0 = *args++; 94 + case 1: 95 + if (!n--) break; 96 + regs->d1 = *args++; 97 + case 2: 98 + if (!n--) break; 99 + regs->a3 = *args++; 100 + case 3: 101 + if (!n--) break; 102 + regs->a2 = *args++; 103 + case 4: 104 + if (!n--) break; 105 + regs->d3 = *args++; 106 + case 5: 107 + if (!n--) break; 108 + regs->d2 = *args++; 109 + case 6: 110 + if (!n--) break; 111 + default: 112 + BUG(); 113 + break; 114 + } 115 + } 116 + 117 + #endif /* _ASM_SYSCALL_H */