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

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
...@@ -37,6 +37,7 @@ struct thread_info { ...@@ -37,6 +37,7 @@ struct thread_info {
unsigned long flags; /* low level flags */ unsigned long flags; /* low level flags */
int cpu; /* cpu we're on */ int cpu; /* cpu we're on */
int preempt_count; /* 0 => preemptable, <0 => BUG */ int preempt_count; /* 0 => preemptable, <0 => BUG */
unsigned long tp_value; /* thread pointer */
struct restart_block restart_block; struct restart_block restart_block;
}; };
......
...@@ -221,6 +221,10 @@ int copy_thread(unsigned long clone_flags, ...@@ -221,6 +221,10 @@ int copy_thread(unsigned long clone_flags,
p->thread.usp = usp; p->thread.usp = usp;
p->thread.ksp = (unsigned long)childstack; 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 * Must save the current SFC/DFC value, NOT the value when
* the parent was last descheduled - RGH 10-08-96 * the parent was last descheduled - RGH 10-08-96
......
...@@ -319,6 +319,11 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) ...@@ -319,6 +319,11 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
} }
#endif #endif
case PTRACE_GET_THREAD_AREA:
ret = put_user(task_thread_info(child)->tp_value,
(unsigned long __user *)data);
break;
default: default:
ret = -EIO; ret = -EIO;
break; break;
......
...@@ -190,3 +190,39 @@ int kernel_execve(const char *filename, char *const argv[], char *const envp[]) ...@@ -190,3 +190,39 @@ int kernel_execve(const char *filename, char *const argv[], char *const envp[])
: "d" (__a), "d" (__b), "d" (__c)); : "d" (__a), "d" (__b), "d" (__c));
return __res; 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;
}
...@@ -351,6 +351,10 @@ ENTRY(sys_call_table) ...@@ -351,6 +351,10 @@ ENTRY(sys_call_table)
.long sys_pwritev /* 330 */ .long sys_pwritev /* 330 */
.long sys_rt_tgsigqueueinfo .long sys_rt_tgsigqueueinfo
.long sys_perf_event_open .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 .rept NR_syscalls-(.-sys_call_table)/4
.long sys_ni_syscall .long sys_ni_syscall
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment