Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 30286ef6 authored by Paul Mackerras's avatar Paul Mackerras
Browse files

powerpc: Merge syscalls.c and sys_ppc32.c.



Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent 30cd4a4e
Loading
Loading
Loading
Loading
+3 −3
Original line number Original line Diff line number Diff line
@@ -11,7 +11,7 @@ CFLAGS_btext.o += -fPIC
endif
endif


obj-y				:= semaphore.o cputable.o ptrace.o
obj-y				:= semaphore.o cputable.o ptrace.o
obj-$(CONFIG_PPC64)		+= binfmt_elf32.o
obj-$(CONFIG_PPC64)		+= binfmt_elf32.o sys_ppc32.o
obj-$(CONFIG_ALTIVEC)		+= vecemu.o vector.o
obj-$(CONFIG_ALTIVEC)		+= vecemu.o vector.o
obj-$(CONFIG_POWER4)		+= idle_power4.o
obj-$(CONFIG_POWER4)		+= idle_power4.o
obj-$(CONFIG_PPC_OF)		+= of_device.o
obj-$(CONFIG_PPC_OF)		+= of_device.o
@@ -30,7 +30,7 @@ extra-$(CONFIG_PPC_FPU) += fpu.o
extra-y				+= vmlinux.lds
extra-y				+= vmlinux.lds


obj-y				+= process.o init_task.o \
obj-y				+= process.o init_task.o \
				   prom.o systbl.o traps.o
				   prom.o systbl.o traps.o syscalls.o
obj-$(CONFIG_PPC32)		+= entry_32.o setup_32.o misc_32.o
obj-$(CONFIG_PPC32)		+= entry_32.o setup_32.o misc_32.o
obj-$(CONFIG_PPC64)		+= setup_64.o misc_64.o
obj-$(CONFIG_PPC64)		+= setup_64.o misc_64.o
obj-$(CONFIG_PPC_OF)		+= prom_init.o
obj-$(CONFIG_PPC_OF)		+= prom_init.o
@@ -44,7 +44,7 @@ endif


else
else
# stuff used from here for ARCH=ppc or ARCH=ppc64
# stuff used from here for ARCH=ppc or ARCH=ppc64
obj-$(CONFIG_PPC64)		+= traps.o process.o init_task.o
obj-$(CONFIG_PPC64)		+= traps.o process.o init_task.o syscalls.o


fpux-$(CONFIG_PPC32)		+= fpu.o
fpux-$(CONFIG_PPC32)		+= fpu.o
extra-$(CONFIG_PPC_FPU)		+= $(fpux-y)
extra-$(CONFIG_PPC_FPU)		+= $(fpux-y)
+0 −48
Original line number Original line Diff line number Diff line
@@ -985,54 +985,6 @@ asmlinkage long sys32_sysctl(struct __sysctl_args32 __user *args)
}
}
#endif
#endif


asmlinkage int sys32_uname(struct old_utsname __user * name)
{
	int err = 0;
	
	down_read(&uts_sem);
	if (copy_to_user(name, &system_utsname, sizeof(*name)))
		err = -EFAULT;
	up_read(&uts_sem);
	if (!err && personality(current->personality) == PER_LINUX32) {
		/* change "ppc64" to "ppc" */
		if (__put_user(0, name->machine + 3)
		    || __put_user(0, name->machine + 4))
			err = -EFAULT;
	}
	return err;
}

asmlinkage int sys32_olduname(struct oldold_utsname __user * name)
{
	int error;

	if (!access_ok(VERIFY_WRITE,name,sizeof(struct oldold_utsname)))
		return -EFAULT;
  
	down_read(&uts_sem);
	error = __copy_to_user(&name->sysname,&system_utsname.sysname,__OLD_UTS_LEN);
	error |= __put_user(0,name->sysname+__OLD_UTS_LEN);
	error |= __copy_to_user(&name->nodename,&system_utsname.nodename,__OLD_UTS_LEN);
	error |= __put_user(0,name->nodename+__OLD_UTS_LEN);
	error |= __copy_to_user(&name->release,&system_utsname.release,__OLD_UTS_LEN);
	error |= __put_user(0,name->release+__OLD_UTS_LEN);
	error |= __copy_to_user(&name->version,&system_utsname.version,__OLD_UTS_LEN);
	error |= __put_user(0,name->version+__OLD_UTS_LEN);
	error |= __copy_to_user(&name->machine,&system_utsname.machine,__OLD_UTS_LEN);
	error |= __put_user(0,name->machine+__OLD_UTS_LEN);
	if (personality(current->personality) == PER_LINUX32) {
		/* change "ppc64" to "ppc" */
		error |= __put_user(0, name->machine + 3);
		error |= __put_user(0, name->machine + 4);
	}
	
	up_read(&uts_sem);

	error = error ? -EFAULT : 0;
	
	return error;
}

