|
@@ -33,105 +33,6 @@
|
|
|
#include <linux/unistd.h>
|
|
|
|
|
|
#include <asm/syscalls.h>
|
|
|
-/*
|
|
|
- * sys_ipc() is the de-multiplexer for the SysV IPC calls..
|
|
|
- *
|
|
|
- * This is really horribly ugly. This will be remove with new toolchain.
|
|
|
- */
|
|
|
-asmlinkage long
|
|
|
-sys_ipc(uint call, int first, int second, int third, void *ptr, long fifth)
|
|
|
-{
|
|
|
- int version, ret;
|
|
|
-
|
|
|
- version = call >> 16; /* hack for backward compatibility */
|
|
|
- call &= 0xffff;
|
|
|
-
|
|
|
- ret = -EINVAL;
|
|
|
- switch (call) {
|
|
|
- case SEMOP:
|
|
|
- ret = sys_semop(first, (struct sembuf *)ptr, second);
|
|
|
- break;
|
|
|
- case SEMGET:
|
|
|
- ret = sys_semget(first, second, third);
|
|
|
- break;
|
|
|
- case SEMCTL:
|
|
|
- {
|
|
|
- union semun fourth;
|
|
|
-
|
|
|
- if (!ptr)
|
|
|
- break;
|
|
|
- ret = (access_ok(VERIFY_READ, ptr, sizeof(long)) ? 0 : -EFAULT)
|
|
|
- || (get_user(fourth.__pad, (void **)ptr)) ;
|
|
|
- if (ret)
|
|
|
- break;
|
|
|
- ret = sys_semctl(first, second, third, fourth);
|
|
|
- break;
|
|
|
- }
|
|
|
- case MSGSND:
|
|
|
- ret = sys_msgsnd(first, (struct msgbuf *) ptr, second, third);
|
|
|
- break;
|
|
|
- case MSGRCV:
|
|
|
- switch (version) {
|
|
|
- case 0: {
|
|
|
- struct ipc_kludge tmp;
|
|
|
-
|
|
|
- if (!ptr)
|
|
|
- break;
|
|
|
- ret = (access_ok(VERIFY_READ, ptr, sizeof(tmp))
|
|
|
- ? 0 : -EFAULT) || copy_from_user(&tmp,
|
|
|
- (struct ipc_kludge *) ptr, sizeof(tmp));
|
|
|
- if (ret)
|
|
|
- break;
|
|
|
- ret = sys_msgrcv(first, tmp.msgp, second, tmp.msgtyp,
|
|
|
- third);
|
|
|
- break;
|
|
|
- }
|
|
|
- default:
|
|
|
- ret = sys_msgrcv(first, (struct msgbuf *) ptr,
|
|
|
- second, fifth, third);
|
|
|
- break;
|
|
|
- }
|
|
|
- break;
|
|
|
- case MSGGET:
|
|
|
- ret = sys_msgget((key_t) first, second);
|
|
|
- break;
|
|
|
- case MSGCTL:
|
|
|
- ret = sys_msgctl(first, second, (struct msqid_ds *) ptr);
|
|
|
- break;
|
|
|
- case SHMAT:
|
|
|
- switch (version) {
|
|
|
- default: {
|
|
|
- ulong raddr;
|
|
|
- ret = access_ok(VERIFY_WRITE, (ulong *) third,
|
|
|
- sizeof(ulong)) ? 0 : -EFAULT;
|
|
|
- if (ret)
|
|
|
- break;
|
|
|
- ret = do_shmat(first, (char *) ptr, second, &raddr);
|
|
|
- if (ret)
|
|
|
- break;
|
|
|
- ret = put_user(raddr, (ulong *) third);
|
|
|
- break;
|
|
|
- }
|
|
|
- case 1: /* iBCS2 emulator entry point */
|
|
|
- if (!segment_eq(get_fs(), get_ds()))
|
|
|
- break;
|
|
|
- ret = do_shmat(first, (char *) ptr, second,
|
|
|
- (ulong *) third);
|
|
|
- break;
|
|
|
- }
|
|
|
- break;
|
|
|
- case SHMDT:
|
|
|
- ret = sys_shmdt((char *)ptr);
|
|
|
- break;
|
|
|
- case SHMGET:
|
|
|
- ret = sys_shmget(first, second, third);
|
|
|
- break;
|
|
|
- case SHMCTL:
|
|
|
- ret = sys_shmctl(first, second, (struct shmid_ds *) ptr);
|
|
|
- break;
|
|
|
- }
|
|
|
- return ret;
|
|
|
-}
|
|
|
|
|
|
asmlinkage long microblaze_vfork(struct pt_regs *regs)
|
|
|
{
|