aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAurelien Jacquiot <a-jacquiot@ti.com>2011-10-04 12:21:06 -0400
committerMark Salter <msalter@redhat.com>2011-10-06 19:47:58 -0400
commit8a0c9e0348479f1b85c640da4795bdd775970bf3 (patch)
tree1d0f9b2d279b40d42ebd79fa1e99becaaa9f225e
parentec500af3059b474df35418c41c684c1cde830c81 (diff)
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>
-rw-r--r--arch/c6x/include/asm/syscalls.h55
-rw-r--r--arch/c6x/include/asm/unistd.h26
-rw-r--r--arch/c6x/kernel/sys_c6x.c74
3 files changed, 155 insertions, 0 deletions
diff --git a/arch/c6x/include/asm/syscalls.h b/arch/c6x/include/asm/syscalls.h
new file mode 100644
index 000000000000..aed53da703c9
--- /dev/null
+++ b/arch/c6x/include/asm/syscalls.h
@@ -0,0 +1,55 @@
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. */
24extern void *sys_call_table[];
25
26/* The following are trampolines in entry.S to handle 64-bit arguments */
27extern long sys_pread_c6x(unsigned int fd, char __user *buf,
28 size_t count, off_t pos_low, off_t pos_high);
29extern long sys_pwrite_c6x(unsigned int fd, const char __user *buf,
30 size_t count, off_t pos_low, off_t pos_high);
31extern long sys_truncate64_c6x(const char __user *path,
32 off_t length_low, off_t length_high);
33extern long sys_ftruncate64_c6x(unsigned int fd,
34 off_t length_low, off_t length_high);
35extern long sys_fadvise64_c6x(int fd, u32 offset_lo, u32 offset_hi,
36 u32 len, int advice);
37extern long sys_fadvise64_64_c6x(int fd, u32 offset_lo, u32 offset_hi,
38 u32 len_lo, u32 len_hi, int advice);
39extern long sys_fallocate_c6x(int fd, int mode,
40 u32 offset_lo, u32 offset_hi,
41 u32 len_lo, u32 len_hi);
42extern int sys_cache_sync(unsigned long s, unsigned long e);
43
44struct pt_regs;
45
46extern asmlinkage long sys_c6x_clone(struct pt_regs *regs);
47extern 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 */
diff --git a/arch/c6x/include/asm/unistd.h b/arch/c6x/include/asm/unistd.h
new file mode 100644
index 000000000000..6d54ea4262eb
--- /dev/null
+++ b/arch/c6x/include/asm/unistd.h
@@ -0,0 +1,26 @@
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 */
diff --git a/arch/c6x/kernel/sys_c6x.c b/arch/c6x/kernel/sys_c6x.c
new file mode 100644
index 000000000000..3e9bdfbee8ad
--- /dev/null
+++ b/arch/c6x/kernel/sys_c6x.c
@@ -0,0 +1,74 @@
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
18int _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}
37EXPORT_SYMBOL(_access_ok);
38#endif
39
40/* sys_cache_sync -- sync caches over given range */
41asmlinkage 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 */
71void *sys_call_table[__NR_syscalls] = {
72 [0 ... __NR_syscalls-1] = sys_ni_syscall,
73#include <asm/unistd.h>
74};