| Martin Schwidefsky | b020632 | 2008-12-25 13:38:36 +0100 | [diff] [blame] | 1 | /* | 
 | 2 |  * Userland implementation of gettimeofday() for 32 bits processes in a | 
 | 3 |  * s390 kernel for use in the vDSO | 
 | 4 |  * | 
 | 5 |  *  Copyright IBM Corp. 2008 | 
 | 6 |  *  Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com) | 
 | 7 |  * | 
 | 8 |  * This program is free software; you can redistribute it and/or modify | 
 | 9 |  * it under the terms of the GNU General Public License (version 2 only) | 
 | 10 |  * as published by the Free Software Foundation. | 
 | 11 |  */ | 
 | 12 | #include <asm/vdso.h> | 
 | 13 | #include <asm/asm-offsets.h> | 
 | 14 | #include <asm/unistd.h> | 
 | 15 |  | 
| Martin Schwidefsky | b020632 | 2008-12-25 13:38:36 +0100 | [diff] [blame] | 16 | 	.text | 
 | 17 | 	.align 4 | 
 | 18 | 	.globl __kernel_gettimeofday | 
 | 19 | 	.type  __kernel_gettimeofday,@function | 
 | 20 | __kernel_gettimeofday: | 
 | 21 | 	.cfi_startproc | 
 | 22 | 	basr	%r5,0 | 
 | 23 | 0:	al	%r5,13f-0b(%r5)			/* get &_vdso_data */ | 
 | 24 | 1:	ltr	%r3,%r3				/* check if tz is NULL */ | 
 | 25 | 	je	2f | 
 | 26 | 	mvc	0(8,%r3),__VDSO_TIMEZONE(%r5) | 
 | 27 | 2:	ltr	%r2,%r2				/* check if tv is NULL */ | 
 | 28 | 	je	10f | 
 | 29 | 	l	%r4,__VDSO_UPD_COUNT+4(%r5)	/* load update counter */ | 
 | 30 | 	tml	%r4,0x0001			/* pending update ? loop */ | 
 | 31 | 	jnz	1b | 
 | 32 | 	stck	24(%r15)			/* Store TOD clock */ | 
 | 33 | 	lm	%r0,%r1,24(%r15) | 
 | 34 | 	s	%r0,__VDSO_XTIME_STAMP(%r5)	/* TOD - cycle_last */ | 
 | 35 | 	sl	%r1,__VDSO_XTIME_STAMP+4(%r5) | 
 | 36 | 	brc	3,3f | 
 | 37 | 	ahi	%r0,-1 | 
| Hendrik Brueckner | 157a1a2 | 2010-04-22 17:17:06 +0200 | [diff] [blame] | 38 | 3:	ms	%r0,__VDSO_NTP_MULT(%r5)	/* cyc2ns(clock,cycle_delta) */ | 
| Martin Schwidefsky | b020632 | 2008-12-25 13:38:36 +0100 | [diff] [blame] | 39 | 	st	%r0,24(%r15) | 
| Hendrik Brueckner | 157a1a2 | 2010-04-22 17:17:06 +0200 | [diff] [blame] | 40 | 	l	%r0,__VDSO_NTP_MULT(%r5) | 
| Martin Schwidefsky | b020632 | 2008-12-25 13:38:36 +0100 | [diff] [blame] | 41 | 	ltr	%r1,%r1 | 
 | 42 | 	mr	%r0,%r0 | 
 | 43 | 	jnm	4f | 
| Hendrik Brueckner | 157a1a2 | 2010-04-22 17:17:06 +0200 | [diff] [blame] | 44 | 	a	%r0,__VDSO_NTP_MULT(%r5) | 
| Martin Schwidefsky | b020632 | 2008-12-25 13:38:36 +0100 | [diff] [blame] | 45 | 4:	al	%r0,24(%r15) | 
 | 46 | 	srdl	%r0,12 | 
 | 47 | 	al	%r0,__VDSO_XTIME_NSEC(%r5)	/*  + xtime */ | 
 | 48 | 	al	%r1,__VDSO_XTIME_NSEC+4(%r5) | 
 | 49 | 	brc	12,5f | 
 | 50 | 	ahi	%r0,1 | 
 | 51 | 5:	mvc	24(4,%r15),__VDSO_XTIME_SEC+4(%r5) | 
 | 52 | 	cl	%r4,__VDSO_UPD_COUNT+4(%r5)	/* check update counter */ | 
 | 53 | 	jne	1b | 
 | 54 | 	l	%r4,24(%r15)			/* get tv_sec from stack */ | 
 | 55 | 	basr	%r5,0 | 
 | 56 | 6:	ltr	%r0,%r0 | 
 | 57 | 	jnz	7f | 
 | 58 | 	cl	%r1,11f-6b(%r5) | 
 | 59 | 	jl	8f | 
 | 60 | 7:	ahi	%r4,1 | 
 | 61 | 	sl	%r1,11f-6b(%r5) | 
 | 62 | 	brc	3,6b | 
 | 63 | 	ahi	%r0,-1 | 
 | 64 | 	j	6b | 
 | 65 | 8:	st	%r4,0(%r2)			/* store tv->tv_sec */ | 
 | 66 | 	ltr	%r1,%r1 | 
 | 67 | 	m	%r0,12f-6b(%r5) | 
 | 68 | 	jnm	9f | 
 | 69 | 	al	%r0,12f-6b(%r5) | 
 | 70 | 9:	srl	%r0,6 | 
 | 71 | 	st	%r0,4(%r2)			/* store tv->tv_usec */ | 
 | 72 | 10:	slr	%r2,%r2 | 
 | 73 | 	br	%r14 | 
 | 74 | 11:	.long	1000000000 | 
 | 75 | 12:	.long	274877907 | 
 | 76 | 13:	.long	_vdso_data - 0b | 
 | 77 | 	.cfi_endproc | 
 | 78 | 	.size	__kernel_gettimeofday,.-__kernel_gettimeofday |