at v3.7-rc4 118 lines 3.6 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 15/* Adjust unistd.h to provide 32-bit numbers and functions. */ 16#define __SYSCALL_COMPAT 17 18#include <linux/compat.h> 19#include <linux/syscalls.h> 20#include <linux/kdev_t.h> 21#include <linux/fs.h> 22#include <linux/fcntl.h> 23#include <linux/uaccess.h> 24#include <linux/signal.h> 25#include <asm/syscalls.h> 26 27/* 28 * Syscalls that take 64-bit numbers traditionally take them in 32-bit 29 * "high" and "low" value parts on 32-bit architectures. 30 * In principle, one could imagine passing some register arguments as 31 * fully 64-bit on TILE-Gx in 32-bit mode, but it seems easier to 32 * adapt the usual convention. 33 */ 34 35long compat_sys_truncate64(char __user *filename, u32 dummy, u32 low, u32 high) 36{ 37 return sys_truncate(filename, ((loff_t)high << 32) | low); 38} 39 40long compat_sys_ftruncate64(unsigned int fd, u32 dummy, u32 low, u32 high) 41{ 42 return sys_ftruncate(fd, ((loff_t)high << 32) | low); 43} 44 45long compat_sys_pread64(unsigned int fd, char __user *ubuf, size_t count, 46 u32 dummy, u32 low, u32 high) 47{ 48 return sys_pread64(fd, ubuf, count, ((loff_t)high << 32) | low); 49} 50 51long compat_sys_pwrite64(unsigned int fd, char __user *ubuf, size_t count, 52 u32 dummy, u32 low, u32 high) 53{ 54 return sys_pwrite64(fd, ubuf, count, ((loff_t)high << 32) | low); 55} 56 57long compat_sys_lookup_dcookie(u32 low, u32 high, char __user *buf, size_t len) 58{ 59 return sys_lookup_dcookie(((loff_t)high << 32) | low, buf, len); 60} 61 62long compat_sys_sync_file_range2(int fd, unsigned int flags, 63 u32 offset_lo, u32 offset_hi, 64 u32 nbytes_lo, u32 nbytes_hi) 65{ 66 return sys_sync_file_range(fd, ((loff_t)offset_hi << 32) | offset_lo, 67 ((loff_t)nbytes_hi << 32) | nbytes_lo, 68 flags); 69} 70 71long compat_sys_fallocate(int fd, int mode, 72 u32 offset_lo, u32 offset_hi, 73 u32 len_lo, u32 len_hi) 74{ 75 return sys_fallocate(fd, mode, ((loff_t)offset_hi << 32) | offset_lo, 76 ((loff_t)len_hi << 32) | len_lo); 77} 78 79 80 81long compat_sys_sched_rr_get_interval(compat_pid_t pid, 82 struct compat_timespec __user *interval) 83{ 84 struct timespec t; 85 int ret; 86 mm_segment_t old_fs = get_fs(); 87 88 set_fs(KERNEL_DS); 89 ret = sys_sched_rr_get_interval(pid, 90 (struct timespec __force __user *)&t); 91 set_fs(old_fs); 92 if (put_compat_timespec(&t, interval)) 93 return -EFAULT; 94 return ret; 95} 96 97/* Provide the compat syscall number to call mapping. */ 98#undef __SYSCALL 99#define __SYSCALL(nr, call) [nr] = (call), 100 101/* See comments in sys.c */ 102#define compat_sys_fadvise64_64 sys32_fadvise64_64 103#define compat_sys_readahead sys32_readahead 104 105/* Call the trampolines to manage pt_regs where necessary. */ 106#define compat_sys_execve _compat_sys_execve 107#define compat_sys_sigaltstack _compat_sys_sigaltstack 108#define compat_sys_rt_sigreturn _compat_sys_rt_sigreturn 109#define sys_clone _sys_clone 110 111/* 112 * Note that we can't include <linux/unistd.h> here since the header 113 * guard will defeat us; <asm/unistd.h> checks for __SYSCALL as well. 114 */ 115void *compat_sys_call_table[__NR_syscalls] = { 116 [0 ... __NR_syscalls-1] = sys_ni_syscall, 117#include <asm/unistd.h> 118};