/* Copyright (C) 2003-2014 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
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

#include <unwindbuf.h>
#include <sysdep.h>
#include <kernel-features.h>
#include <lowlevellock.h>
#include "lowlevel-atomic.h"


	.comm	__fork_generation, 4, 4

	.text
	.globl	__pthread_once
	.type	__pthread_once,@function
	.align	5
	cfi_startproc
__pthread_once:
	mov.l	@r4, r0
	tst	#2, r0
	bt	1f
	rts
	 mov	#0, r0

1:
	mov.l	r12, @-r15
	cfi_adjust_cfa_offset (4)
	cfi_rel_offset (r12, 0)
	mov.l	r9, @-r15
	cfi_adjust_cfa_offset (4)
	cfi_rel_offset (r9, 0)
	mov.l	r8, @-r15
	cfi_adjust_cfa_offset (4)
	cfi_rel_offset (r8, 0)
	sts.l	pr, @-r15
	cfi_adjust_cfa_offset (4)
	cfi_rel_offset (pr, 0)
	mov	r5, r8
	mov	r4, r9

	/* Not yet initialized or initialization in progress.
	   Get the fork generation counter now.  */
6:
	mov.l	@r4, r1
	mova	.Lgot, r0
	mov.l	.Lgot, r12
	add	r0, r12

5:
	mov	r1, r0

	tst	#2, r0
	bf	4f

	and	#3, r0
	mov.l	.Lfgen, r2
#ifdef PIC
	add	r12, r2
#endif
	mov.l	@r2, r3
	or	r3, r0
	or	#1, r0
	mov	r0, r3
	mov	r1, r5

	CMPXCHG (r5, @r4, r3, r2)
	bf	5b

	/* Check whether another thread already runs the initializer.  */
	mov	r2, r0
	tst	#1, r0
	bt	3f	/* No -> do it.  */

	/* Check whether the initializer execution was interrupted
	   by a fork.  */
	xor	r3, r0
	mov	#-4, r1	/* -4 = 0xfffffffc */
	tst	r1, r0
	bf	3f	/* Different for generation -> run initializer.  */

	/* Somebody else got here first.  Wait.  */
#ifdef __ASSUME_PRIVATE_FUTEX
	mov	#(FUTEX_PRIVATE_FLAG|FUTEX_WAIT), r5
	extu.b	r5, r5
#else
	stc	gbr, r1
	mov.w	.Lpfoff, r2
	add	r2, r1
	mov.l	@r1, r5
# if FUTEX_WAIT != 0
	mov	#FUTEX_WAIT, r0
	or	r0, r5
# endif
#endif
	mov	r3, r6
	mov	#0, r7
	mov	#SYS_futex, r3
	extu.b	r3, r3
	trapa	#0x14
	SYSCALL_INST_PAD
	bra	6b
	 nop

	.align	2
.Lgot:
	.long	_GLOBAL_OFFSET_TABLE_
#ifdef PIC
.Lfgen:
	.long	__fork_generation@GOTOFF
#else
.Lfgen:
	.long	__fork_generation
#endif

3:
	/* Call the initializer function after setting up the
	   cancellation handler.  Note that it is not possible here
	   to use the unwind-based cleanup handling.  This would require
	   that the user-provided function and all the code it calls
	   is compiled with exceptions.  Unfortunately this cannot be
	   guaranteed.  */
	add	#-UNWINDBUFSIZE, r15
	cfi_adjust_cfa_offset (UNWINDBUFSIZE)

	mov.l	.Lsigsetjmp, r1
	mov	#UWJMPBUF, r4
	add	r15, r4
	bsrf	r1
	 mov	#0, r5
.Lsigsetjmp0:
	tst	r0, r0
	bf	7f

	mov.l	.Lcpush, r1
	bsrf	r1
	 mov	r15, r4
.Lcpush0:

	/* Call the user-provided initialization function.  */
	jsr	@r8
	 nop

	/* Pop the cleanup handler.  */
	mov.l	.Lcpop, r1
	bsrf	r1
	 mov	r15, r4
.Lcpop0:

	add	#UNWINDBUFSIZE, r15
	cfi_adjust_cfa_offset (-UNWINDBUFSIZE)

	/* Sucessful run of the initializer.  Signal that we are done.  */
	INC (@r9, r2)
	/* Wake up all other threads.  */
	mov	r9, r4
#ifdef __ASSUME_PRIVATE_FUTEX
	mov	#(FUTEX_PRIVATE_FLAG|FUTEX_WAKE), r5
	extu.b	r5, r5
#else
	stc	gbr, r1
	mov.w	.Lpfoff, r2
	add	r2, r1
	mov.l	@r1, r5
	mov	#FUTEX_WAKE, r0
	or	r0, r5
#endif
	mov	#-1, r6
	shlr	r6		/* r6 = 0x7fffffff */
	mov	#0, r7
	mov	#SYS_futex, r3
	extu.b	r3, r3
	trapa	#0x14
	SYSCALL_INST_PAD

4:
	lds.l	@r15+, pr
	cfi_adjust_cfa_offset (-4)
	cfi_restore (pr)
	mov.l	@r15+, r8
	cfi_adjust_cfa_offset (-4)
	cfi_restore (r8)
	mov.l	@r15+, r9
	cfi_adjust_cfa_offset (-4)
	cfi_restore (r9)
	mov.l	@r15+, r12
	cfi_adjust_cfa_offset (-4)
	cfi_restore (r12)
	rts
	 mov	#0, r0

7:
	/* __sigsetjmp returned for the second time.  */
	cfi_adjust_cfa_offset (UNWINDBUFSIZE+16)
	cfi_offset (r12, -4)
	cfi_offset (r9, -8)
	cfi_offset (r8, -12)
	cfi_offset (pr, -16)
	mov	#0, r7
	mov.l	r7, @r9
	mov	r9, r4
#ifdef __ASSUME_PRIVATE_FUTEX
	mov	#(FUTEX_PRIVATE_FLAG|FUTEX_WAKE), r5
#else
	stc	gbr, r1
	mov.w	.Lpfoff, r2
	add	r2, r1
	mov.l	@r1, r5
	mov	#FUTEX_WAKE, r0
	or	r0, r5
#endif
	extu.b	r5, r5
	mov	#-1, r6
	shlr	r6		/* r6 = 0x7fffffff */
	mov	#SYS_futex, r3
	extu.b	r3, r3
	trapa	#0x14
	SYSCALL_INST_PAD

	mov.l	.Lunext, r1
	bsrf	r1
	 mov	r15, r4
.Lunext0:
	/* NOTREACHED */
	sleep
	cfi_endproc

#ifndef __ASSUME_PRIVATE_FUTEX
.Lpfoff:
	.word	PRIVATE_FUTEX - TLS_PRE_TCB_SIZE
#endif
	.align	2
.Lsigsetjmp:
	.long	__sigsetjmp@PLT-(.Lsigsetjmp0-.)
.Lcpush:
	.long	HIDDEN_JUMPTARGET(__pthread_register_cancel)-.Lcpush0
.Lcpop:
	.long	HIDDEN_JUMPTARGET(__pthread_unregister_cancel)-.Lcpop0
.Lunext:
	.long	HIDDEN_JUMPTARGET(__pthread_unwind_next)-.Lunext0
	.size	__pthread_once,.-__pthread_once

hidden_def (__pthread_once)
strong_alias (__pthread_once, pthread_once)
