public inbox for libc-hacker@sourceware.org
 help / color / mirror / Atom feed
* [PATCH] SH nptl tidyup
@ 2008-01-21 23:46 Kaz Kojima
  2008-01-22 18:31 ` Ulrich Drepper
  0 siblings, 1 reply; 8+ messages in thread
From: Kaz Kojima @ 2008-01-21 23:46 UTC (permalink / raw)
  To: libc-hacker

Hi,

Here is another nptl patch for SH to sync with the recent change
of sem_post.

Regards,
        kaz
-
2008-01-22  Kaz Kojima  <kkojima@rr.iij4u.or.jp>

	* sysdeps/unix/sysv/linux/sh/sem_post.S: Don't overflow value field.

--- ORIG/libc/nptl/sysdeps/unix/sysv/linux/sh/sem_post.S	2007-08-04 09:57:14.000000000 +0900
+++ LOCAL/libc/nptl/sysdeps/unix/sysv/linux/sh/sem_post.S	2008-01-22 08:27:18.000000000 +0900
@@ -30,8 +30,16 @@
 	.type	__new_sem_post,@function
 	.align	5
 __new_sem_post:
-	mov	#1, r3
-	XADD (r3, @(VALUE,r4), r2, r5)
+	mov.l	@(VALUE,r4), r2
+0:
+	mov.l	.Lmax, r1
+	cmp/eq	r1, r2
+	bt/s	3f
+	 mov	r2, r3
+	mov	r3, r5
+	add	#1, r5
+	CMPXCHG (r3, @(VALUE,r4), r5, r2)
+	bf	0b
 	mov.l	@(NWAITERS,r4), r2
 	tst	r2, r2
 	bt	2f
@@ -52,7 +60,15 @@ __new_sem_post:
 	 mov	#0, r0
 
 1:
-	mov	#EINVAL, r2
+	bra	4f
+	 mov	#EINVAL, r2
+
+3:
+	mov	#EOVERFLOW, r2
+4:	
+	mov.l	r12, @-r15
+	mov.l	r8, @-r15
+	sts.l	pr, @-r15
 	mova	.Lgot3, r0
 	mov.l	.Lgot3, r12
 	add	r0, r12
@@ -67,19 +83,24 @@ __new_sem_post:
 .Lerrno3:
 	.long	errno@GOTTPOFF
 .Lexit:
+	mov.l	r2, @r0
 #else
+	mov	r2, r8
 	mov.l	.Lerrloc3, r1
 	bsrf	r1
 	 nop
 .Lerrloc3b:
+	mov	r8, @r0
 #endif
-	mov.l	r2, @r0
 	lds.l	@r15+, pr
+	mov.l	@r15+, r8
 	mov.l	@r15+, r12
 	rts
 	 mov	#-1, r0
 
 	.align	2
+.Lmax:
+	.long	SEM_VALUE_MAX
 .Lgot3:
 	.long	_GLOBAL_OFFSET_TABLE_
 #if !USE___THREAD

^ permalink raw reply	[flat|nested] 8+ messages in thread
* [PATCH] SH nptl tidyup
@ 2009-01-14  3:49 Kaz Kojima
  2009-01-28 16:10 ` Ulrich Drepper
  0 siblings, 1 reply; 8+ messages in thread
From: Kaz Kojima @ 2009-01-14  3:49 UTC (permalink / raw)
  To: libc-hacker

Hi,

The attached patch is a nptl patch for SH to sync with the recent
x86 changes.

Regards,
        kaz
--
2009-01-14  Kaz Kojima  <kkojima@rr.iij4u.or.jp>

	* sysdeps/unix/sysv/linux/sh/lowlevellock.S
	(__lll_timedlock_wait): Use FUTEX_WAIT_BITSET|FUTEX_CLOCK_REALTIME
	instead of computing relative timeout.

	* sysdeps/unix/sysv/linux/sh/lowlevellock.h: Define
	FUTEX_CLOCK_REALTIME and FUTEX_BITSET_MATCH_ANY.