unsigned long sys32_mmap2(unsigned long addr, size_t len,
unsigned long sys32_mmap2(unsigned long addr, size_t len,
			  unsigned long prot, unsigned long flags,
			  unsigned long prot, unsigned long flags,
			  unsigned long fd, unsigned long pgoff)
			  unsigned long fd, unsigned long pgoff)
+134 −46
Original line number Original line Diff line number Diff line
/*
/*
 * linux/arch/ppc64/kernel/sys_ppc.c
 *  Implementation of various system calls for Linux/PowerPC
 *
 *
 *  PowerPC version 
 *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
 *    Copyright (C) 1995-1996 Gary Thomas (gdt@linuxppc.org)
 *
 *
 * Derived from "arch/i386/kernel/sys_i386.c"
 * Derived from "arch/i386/kernel/sys_i386.c"
@@ -52,8 +51,7 @@ extern unsigned long wall_jiffies;
 *
 *
 * This is really horribly ugly.
 * This is really horribly ugly.
 */
 */
asmlinkage int 
int sys_ipc(uint call, int first, unsigned long second, long third,
sys_ipc (uint call, int first, unsigned long second, long third,
	    void __user *ptr, long fifth)
	    void __user *ptr, long fifth)
{
{
	int version, ret;
	int version, ret;
@@ -119,26 +117,14 @@ sys_ipc (uint call, int first, unsigned long second, long third,
		ret = sys_msgctl(first, (int)second,
		ret = sys_msgctl(first, (int)second,
				  (struct msqid_ds __user *)ptr);
				  (struct msqid_ds __user *)ptr);
		break;
		break;
	case SHMAT:
	case SHMAT: {
		switch (version) {
		default: {
		ulong raddr;
		ulong raddr;
			ret = do_shmat(first, (char __user *) ptr,
		ret = do_shmat(first, (char __user *)ptr, (int)second, &raddr);
					(int)second, &raddr);
		if (ret)
		if (ret)
			break;
			break;
		ret = put_user(raddr, (ulong __user *) third);
		ret = put_user(raddr, (ulong __user *) third);
		break;
		break;
	}
	}
		case 1:	/* iBCS2 emulator entry point */
			ret = -EINVAL;
			if (!segment_eq(get_fs(), get_ds()))
				break;
			ret = do_shmat(first, (char __user *)ptr,
					(int)second, (ulong *)third);
			break;
		}
		break;
	case SHMDT:
	case SHMDT:
		ret = sys_shmdt((char __user *)ptr);
		ret = sys_shmdt((char __user *)ptr);
		break;
		break;
@@ -158,7 +144,7 @@ sys_ipc (uint call, int first, unsigned long second, long third,
 * sys_pipe() is the normal C calling standard for creating
 * sys_pipe() is the normal C calling standard for creating
 * a pipe. It's not the way unix traditionally does this, though.
 * a pipe. It's not the way unix traditionally does this, though.
 */
 */
asmlinkage int sys_pipe(int __user *fildes)
int sys_pipe(int __user *fildes)
{
{
	int fd[2];
	int fd[2];
	int error;
	int error;
@@ -168,33 +154,79 @@ asmlinkage int sys_pipe(int __user *fildes)
		if (copy_to_user(fildes, fd, 2*sizeof(int)))
		if (copy_to_user(fildes, fd, 2*sizeof(int)))
			error = -EFAULT;
			error = -EFAULT;
	}
	}
	
	return error;
	return error;
}
}


unsigned long sys_mmap(unsigned long addr, size_t len,
static inline unsigned long do_mmap2(unsigned long addr, size_t len,
			unsigned long prot, unsigned long flags,
			unsigned long prot, unsigned long flags,
		       unsigned long fd, off_t offset)
			unsigned long fd, unsigned long off, int shift)
{
{
	struct file * file = NULL;
	struct file * file = NULL;
	unsigned long ret = -EBADF;
	int ret = -EINVAL;

	if (shift) {
		if (off & ((1 << shift) - 1))
			goto out;
		off >>= shift;
	}
		
		
	ret = -EBADF;
	if (!(flags & MAP_ANONYMOUS)) {
	if (!(flags & MAP_ANONYMOUS)) {
		if (!(file = fget(fd)))
		if (!(file = fget(fd)))
			goto out;
			goto out;
	}
	}


	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
	flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);

	down_write(&current->mm->mmap_sem);
	down_write(&current->mm->mmap_sem);
	ret = do_mmap(file, addr, len, prot, flags, offset);
	ret = do_mmap_pgoff(file, addr, len, prot, flags, off);
	up_write(&current->mm->mmap_sem);
	up_write(&current->mm->mmap_sem);
	if (file)
	if (file)
		fput(file);
		fput(file);

out:
out:
	return ret;
	return ret;
}
}


unsigned long sys_mmap2(unsigned long addr, size_t len,
			unsigned long prot, unsigned long flags,
			unsigned long fd, unsigned long pgoff)
{
	return do_mmap2(addr, len, prot, flags, fd, pgoff, PAGE_SHIFT-12);
}

unsigned long sys_mmap(unsigned long addr, size_t len,
		       unsigned long prot, unsigned long flags,
		       unsigned long fd, off_t offset)
{
	return do_mmap2(addr, len, prot, flags, fd, offset, PAGE_SHIFT);
}

#ifdef CONFIG_PPC32
/*
 * Due to some executables calling the wrong select we sometimes
 * get wrong args.  This determines how the args are being passed
 * (a single ptr to them all args passed) then calls
 * sys_select() with the appropriate args. -- Cort
 */
int
ppc_select(int n, fd_set __user *inp, fd_set __user *outp, fd_set __user *exp, struct timeval __user *tvp)
{
	if ( (unsigned long)n >= 4096 )
	{
		unsigned long __user *buffer = (unsigned long __user *)n;
		if (!access_ok(VERIFY_READ, buffer, 5*sizeof(unsigned long))
		    || __get_user(n, buffer)
		    || __get_user(inp, ((fd_set __user * __user *)(buffer+1)))
		    || __get_user(outp, ((fd_set  __user * __user *)(buffer+2)))
		    || __get_user(exp, ((fd_set  __user * __user *)(buffer+3)))
		    || __get_user(tvp, ((struct timeval  __user * __user *)(buffer+4))))
			return -EFAULT;
	}
	return sys_select(n, inp, outp, exp, tvp);
}
#endif

#ifdef CONFIG_PPC64
long ppc64_personality(unsigned long personality)
long ppc64_personality(unsigned long personality)
{
{
	long ret;
	long ret;
@@ -207,8 +239,25 @@ long ppc64_personality(unsigned long personality)
		ret = PER_LINUX;
		ret = PER_LINUX;
	return ret;
	return ret;
}
}
#endif

#ifdef CONFIG_PPC64
#define OVERRIDE_MACHINE    (personality(current->personality) == PER_LINUX32)
#else
#define OVERRIDE_MACHINE    0
#endif

static inline int override_machine(char *mach)
{
	if (OVERRIDE_MACHINE) {
		/* change ppc64 to ppc */
		if (__put_user(0, mach+3) || __put_user(0, mach+4))
			return -EFAULT;
	}
	return 0;
}


long ppc64_newuname(struct new_utsname __user * name)
long ppc_newuname(struct new_utsname __user * name)
{
{
	int err = 0;
	int err = 0;


@@ -216,16 +265,54 @@ long ppc64_newuname(struct new_utsname __user * name)
	if (copy_to_user(name, &system_utsname, sizeof(*name)))
	if (copy_to_user(name, &system_utsname, sizeof(*name)))
		err = -EFAULT;
		err = -EFAULT;
	up_read(&uts_sem);
	up_read(&uts_sem);
	if (!err && personality(current->personality) == PER_LINUX32) {
	if (!err)
		/* change ppc64 to ppc */
		err = override_machine(name->machine);
		if (__put_user(0, name->machine + 3)
	return err;
		    || __put_user(0, name->machine + 4))
			err = -EFAULT;
}
}

int sys_uname(struct old_utsname __user *name)
{
	int err = 0;
	
	down_read(&uts_sem);
	if (copy_to_user(name, &system_utsname, sizeof(*name)))
		err = -EFAULT;
	up_read(&uts_sem);
	if (!err)
		err = override_machine(name->machine);
	return err;
	return err;
}
}


asmlinkage time_t sys64_time(time_t __user * tloc)
int sys_olduname(struct oldold_utsname __user *name)
{
	int error;

	if (!access_ok(VERIFY_WRITE, name, sizeof(struct oldold_utsname)))
		return -EFAULT;
  
	down_read(&uts_sem);
	error = __copy_to_user(&name->sysname, &system_utsname.sysname,
			       __OLD_UTS_LEN);
	error |= __put_user(0, name->sysname + __OLD_UTS_LEN);
	error |= __copy_to_user(&name->nodename, &system_utsname.nodename,
				__OLD_UTS_LEN);
	error |= __put_user(0, name->nodename + __OLD_UTS_LEN);
	error |= __copy_to_user(&name->release, &system_utsname.release,
				__OLD_UTS_LEN);
	error |= __put_user(0, name->release + __OLD_UTS_LEN);
	error |= __copy_to_user(&name->version, &system_utsname.version,
				__OLD_UTS_LEN);
	error |= __put_user(0, name->version + __OLD_UTS_LEN);
	error |= __copy_to_user(&name->machine, &system_utsname.machine,
				__OLD_UTS_LEN);
	error |= override_machine(name->machine);
	up_read(&uts_sem);

	return error? -EFAULT: 0;
}

#ifdef CONFIG_PPC64
time_t sys64_time(time_t __user * tloc)
{
{
	time_t secs;
	time_t secs;
	time_t usecs;
	time_t usecs;
@@ -247,6 +334,7 @@ asmlinkage time_t sys64_time(time_t __user * tloc)


	return secs;
	return secs;
}
}
#endif


void do_show_syscall(unsigned long r3, unsigned long r4, unsigned long r5,
void do_show_syscall(unsigned long r3, unsigned long r4, unsigned long r5,
		     unsigned long r6, unsigned long r7, unsigned long r8,
		     unsigned long r6, unsigned long r7, unsigned long r8,
+3 −3
Original line number Original line Diff line number Diff line
@@ -102,7 +102,7 @@ COMPAT_SYS(fcntl)
SYSCALL(ni_syscall)
SYSCALL(ni_syscall)
SYSCALL32(setpgid)
SYSCALL32(setpgid)
SYSCALL(ni_syscall)
SYSCALL(ni_syscall)
SYS32ONLY(olduname)
SYSX(sys_ni_syscall,sys_olduname, sys_olduname)
SYSCALL32(umask)
SYSCALL32(umask)
SYSCALL(chroot)
SYSCALL(chroot)
SYSCALL(ustat)
SYSCALL(ustat)
@@ -152,7 +152,7 @@ COMPAT_SYS(getitimer)
COMPAT_SYS(newstat)
COMPAT_SYS(newstat)
COMPAT_SYS(newlstat)
COMPAT_SYS(newlstat)
COMPAT_SYS(newfstat)
COMPAT_SYS(newfstat)
SYSX(sys_ni_syscall,sys32_uname,sys_uname)
SYSX(sys_ni_syscall,sys_uname,sys_uname)
SYSCALL(ni_syscall)
SYSCALL(ni_syscall)
SYSCALL(vhangup)
SYSCALL(vhangup)
SYSCALL(ni_syscall)
SYSCALL(ni_syscall)
@@ -165,7 +165,7 @@ SYSCALL(fsync)
SYSX(sys_ni_syscall,ppc32_sigreturn,sys_sigreturn)
SYSX(sys_ni_syscall,ppc32_sigreturn,sys_sigreturn)
PPC_SYS(clone)
PPC_SYS(clone)
SYSCALL32(setdomainname)
SYSCALL32(setdomainname)
SYSX(ppc64_newuname,ppc64_newuname,sys_newuname)
PPC_SYS(newuname)
SYSCALL(ni_syscall)
SYSCALL(ni_syscall)
SYSCALL32(adjtimex)
SYSCALL32(adjtimex)
SYSCALL(mprotect)
SYSCALL(mprotect)
+1 −2
Original line number Original line Diff line number Diff line
@@ -38,8 +38,7 @@ endif


else
else
obj-y				:= irq.o idle.o time.o \
obj-y				:= irq.o idle.o time.o \
					signal.o align.o \
					signal.o align.o perfmon.o
					syscalls.o perfmon.o
obj-$(CONFIG_6xx)		+= l2cr.o cpu_setup_6xx.o
obj-$(CONFIG_6xx)		+= l2cr.o cpu_setup_6xx.o
obj-$(CONFIG_SOFTWARE_SUSPEND)	+= swsusp.o
obj-$(CONFIG_SOFTWARE_SUSPEND)	+= swsusp.o
obj-$(CONFIG_MODULES)		+= module.o
obj-$(CONFIG_MODULES)		+= module.o
Loading