On 12/17/09 3:11 AM, Greg Ungerer wrote:

Hi Maxim,
...
Overall this looks ok to me. (Though it seems the formatting on
"unsigned long tp_value" in the patch to thread_info_no.h doesn't
match the existing field alignment).

Did you want me to pick this up and apply the the m68knommu.git
tree for inclusion in 2.6.34?

Yes, please.

Here is the updated patch that includes final touches (read_tp and write_tp syscalls were renamed to get_thread_area and set_thread_area to be consistent with other architectures).

Regards,

--
Maxim Kuvyrkov
CodeSourcery
ma...@codesourcery.com
(650) 331-3385 x724
From 48dda9222da328acae2895e14aecfe3ff2d9b7d2 Mon Sep 17 00:00:00 2001
From: Maxim Kuvyrkov <ma...@codesourcery.com>
Date: Sun, 6 Dec 2009 10:08:14 -0800
Subject: [PATCH 2/2] NPTL support for uClinux

Port syscalls for NPTL support to m68knommu.

Signed-off-by: Maxim Kuvyrkov <ma...@codesourcery.com>
---
 arch/m68k/include/asm/thread_info_no.h |    1 +
 arch/m68knommu/kernel/process.c        |    4 +++
 arch/m68knommu/kernel/ptrace.c         |    5 ++++
 arch/m68knommu/kernel/sys_m68k.c       |   36 ++++++++++++++++++++++++++++++++
 arch/m68knommu/kernel/syscalltable.S   |    4 +++
 5 files changed, 50 insertions(+), 0 deletions(-)

diff --git a/arch/m68k/include/asm/thread_info_no.h 
b/arch/m68k/include/asm/thread_info_no.h
index c2bde5e..567d18d 100644
--- a/arch/m68k/include/asm/thread_info_no.h
+++ b/arch/m68k/include/asm/thread_info_no.h
@@ -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;
 };
 
diff --git a/arch/m68knommu/kernel/process.c b/arch/m68knommu/kernel/process.c
index 8f8f4ab..e685200 100644
--- a/arch/m68knommu/kernel/process.c
+++ b/arch/m68knommu/kernel/process.c
@@ -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
diff --git a/arch/m68knommu/kernel/ptrace.c b/arch/m68knommu/kernel/ptrace.c
index 4d38289..85ed2f9 100644
--- a/arch/m68knommu/kernel/ptrace.c
+++ b/arch/m68knommu/kernel/ptrace.c
@@ -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;
diff --git a/arch/m68knommu/kernel/sys_m68k.c b/arch/m68knommu/kernel/sys_m68k.c
index efdd090..1a6efa8 100644
--- a/arch/m68knommu/kernel/sys_m68k.c
+++ b/arch/m68knommu/kernel/sys_m68k.c
@@ -224,3 +224,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;
+}
diff --git a/arch/m68knommu/kernel/syscalltable.S 
b/arch/m68knommu/kernel/syscalltable.S
index 23535cc..144823d 100644
--- a/arch/m68knommu/kernel/syscalltable.S
+++ b/arch/m68knommu/kernel/syscalltable.S
@@ -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
-- 
1.6.2.4

_______________________________________________
uClinux-dev mailing list
uClinux-dev@uclinux.org
http://mailman.uclinux.org/mailman/listinfo/uclinux-dev
This message was resent by uclinux-dev@uclinux.org
To unsubscribe see:
http://mailman.uclinux.org/mailman/options/uclinux-dev

Reply via email to