diff -uprN ORIG/libc/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S LOCAL/libc/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S
--- ORIG/libc/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S	2008-01-23 06:46:43.000000000 +0900
+++ LOCAL/libc/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S	2009-01-14 10:49:59.000000000 +0900
@@ -1,4 +1,4 @@
-/* Copyright (C) 2003, 2004, 2005, 2007, 2008
+/* Copyright (C) 2003, 2004, 2005, 2007, 2008, 2009
    Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
@@ -36,6 +36,13 @@
 	mov	#(FUTEX_WAIT | FUTEX_PRIVATE_FLAG), tmp; \
 	extu.b	tmp, tmp; \
 	xor	tmp, reg
+# define LOAD_FUTEX_WAIT_ABS(reg,tmp,tmp2) \
+	mov	#(FUTEX_WAIT_BITSET | FUTEX_PRIVATE_FLAG), tmp; \
+	extu.b	tmp, tmp; \
+	mov	#(FUTEX_CLOCK_REALTIME >> 8), tmp2; \
+	swap.b	tmp2, tmp2; \
+	or	tmp2, tmp; \
+	xor	tmp, reg
 # define LOAD_FUTEX_WAKE(reg,tmp,tmp2) \
 	mov	#(FUTEX_WAKE | FUTEX_PRIVATE_FLAG), tmp; \
 	extu.b	tmp, tmp; \
@@ -96,6 +103,22 @@
 	and	tmp2, reg	; \
 	mov	#FUTEX_WAIT, tmp ; \
 	or	tmp, reg
+#  define LOAD_FUTEX_WAIT_ABS(reg,tmp,tmp2) \
+	stc	gbr, tmp	; \
+	mov.w	99f, tmp2	; \
+	add	tmp2, tmp 	; \
+	mov.l	@tmp, tmp2	; \
+	bra	98f		; \
+	 mov	#FUTEX_PRIVATE_FLAG, tmp ; \
+99:	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE ; \
+98:	extu.b	tmp, tmp	; \
+	xor	tmp, reg	; \
+	and	tmp2, reg	; \
+	mov	#FUTEX_WAIT_BITSET, tmp ; \
+	mov	#(FUTEX_CLOCK_REALTIME >> 8), tmp2; \
+	swap.b	tmp2, tmp2; \
+	or	tmp2, tmp; \
+	or	tmp, reg
 # endif
 # define LOAD_FUTEX_WAKE(reg,tmp,tmp2) \
 	stc	gbr, tmp	; \
@@ -193,12 +216,85 @@ __lll_lock_wait:
 	cfi_endproc
 	.size	__lll_lock_wait,.-__lll_lock_wait
 
+	/*      r5  (r8): futex
+		r7 (r11): flags
+		r6  (r9): timeout
+		r4 (r10): futex value
+	*/
 	.globl	__lll_timedlock_wait
 	.type	__lll_timedlock_wait,@function
 	.hidden	__lll_timedlock_wait
 	.align	5
 	cfi_startproc
 __lll_timedlock_wait:
+	mov.l	r12, @-r15
+	cfi_adjust_cfa_offset(4)
+	cfi_rel_offset (r12, 0)
+
+# ifndef __ASSUME_FUTEX_CLOCK_REALTIME
+	mov.l	.Lhave, r1
+#  ifdef PIC
+	mova	.Lgot, r0
+	mov.l	.Lgot, r12
+	add	r0, r12
+	add	r12, r1
+#  endif
+	mov.l	@r1, r0
+	tst	r0, r0
+	bt	.Lreltmo
+# endif
+
+	mov	r4, r2
+	mov	r5, r4
+	mov	r7, r5
+	mov	r6, r7
+	LOAD_FUTEX_WAIT_ABS (r5, r0, r1)
+
+	mov	#2, r6
+	cmp/eq	r6, r2
+	bf/s	2f
+	 mov	r2, r6
+
+1:
+	mov	#2, r6
+	mov	#-1, r1
+	mov	#SYS_futex, r3
+	extu.b	r3, r3
+	trapa	#0x16
+	SYSCALL_INST_PAD
+	mov	r0, r6
+
+2:
+	XCHG	(r2, @r4, r3)	/* NB:   lock is implied */
+
+	tst	r3, r3
+	bt/s	3f
+	 mov	r6, r0
+
+	cmp/eq	#-ETIMEDOUT, r0
+	bt	4f
+	cmp/eq	#-EINVAL, r0
+	bf	1b
+4:
+	neg	r0, r3
+3:
+	mov	r3, r0
+	rts
+	 mov.l	@r15+, r12
+
+	.align	2
+# ifdef PIC
+.Lgot:
+	.long	_GLOBAL_OFFSET_TABLE_
+.Lhave:
+	.long	__have_futex_clock_realtime@GOTOFF
+# else
+.Lhave:
+	.long	__have_futex_clock_realtime
+# endif
+
+# ifndef __ASSUME_FUTEX_CLOCK_REALTIME
+.Lreltmo:
 	/* Check for a valid timeout value.  */
 	mov.l	@(4,r6), r1
 	mov.l	.L1g, r0
