Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
at v2.6.37-rc4 128 lines 3.8 kB view raw
1/* 2 * Copyright 2010 Tilera Corporation. All Rights Reserved. 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License 6 * as published by the Free Software Foundation, version 2. 7 * 8 * This program is distributed in the hope that it will be useful, but 9 * WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or 11 * NON INFRINGEMENT. See the GNU General Public License for 12 * more details. 13 * 14 * This file contains various random system calls that 15 * have a non-standard calling sequence on the Linux/TILE 16 * platform. 17 */ 18 19#include <linux/errno.h> 20#include <linux/sched.h> 21#include <linux/mm.h> 22#include <linux/smp.h> 23#include <linux/syscalls.h> 24#include <linux/mman.h> 25#include <linux/file.h> 26#include <linux/mempolicy.h> 27#include <linux/binfmts.h> 28#include <linux/fs.h> 29#include <linux/compat.h> 30#include <linux/uaccess.h> 31#include <linux/signal.h> 32#include <asm/syscalls.h> 33#include <asm/pgtable.h> 34#include <asm/homecache.h> 35#include <arch/chip.h> 36 37SYSCALL_DEFINE0(flush_cache) 38{ 39 homecache_evict(cpumask_of(smp_processor_id())); 40 return 0; 41} 42 43/* 44 * Syscalls that pass 64-bit values on 32-bit systems normally 45 * pass them as (low,high) word packed into the immediately adjacent 46 * registers. If the low word naturally falls on an even register, 47 * our ABI makes it work correctly; if not, we adjust it here. 48 * Handling it here means we don't have to fix uclibc AND glibc AND 49 * any other standard libcs we want to support. 50 */ 51 52#if !defined(__tilegx__) || defined(CONFIG_COMPAT) 53 54ssize_t sys32_readahead(int fd, u32 offset_lo, u32 offset_hi, u32 count) 55{ 56 return sys_readahead(fd, ((loff_t)offset_hi << 32) | offset_lo, count); 57} 58 59long sys32_fadvise64(int fd, u32 offset_lo, u32 offset_hi, 60 u32 len, int advice) 61{ 62 return sys_fadvise64_64(fd, ((loff_t)offset_hi << 32) | offset_lo, 63 len, advice); 64} 65 66int sys32_fadvise64_64(int fd, u32 offset_lo, u32 offset_hi, 67 u32 len_lo, u32 len_hi, int advice) 68{ 69 return sys_fadvise64_64(fd, ((loff_t)offset_hi << 32) | offset_lo, 70 ((loff_t)len_hi << 32) | len_lo, advice); 71} 72 73#endif /* 32-bit syscall wrappers */ 74 75/* Note: used by the compat code even in 64-bit Linux. */ 76SYSCALL_DEFINE6(mmap2, unsigned long, addr, unsigned long, len, 77 unsigned long, prot, unsigned long, flags, 78 unsigned long, fd, unsigned long, off_4k) 79{ 80#define PAGE_ADJUST (PAGE_SHIFT - 12) 81 if (off_4k & ((1 << PAGE_ADJUST) - 1)) 82 return -EINVAL; 83 return sys_mmap_pgoff(addr, len, prot, flags, fd, 84 off_4k >> PAGE_ADJUST); 85} 86 87#ifdef __tilegx__ 88SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len, 89 unsigned long, prot, unsigned long, flags, 90 unsigned long, fd, off_t, offset) 91{ 92 if (offset & ((1 << PAGE_SHIFT) - 1)) 93 return -EINVAL; 94 return sys_mmap_pgoff(addr, len, prot, flags, fd, 95 offset >> PAGE_SHIFT); 96} 97#endif 98 99 100/* Provide the actual syscall number to call mapping. */ 101#undef __SYSCALL 102#define __SYSCALL(nr, call) [nr] = (call), 103 104#ifndef __tilegx__ 105/* See comments at the top of the file. */ 106#define sys_fadvise64 sys32_fadvise64 107#define sys_fadvise64_64 sys32_fadvise64_64 108#define sys_readahead sys32_readahead 109#define sys_sync_file_range sys_sync_file_range2 110#endif 111 112/* Call the trampolines to manage pt_regs where necessary. */ 113#define sys_execve _sys_execve 114#define sys_sigaltstack _sys_sigaltstack 115#define sys_rt_sigreturn _sys_rt_sigreturn 116#define sys_clone _sys_clone 117#ifndef __tilegx__ 118#define sys_cmpxchg_badaddr _sys_cmpxchg_badaddr 119#endif 120 121/* 122 * Note that we can't include <linux/unistd.h> here since the header 123 * guard will defeat us; <asm/unistd.h> checks for __SYSCALL as well. 124 */ 125void *sys_call_table[__NR_syscalls] = { 126 [0 ... __NR_syscalls-1] = sys_ni_syscall, 127#include <asm/unistd.h> 128};