return error;
}
+/*
+ * This is the lowest virtual address we can permit any user space
+ * mapping to be mapped at. This is particularly important for
+ * non-high vector CPUs.
+ */
+#define MIN_MAP_ADDR (PAGE_SIZE)
+
/* common code for old and new mmaps */
inline long do_mmap2(
unsigned long addr, unsigned long len,
flags &= ~(MAP_EXECUTABLE | MAP_DENYWRITE);
- if (flags & MAP_FIXED && addr < FIRST_USER_ADDRESS)
+ if (flags & MAP_FIXED && addr < MIN_MAP_ADDR)
goto out;
error = -EBADF;
{
unsigned long ret = -EINVAL;
- if (flags & MREMAP_FIXED && new_addr < FIRST_USER_ADDRESS)
+ if (flags & MREMAP_FIXED && new_addr < MIN_MAP_ADDR)
goto out;
down_write(¤t->mm->mmap_sem);
switch (call) {
case SEMOP:
- return sys_semtimedop (first, (struct sembuf __user *)ptr, second, NULL);
- case SEMTIMEDOP:
- return sys_semtimedop(first, (struct sembuf __user *)ptr, second,
- (const struct timespec __user *)fifth);
-
+ return sys_semop(first, (struct sembuf __user *)ptr, second);
case SEMGET:
return sys_semget (first, second, third);
case SEMCTL: {
/* Clone a task - this clones the calling program thread.
* This is called indirectly via a small wrapper
*/
-asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp,
- int __user *parent_tidptr, int tls_val,
- int __user *child_tidptr, struct pt_regs *regs)
+asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp, struct pt_regs *regs)
{
+ /*
+ * We don't support SETTID / CLEARTID
+ */
+ if (clone_flags & (CLONE_PARENT_SETTID | CLONE_CHILD_CLEARTID))
+ return -EINVAL;
+
if (!newsp)
newsp = regs->ARM_sp;
- return do_fork(clone_flags, newsp, regs, 0, parent_tidptr, child_tidptr);
+ return do_fork(clone_flags, newsp, regs, 0, NULL, NULL);
}
asmlinkage int sys_vfork(struct pt_regs *regs)
"b ret_to_user"
:
: "r" (current_thread_info()),
- "Ir" (THREAD_START_SP - sizeof(regs)),
+ "Ir" (THREAD_SIZE - 8 - sizeof(regs)),
"r" (®s),
"Ir" (sizeof(regs))
: "r0", "r1", "r2", "r3", "ip", "memory");