mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-03 23:58:05 +00:00
m68knommu: NPTL support for uClinux
Port syscalls for NPTL support to m68knommu. Signed-off-by: Maxim Kuvyrkov <maxim@codesourcery.com> Acked-by: Greg Ungerer <gerg@uclinux.org> Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
This commit is contained in:
parent
9674cdc74d
commit
a58f753490
5 changed files with 50 additions and 0 deletions
|
@ -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,
|
||||||
|
|
||||||
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)
|
||||||
}
|
}
|
||||||
#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[])
|
||||||
: "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)
|
||||||
.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
|
||||||
|
|
Loading…
Reference in a new issue