linux/arch/mn10300/kernel/sys_mn10300.c
<<
>>
Prefs
   1/* MN10300 Weird system calls
   2 *
   3 * Copyright (C) 2007 Matsushita Electric Industrial Co., Ltd.
   4 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
   5 *
   6 * This program is free software; you can redistribute it and/or
   7 * modify it under the terms of the GNU General Public Licence
   8 * as published by the Free Software Foundation; either version
   9 * 2 of the Licence, or (at your option) any later version.
  10 */
  11#include <linux/errno.h>
  12#include <linux/sched.h>
  13#include <linux/syscalls.h>
  14#include <linux/mm.h>
  15#include <linux/smp.h>
  16#include <linux/sem.h>
  17#include <linux/msg.h>
  18#include <linux/shm.h>
  19#include <linux/stat.h>
  20#include <linux/mman.h>
  21#include <linux/file.h>
  22#include <linux/tty.h>
  23
  24#include <asm/uaccess.h>
  25
  26#define MIN_MAP_ADDR    PAGE_SIZE       /* minimum fixed mmap address */
  27
  28/*
  29 * memory mapping syscall
  30 */
  31asmlinkage long sys_mmap2(unsigned long addr, unsigned long len,
  32                          unsigned long prot, unsigned long flags,
  33                          unsigned long fd, unsigned long pgoff)
  34{
  35        struct file *file = NULL;
  36        long error = -EINVAL;
  37
  38        flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
  39
  40        if (flags & MAP_FIXED && addr < MIN_MAP_ADDR)
  41                goto out;
  42
  43        error = -EBADF;
  44        if (!(flags & MAP_ANONYMOUS)) {
  45                file = fget(fd);
  46                if (!file)
  47                        goto out;
  48        }
  49
  50        down_write(&current->mm->mmap_sem);
  51        error = do_mmap_pgoff(file, addr, len, prot, flags, pgoff);
  52        up_write(&current->mm->mmap_sem);
  53
  54        if (file)
  55                fput(file);
  56out:
  57        return error;
  58}
  59
  60asmlinkage long old_mmap(unsigned long addr, unsigned long len,
  61                         unsigned long prot, unsigned long flags,
  62                         unsigned long fd, unsigned long offset)
  63{
  64        if (offset & ~PAGE_MASK)
  65                return -EINVAL;
  66        return sys_mmap2(addr, len, prot, flags, fd, offset >> PAGE_SHIFT);
  67}
  68
  69struct sel_arg_struct {
  70        unsigned long n;
  71        fd_set *inp;
  72        fd_set *outp;
  73        fd_set *exp;
  74        struct timeval *tvp;
  75};
  76
  77asmlinkage int old_select(struct sel_arg_struct __user *arg)
  78{
  79        struct sel_arg_struct a;
  80
  81        if (copy_from_user(&a, arg, sizeof(a)))
  82                return -EFAULT;
  83        /* sys_select() does the appropriate kernel locking */
  84        return sys_select(a.n, a.inp, a.outp, a.exp, a.tvp);
  85}
  86
  87/*
  88 * sys_ipc() is the de-multiplexer for the SysV IPC calls..
  89 *
  90 * This is really horribly ugly.
  91 */
  92asmlinkage long sys_ipc(uint call, int first, int second,
  93                        int third, void __user *ptr, long fifth)
  94{
  95        int version, ret;
  96
  97        version = call >> 16; /* hack for backward compatibility */
  98        call &= 0xffff;
  99
 100        switch (call) {
 101        case SEMOP:
 102                return sys_semtimedop(first, (struct sembuf __user *)ptr,
 103                                      second, NULL);
 104        case SEMTIMEDOP:
 105                return sys_semtimedop(first, (struct sembuf __user *)ptr,
 106                                      second,
 107                                      (const struct timespec __user *)fifth);
 108        case SEMGET:
 109                return sys_semget(first, second, third);
 110        case SEMCTL: {
 111                union semun fourth;
 112                if (!ptr)
 113                        return -EINVAL;
 114                if (get_user(fourth.__pad, (void __user * __user *) ptr))
 115                        return -EFAULT;
 116                return sys_semctl(first, second, third, fourth);
 117        }
 118
 119        case MSGSND:
 120                return sys_msgsnd(first, (struct msgbuf __user *) ptr,
 121                                  second, third);
 122        case MSGRCV:
 123                switch (version) {
 124                case 0: {
 125                        struct ipc_kludge tmp;
 126                        if (!ptr)
 127                                return -EINVAL;
 128
 129                        if (copy_from_user(&tmp,
 130                                           (struct ipc_kludge __user *) ptr,
 131                                           sizeof(tmp)))
 132                                return -EFAULT;
 133                        return sys_msgrcv(first, tmp.msgp, second,
 134                                          tmp.msgtyp, third);
 135                }
 136                default:
 137                        return sys_msgrcv(first,
 138                                          (struct msgbuf __user *) ptr,
 139                                           second, fifth, third);
 140                }
 141        case MSGGET:
 142                return sys_msgget((key_t) first, second);
 143        case MSGCTL:
 144                return sys_msgctl(first, second,
 145                                   (struct msqid_ds __user *) ptr);
 146
 147        case SHMAT:
 148                switch (version) {
 149                default: {
 150                        ulong raddr;
 151                        ret = do_shmat(first, (char __user *) ptr, second,
 152                                       &raddr);
 153                        if (ret)
 154                                return ret;
 155                        return put_user(raddr, (ulong *) third);
 156                }
 157                case 1: /* iBCS2 emulator entry point */
 158                        if (!segment_eq(get_fs(), get_ds()))
 159                                return -EINVAL;
 160                        return do_shmat(first, (char __user *) ptr, second,
 161                                        (ulong *) third);
 162                }
 163        case SHMDT:
 164                return sys_shmdt((char __user *)ptr);
 165        case SHMGET:
 166                return sys_shmget(first, second, third);
 167        case SHMCTL:
 168                return sys_shmctl(first, second,
 169                                  (struct shmid_ds __user *) ptr);
 170        default:
 171                return -EINVAL;
 172        }
 173}
 174
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.