Skip to content

Commit

Permalink
m68knommu: NPTL support for uClinux
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Maxim Kuvyrkov authored and Geert Uytterhoeven committed Feb 27, 2010
1 parent 9674cdc commit a58f753
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 0 deletions.
1 change: 1 addition & 0 deletions arch/m68k/include/asm/thread_info_no.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
};

Expand Down
4 changes: 4 additions & 0 deletions arch/m68knommu/kernel/process.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 5 additions & 0 deletions arch/m68knommu/kernel/ptrace.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
36 changes: 36 additions & 0 deletions arch/m68knommu/kernel/sys_m68k.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 changes: 4 additions & 0 deletions arch/m68knommu/kernel/syscalltable.S
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit a58f753

Please sign in to comment.