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

C6X: syscalls

Original port to early 2.6 kernel using TI COFF toolchain.
Brought up to date by Mark Salter <msalter@redhat.com>

Signed-off-by: Aurelien Jacquiot <a-jacquiot@ti.com>
Signed-off-by: Mark Salter <msalter@redhat.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
[msalter@redhat.com: add include of linux/module.h to sys_c6x.c]
Signed-off-by: Mark Salter <msalter@redhat.com>

authored by

Aurelien Jacquiot and committed by
Mark Salter
8a0c9e03 ec500af3

+155
+55
arch/c6x/include/asm/syscalls.h
··· 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 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 + 16 + #ifndef __ASM_C6X_SYSCALLS_H 17 + #define __ASM_C6X_SYSCALLS_H 18 + 19 + #include <linux/compiler.h> 20 + #include <linux/linkage.h> 21 + #include <linux/types.h> 22 + 23 + /* The array of function pointers for syscalls. */ 24 + extern void *sys_call_table[]; 25 + 26 + /* The following are trampolines in entry.S to handle 64-bit arguments */ 27 + extern long sys_pread_c6x(unsigned int fd, char __user *buf, 28 + size_t count, off_t pos_low, off_t pos_high); 29 + extern long sys_pwrite_c6x(unsigned int fd, const char __user *buf, 30 + size_t count, off_t pos_low, off_t pos_high); 31 + extern long sys_truncate64_c6x(const char __user *path, 32 + off_t length_low, off_t length_high); 33 + extern long sys_ftruncate64_c6x(unsigned int fd, 34 + off_t length_low, off_t length_high); 35 + extern long sys_fadvise64_c6x(int fd, u32 offset_lo, u32 offset_hi, 36 + u32 len, int advice); 37 + extern long sys_fadvise64_64_c6x(int fd, u32 offset_lo, u32 offset_hi, 38 + u32 len_lo, u32 len_hi, int advice); 39 + extern long sys_fallocate_c6x(int fd, int mode, 40 + u32 offset_lo, u32 offset_hi, 41 + u32 len_lo, u32 len_hi); 42 + extern int sys_cache_sync(unsigned long s, unsigned long e); 43 + 44 + struct pt_regs; 45 + 46 + extern asmlinkage long sys_c6x_clone(struct pt_regs *regs); 47 + extern asmlinkage long sys_c6x_execve(const char __user *name, 48 + const char __user *const __user *argv, 49 + const char __user *const __user *envp, 50 + struct pt_regs *regs); 51 + 52 + 53 + #include <asm-generic/syscalls.h> 54 + 55 + #endif /* __ASM_C6X_SYSCALLS_H */
+26
arch/c6x/include/asm/unistd.h
··· 1 + /* 2 + * Copyright (C) 2011 Texas Instruments Incorporated 3 + * 4 + * Based on arch/tile version. 5 + * 6 + * This program is free software; you can redistribute it and/or 7 + * modify it under the terms of the GNU General Public License 8 + * as published by the Free Software Foundation, version 2. 9 + * 10 + * This program is distributed in the hope that it will be useful, but 11 + * WITHOUT ANY WARRANTY; without even the implied warranty of 12 + * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or 13 + * NON INFRINGEMENT. See the GNU General Public License for 14 + * more details. 15 + */ 16 + #if !defined(_ASM_C6X_UNISTD_H) || defined(__SYSCALL) 17 + #define _ASM_C6X_UNISTD_H 18 + 19 + /* Use the standard ABI for syscalls. */ 20 + #include <asm-generic/unistd.h> 21 + 22 + /* C6X-specific syscalls. */ 23 + #define __NR_cache_sync (__NR_arch_specific_syscall + 0) 24 + __SYSCALL(__NR_cache_sync, sys_cache_sync) 25 + 26 + #endif /* _ASM_C6X_UNISTD_H */
+74
arch/c6x/kernel/sys_c6x.c
··· 1 + /* 2 + * Port on Texas Instruments TMS320C6x architecture 3 + * 4 + * Copyright (C) 2004, 2009, 2010, 2011 Texas Instruments Incorporated 5 + * Author: Aurelien Jacquiot (aurelien.jacquiot@jaluna.com) 6 + * 7 + * This program is free software; you can redistribute it and/or modify 8 + * it under the terms of the GNU General Public License version 2 as 9 + * published by the Free Software Foundation. 10 + */ 11 + #include <linux/module.h> 12 + #include <linux/syscalls.h> 13 + #include <linux/uaccess.h> 14 + 15 + #include <asm/syscalls.h> 16 + 17 + #ifdef CONFIG_ACCESS_CHECK 18 + int _access_ok(unsigned long addr, unsigned long size) 19 + { 20 + if (!size) 21 + return 1; 22 + 23 + if (!addr || addr > (0xffffffffUL - (size - 1))) 24 + goto _bad_access; 25 + 26 + if (segment_eq(get_fs(), KERNEL_DS)) 27 + return 1; 28 + 29 + if (memory_start <= addr && (addr + size - 1) < memory_end) 30 + return 1; 31 + 32 + _bad_access: 33 + pr_debug("Bad access attempt: pid[%d] addr[%08lx] size[0x%lx]\n", 34 + current->pid, addr, size); 35 + return 0; 36 + } 37 + EXPORT_SYMBOL(_access_ok); 38 + #endif 39 + 40 + /* sys_cache_sync -- sync caches over given range */ 41 + asmlinkage int sys_cache_sync(unsigned long s, unsigned long e) 42 + { 43 + L1D_cache_block_writeback_invalidate(s, e); 44 + L1P_cache_block_invalidate(s, e); 45 + 46 + return 0; 47 + } 48 + 49 + /* Provide the actual syscall number to call mapping. */ 50 + #undef __SYSCALL 51 + #define __SYSCALL(nr, call) [nr] = (call), 52 + 53 + /* 54 + * Use trampolines 55 + */ 56 + #define sys_pread64 sys_pread_c6x 57 + #define sys_pwrite64 sys_pwrite_c6x 58 + #define sys_truncate64 sys_truncate64_c6x 59 + #define sys_ftruncate64 sys_ftruncate64_c6x 60 + #define sys_fadvise64 sys_fadvise64_c6x 61 + #define sys_fadvise64_64 sys_fadvise64_64_c6x 62 + #define sys_fallocate sys_fallocate_c6x 63 + 64 + /* Use sys_mmap_pgoff directly */ 65 + #define sys_mmap2 sys_mmap_pgoff 66 + 67 + /* 68 + * Note that we can't include <linux/unistd.h> here since the header 69 + * guard will defeat us; <asm/unistd.h> checks for __SYSCALL as well. 70 + */ 71 + void *sys_call_table[__NR_syscalls] = { 72 + [0 ... __NR_syscalls-1] = sys_ni_syscall, 73 + #include <asm/unistd.h> 74 + };