@@ -290,12 +386,15 @@ __lll_timedlock_wait:
 	mov.l	@r15+, r8
 	mov.l	@r15+, r9
 	mov.l	@r15+, r10
+	mov.l	@r15+, r11
 	rts
-	 mov.l	@r15+, r11
+	 mov.l	@r15+, r12
 
 3:
+	mov.l	@r15+, r12
 	rts
 	 mov	#EINVAL, r0
+# endif
 	cfi_endproc
 
 .L1k:
diff -uprN ORIG/libc/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h LOCAL/libc/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h
--- ORIG/libc/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h	2008-12-06 07:14:23.000000000 +0900
+++ LOCAL/libc/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h	2009-01-13 22:37:01.000000000 +0900
@@ -1,4 +1,5 @@
-/* Copyright (C) 2003, 2004, 2006, 2007, 2008 Free Software Foundation, Inc.
+/* Copyright (C) 2003, 2004, 2006, 2007, 2008, 2009
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -37,6 +38,9 @@
 #define FUTEX_WAIT_BITSET	9
 #define FUTEX_WAKE_BITSET	10
 #define FUTEX_PRIVATE_FLAG	128
+#define FUTEX_CLOCK_REALTIME	256
+
+#define FUTEX_BITSET_MATCH_ANY	0xffffffff
 
 #define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE	((4 << 24) | 1)
 

^ permalink raw reply	[flat|nested] 8+ messages in thread
* [PATCH] SH nptl tidyup
@ 2008-12-04  4:01 Kaz Kojima
  2008-12-05 22:06 ` Ulrich Drepper
  0 siblings, 1 reply; 8+ messages in thread
From: Kaz Kojima @ 2008-12-04  4:01 UTC (permalink / raw)
  To: libc-hacker

Hi,

Here is a patch for SH to sync with the recent change of
lowlevellock.h for other ports.

Regards,
	kaz
--
2008-12-04  Kaz Kojima  <kkojima@rr.iij4u.or.jp>

	* sysdeps/unix/sysv/linux/sh/lowlevellock.h: Define FUTEX_WAIT_BITSET
	and FUTEX_WAKE_BITSET.

--- ORIG/libc/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h	2007-08-04 09:57:13.000000000 +0900
+++ LOCAL/libc/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.h	2008-12-04 09:04:29.000000000 +0900
@@ -1,4 +1,4 @@
-/* Copyright (C) 2003, 2004, 2006, 2007 Free Software Foundation, Inc.
+/* Copyright (C) 2003, 2004, 2006, 2007, 2008 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -34,6 +34,8 @@
 #define FUTEX_LOCK_PI		6
 #define FUTEX_UNLOCK_PI		7
 #define FUTEX_TRYLOCK_PI	8
+#define FUTEX_WAIT_BITSET	9
+#define FUTEX_WAKE_BITSET	10
 #define FUTEX_PRIVATE_FLAG	128
 
 #define FUTEX_OP_CLEAR_WAKE_IF_GT_ONE	((4 << 24) | 1)

^ permalink raw reply	[flat|nested] 8+ messages in thread
* [PATCH] SH nptl tidyup
@ 2007-12-04  4:14 Kaz Kojima
  0 siblings, 0 replies; 8+ messages in thread
From: Kaz Kojima @ 2007-12-04  4:14 UTC (permalink / raw)
  To: libc-hacker

Hi,

Here is a nptl patch for SH to sync with the recent x86 changes.

Regards,
        kaz
-
2007-12-04  Kaz Kojima  <kkojima@rr.iij4u.or.jp>

        * sysdeps/unix/sysv/linux/sh/lowlevellock.S (__lll_timedlock_wait):
        Store 2 before returning ETIMEDOUT.

diff -uprN ORIG/libc/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S LOCAL/libc/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S
--- ORIG/libc/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S	2007-11-06 10:32:41.000000000 +0900
+++ LOCAL/libc/nptl/sysdeps/unix/sysv/linux/sh/lowlevellock.S	2007-12-04 13:02:45.000000000 +0900
@@ -225,6 +225,12 @@ __lll_timedlock_wait:
 	add	#-8, r15
 	cfi_adjust_cfa_offset(8)
 
+	mov	#2, r2
+	XCHG (r2, @r8, r3)
+
+	tst	r3, r3
+	bt	6f
+	
 1:
 	/* Get current time.  */
 	mov	r15, r4
