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

Commit a58f7534 authored by Maxim Kuvyrkov's avatar Maxim Kuvyrkov Committed by Geert Uytterhoeven
Browse files

m68knommu: NPTL support for uClinux



Port syscalls for NPTL support to m68knommu.

Signed-off-by: default avatarMaxim Kuvyrkov <maxim@codesourcery.com>
Acked-by: default avatarGreg Ungerer <gerg@uclinux.org>
Signed-off-by: default avatarGeert Uytterhoeven <geert@linux-m68k.org>
parent 9674cdc7
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ struct thread_info {
	unsigned long	   flags;		/* low level flags */
	int		   cpu;			/* cpu we're on */
	int		   preempt_count;	/* 0 => preemptable, <0 => BUG */
	unsigned long	   tp_value;		/* thread pointer */
	struct restart_block restart_block;
};

+4 −0
Original line number Diff line number Diff line
@@ -221,6 +221,10 @@ int copy_thread(unsigned long clone_flags,

	p->thread.usp = usp;
	p->thread.ksp = (unsigned long)childstack;

	if (clone_flags & CLONE_SETTLS)
		task_thread_info(p)->tp_value = regs->d5;

	/*
	 * Must save the current SFC/DFC value, NOT the value when
	 * the parent was last descheduled - RGH  10-08-96
+5 −0
Original line number Diff line number Diff line
@@ -319,6 +319,11 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
		}
#endif

	case PTRACE_GET_THREAD_AREA:
		ret = put_user(task_thread_info(child)->tp_value,
			       (unsigned long __user *)data);
		break;

		default:
			ret = -EIO;
			break;
+36 −0
Original line number Diff line number Diff line
@@ -190,3 +190,39 @@ int kernel_execve(const char *filename, char *const argv[], char *const envp[])
			: "d" (__a), "d" (__b), "d" (__c));
	return __res;
}

asmlinkage unsigned long sys_get_thread_area(void)
{
	return current_thread_info()->tp_value;
}

asmlinkage int sys_set_thread_area(unsigned long tp)
{
	current_thread_info()->tp_value = tp;
	return 0;
}

/* This syscall gets its arguments in A0 (mem), D2 (oldval) and
   D1 (newval).  */
asmlinkage int
sys_atomic_cmpxchg_32(unsigned long newval, int oldval, int d3, int d4, int d5,
		      unsigned long __user * mem)
{
	struct mm_struct *mm = current->mm;
	unsigned long mem_value;

	down_read(&mm->mmap_sem);

	mem_value = *mem;
	if (mem_value == oldval)
		*mem = newval;

	up_read(&mm->mmap_sem);
	return mem_value;
}

asmlinkage int sys_atomic_barrier(void)
{
	/* no code needed for uniprocs */
	return 0;
}
+4 −0
Original line number Diff line number Diff line
@@ -351,6 +351,10 @@ ENTRY(sys_call_table)
	.long sys_pwritev		/* 330 */
	.long sys_rt_tgsigqueueinfo
	.long sys_perf_event_open
	.long sys_get_thread_area
	.long sys_set_thread_area
	.long sys_atomic_cmpxchg_32	/* 335 */
	.long sys_atomic_barrier

	.rept NR_syscalls-(.-sys_call_table)/4
		.long sys_ni_syscall