sys_parisc.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:2k
- /*
- * linux/arch/parisc/kernel/sys_parisc.c
- *
- * this implements the missing syscalls.
- */
- #include <asm/uaccess.h>
- #include <linux/file.h>
- #include <linux/fs.h>
- #include <linux/linkage.h>
- #include <linux/mm.h>
- #include <linux/mman.h>
- #include <linux/smp_lock.h>
- /* for some reason, "old_readdir" is the only syscall which does not begin
- * with "sys_", which breaks the ENTRY_* macros in syscall.S so I "fixed"
- * it here.
- */
- int sys_old_readdir(unsigned int fd, void *dirent, unsigned int count)
- {
- return old_readdir(fd, dirent, count);
- }
- int sys_pipe(int *fildes)
- {
- int fd[2];
- int error;
- lock_kernel();
- error = do_pipe(fd);
- unlock_kernel();
- if (!error) {
- if (copy_to_user(fildes, fd, 2*sizeof(int)))
- error = -EFAULT;
- }
- return error;
- }
- int sys_pause(void)
- {
- current->state = TASK_INTERRUPTIBLE;
- schedule();
- return -ERESTARTNOHAND;
- }
- int sys_mmap(unsigned long addr, unsigned long len,
- unsigned long prot, unsigned long flags, unsigned long fd,
- unsigned long offset)
- {
- struct file * file = NULL;
- int error;
- down_write(¤t->mm->mmap_sem);
- lock_kernel();
- if (!(flags & MAP_ANONYMOUS)) {
- error = -EBADF;
- file = fget(fd);
- if (!file)
- goto out;
- }
- flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
- error = do_mmap(file, addr, len, prot, flags, offset);
- if (file != NULL)
- fput(file);
- out:
- unlock_kernel();
- up_write(¤t->mm->mmap_sem);
- return error;
- }
- int sys_ioperm(unsigned long from, unsigned long num, int on)
- {
- return -ENOSYS;
- }
- long sys_shmat_wrapper(int shmid, void *shmaddr, int shmflag)
- {
- extern int sys_shmat(int shmid, char *shmaddr, int shmflg,
- unsigned long * raddr);
- unsigned long raddr;
- int r;
- r = sys_shmat(shmid, shmaddr, shmflag, &raddr);
- if (r < 0)
- return r;
- return raddr;
- }