Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

OpenRISC: System calls

The OpenRISC Linux kernel conforms to the "generic" syscall interface which
contains only the reduced set of syscalls deemed necessary for new
architectures. Unfortunately, the uClibc port for OpenRISC does not fully
support this reduced set; as such, an additional patch available out-of-tree
needs to be applied to the kernel in order to use the current uClibc. This
is just a temporary measure until the libc port can be straightened out; it
is likely that OpenRISC will make the transition to glibc shortly where the
generic syscall interface is better supported.

Signed-off-by: Jonas Bonn <jonas@southpole.se>
Reviewed-by: Arnd Bergmann <arnd@arndb.de>

+220
+77
arch/openrisc/include/asm/syscall.h
··· 1 + /* 2 + * OpenRISC Linux 3 + * 4 + * Linux architectural port borrowing liberally from similar works of 5 + * others. All original copyrights apply as per the original source 6 + * declaration. 7 + * 8 + * OpenRISC implementation: 9 + * Copyright (C) 2003 Matjaz Breskvar <phoenix@bsemi.com> 10 + * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se> 11 + * et al. 12 + * 13 + * This program is free software; you can redistribute it and/or modify 14 + * it under the terms of the GNU General Public License as published by 15 + * the Free Software Foundation; either version 2 of the License, or 16 + * (at your option) any later version. 17 + */ 18 + 19 + #ifndef __ASM_OPENRISC_SYSCALL_H__ 20 + #define __ASM_OPENRISC_SYSCALL_H__ 21 + 22 + #include <linux/err.h> 23 + #include <linux/sched.h> 24 + 25 + static inline int 26 + syscall_get_nr(struct task_struct *task, struct pt_regs *regs) 27 + { 28 + return regs->syscallno ? regs->syscallno : -1; 29 + } 30 + 31 + static inline void 32 + syscall_rollback(struct task_struct *task, struct pt_regs *regs) 33 + { 34 + regs->gpr[11] = regs->orig_gpr11; 35 + } 36 + 37 + static inline long 38 + syscall_get_error(struct task_struct *task, struct pt_regs *regs) 39 + { 40 + return IS_ERR_VALUE(regs->gpr[11]) ? regs->gpr[11] : 0; 41 + } 42 + 43 + static inline long 44 + syscall_get_return_value(struct task_struct *task, struct pt_regs *regs) 45 + { 46 + return regs->gpr[11]; 47 + } 48 + 49 + static inline void 50 + syscall_set_return_value(struct task_struct *task, struct pt_regs *regs, 51 + int error, long val) 52 + { 53 + if (error) 54 + regs->gpr[11] = -error; 55 + else 56 + regs->gpr[11] = val; 57 + } 58 + 59 + static inline void 60 + syscall_get_arguments(struct task_struct *task, struct pt_regs *regs, 61 + unsigned int i, unsigned int n, unsigned long *args) 62 + { 63 + BUG_ON(i + n > 6); 64 + 65 + memcpy(args, &regs->gpr[3 + i], n * sizeof(args[0])); 66 + } 67 + 68 + static inline void 69 + syscall_set_arguments(struct task_struct *task, struct pt_regs *regs, 70 + unsigned int i, unsigned int n, const unsigned long *args) 71 + { 72 + BUG_ON(i + n > 6); 73 + 74 + memcpy(&regs->gpr[3 + i], args, n * sizeof(args[0])); 75 + } 76 + 77 + #endif
+27
arch/openrisc/include/asm/syscalls.h
··· 1 + /* 2 + * OpenRISC Linux 3 + * 4 + * Linux architectural port borrowing liberally from similar works of 5 + * others. All original copyrights apply as per the original source 6 + * declaration. 7 + * 8 + * OpenRISC implementation: 9 + * Copyright (C) 2003 Matjaz Breskvar <phoenix@bsemi.com> 10 + * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se> 11 + * et al. 12 + * 13 + * This program is free software; you can redistribute it and/or modify 14 + * it under the terms of the GNU General Public License as published by 15 + * the Free Software Foundation; either version 2 of the License, or 16 + * (at your option) any later version. 17 + */ 18 + 19 + #ifndef __ASM_OPENRISC_SYSCALLS_H 20 + #define __ASM_OPENRISC_SYSCALLS_H 21 + 22 + asmlinkage long sys_or1k_atomic(unsigned long type, unsigned long *v1, 23 + unsigned long *v2); 24 + 25 + #include <asm-generic/syscalls.h> 26 + 27 + #endif /* __ASM_OPENRISC_SYSCALLS_H */
+31
arch/openrisc/include/asm/unistd.h
··· 1 + /* 2 + * OpenRISC Linux 3 + * 4 + * Linux architectural port borrowing liberally from similar works of 5 + * others. All original copyrights apply as per the original source 6 + * declaration. 7 + * 8 + * OpenRISC implementation: 9 + * Copyright (C) 2003 Matjaz Breskvar <phoenix@bsemi.com> 10 + * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se> 11 + * et al. 12 + * 13 + * This program is free software; you can redistribute it and/or modify 14 + * it under the terms of the GNU General Public License as published by 15 + * the Free Software Foundation; either version 2 of the License, or 16 + * (at your option) any later version. 17 + */ 18 + 19 + #if !defined(__ASM_OPENRISC_UNISTD_H) || defined(__SYSCALL) 20 + #define __ASM_OPENRISC_UNISTD_H 21 + 22 + #define __ARCH_HAVE_MMU 23 + 24 + #define sys_mmap2 sys_mmap_pgoff 25 + 26 + #include <asm-generic/unistd.h> 27 + 28 + #define __NR_or1k_atomic __NR_arch_specific_syscall 29 + __SYSCALL(__NR_or1k_atomic, sys_or1k_atomic) 30 + 31 + #endif /* __ASM_OPENRISC_UNISTD_H */
+28
arch/openrisc/kernel/sys_call_table.c
··· 1 + /* 2 + * OpenRISC sys_call_table.c 3 + * 4 + * Linux architectural port borrowing liberally from similar works of 5 + * others. All original copyrights apply as per the original source 6 + * declaration. 7 + * 8 + * Modifications for the OpenRISC architecture: 9 + * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se> 10 + * 11 + * This program is free software; you can redistribute it and/or 12 + * modify it under the terms of the GNU General Public License 13 + * as published by the Free Software Foundation; either version 14 + * 2 of the License, or (at your option) any later version. 15 + */ 16 + 17 + #include <linux/syscalls.h> 18 + #include <linux/signal.h> 19 + #include <linux/unistd.h> 20 + 21 + #include <asm/syscalls.h> 22 + 23 + #undef __SYSCALL 24 + #define __SYSCALL(nr, call) [nr] = (call), 25 + 26 + void *sys_call_table[__NR_syscalls] = { 27 + #include <asm/unistd.h> 28 + };
+57
arch/openrisc/kernel/sys_or32.c
··· 1 + /* 2 + * OpenRISC sys_or32.c 3 + * 4 + * Linux architectural port borrowing liberally from similar works of 5 + * others. All original copyrights apply as per the original source 6 + * declaration. 7 + * 8 + * Modifications for the OpenRISC architecture: 9 + * Copyright (C) 2003 Matjaz Breskvar <phoenix@bsemi.com> 10 + * Copyright (C) 2010-2011 Jonas Bonn <jonas@southpole.se> 11 + * 12 + * This program is free software; you can redistribute it and/or 13 + * modify it under the terms of the GNU General Public License 14 + * as published by the Free Software Foundation; either version 15 + * 2 of the License, or (at your option) any later version. 16 + * 17 + * This file contains various random system calls that 18 + * have a non-standard calling sequence on some platforms. 19 + * Since we don't have to do any backwards compatibility, our 20 + * versions are done in the most "normal" way possible. 21 + */ 22 + 23 + #include <linux/errno.h> 24 + #include <linux/syscalls.h> 25 + #include <linux/mm.h> 26 + 27 + #include <asm/syscalls.h> 28 + 29 + /* These are secondary entry points as the primary entry points are defined in 30 + * entry.S where we add the 'regs' parameter value 31 + */ 32 + 33 + asmlinkage long _sys_clone(unsigned long clone_flags, unsigned long newsp, 34 + int __user *parent_tid, int __user *child_tid, 35 + struct pt_regs *regs) 36 + { 37 + long ret; 38 + 39 + /* FIXME: Is alignment necessary? */ 40 + /* newsp = ALIGN(newsp, 4); */ 41 + 42 + if (!newsp) 43 + newsp = regs->sp; 44 + 45 + ret = do_fork(clone_flags, newsp, regs, 0, parent_tid, child_tid); 46 + 47 + return ret; 48 + } 49 + 50 + asmlinkage int _sys_fork(struct pt_regs *regs) 51 + { 52 + #ifdef CONFIG_MMU 53 + return do_fork(SIGCHLD, regs->sp, regs, 0, NULL, NULL); 54 + #else 55 + return -EINVAL; 56 + #endif 57 + }