@@ -250,17 +256,11 @@ __lll_timedlock_wait:
 	add	#-1, r2
 4:
 	cmp/pz	r2
-	bf	5f		/* Time is already up.  */
+	bf	2f		/* Time is already up.  */
 
 	mov.l	r2, @r15	/* Store relative timeout.  */
 	mov.l	r3, @(4,r15)
 
-	mov	#1, r3
-	mov	#2, r4
-	CMPXCHG (r3, @r8, r4, r2)
-	tst	r2, r2
-	bt	8f
-
 	mov	r8, r4
 	mov	r11, r5
 	LOAD_FUTEX_WAIT (r5, r0, r1)
@@ -272,39 +272,29 @@ __lll_timedlock_wait:
 	SYSCALL_INST_PAD
 	mov	r0, r5
 
-8:
-	mov	#0, r3
-	mov	#2, r4
-	CMPXCHG (r3, @r8, r4, r2)
-	bf/s	7f
-	 mov	#0, r0
+	mov	#2, r2
+	XCHG (r2, @r8, r3)
+
+	tst	r3, r3
+	bt/s	6f
+	 mov	#-ETIMEDOUT, r1
+	cmp/eq	r5, r1
+	bf	1b
+
+2:	mov	#ETIMEDOUT, r3
 
 6:
+	mov	r3, r0
 	add	#8, r15
 	mov.l	@r15+, r8
 	mov.l	@r15+, r9
 	mov.l	@r15+, r10
 	rts
 	 mov.l	@r15+, r11
-7:
-	/* Check whether the time expired.  */
-	mov	#-ETIMEDOUT, r1
-	cmp/eq	r5, r1
-	bt	5f
 
-	/* Make sure the current holder knows we are going to sleep.  */
-	XCHG (r2, @r8, r3)
-	tst	r3, r3
-	bt/s	6b
-	 mov	#0, r0
-	bra	1b
-	 nop
 3:
 	rts
 	 mov	#EINVAL, r0
-5:
-	bra	6b
-	 mov	#ETIMEDOUT, r0
 	cfi_endproc
 
 .L1k:


^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2009-01-28 16:10 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-01-21 23:46 [PATCH] SH nptl tidyup Kaz Kojima
2008-01-22 18:31 ` Ulrich Drepper
  -- strict thread matches above, loose matches on Subject: below --
2009-01-14  3:49 Kaz Kojima
2009-01-28 16:10 ` Ulrich Drepper
2008-12-04  4:01 Kaz Kojima
2008-12-05 22:06 ` Ulrich Drepper
2008-12-05 23:49   ` Kaz Kojima
2007-12-04  4:14 Kaz Kojima

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).