]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blob - arch/s390/kernel/vdso32/gettimeofday.S
Merge tag 'mmc-v4.15-2' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc
[mirror_ubuntu-bionic-kernel.git] / arch / s390 / kernel / vdso32 / gettimeofday.S
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /*
3 * Userland implementation of gettimeofday() for 32 bits processes in a
4 * s390 kernel for use in the vDSO
5 *
6 * Copyright IBM Corp. 2008
7 * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com)
8 */
9 #include <asm/vdso.h>
10 #include <asm/asm-offsets.h>
11 #include <asm/unistd.h>
12
13 .text
14 .align 4
15 .globl __kernel_gettimeofday
16 .type __kernel_gettimeofday,@function
17 __kernel_gettimeofday:
18 .cfi_startproc
19 ahi %r15,-16
20 basr %r5,0
21 0: al %r5,13f-0b(%r5) /* get &_vdso_data */
22 1: ltr %r3,%r3 /* check if tz is NULL */
23 je 2f
24 mvc 0(8,%r3),__VDSO_TIMEZONE(%r5)
25 2: ltr %r2,%r2 /* check if tv is NULL */
26 je 10f
27 l %r4,__VDSO_UPD_COUNT+4(%r5) /* load update counter */
28 tml %r4,0x0001 /* pending update ? loop */
29 jnz 1b
30 stcke 0(%r15) /* Store TOD clock */
31 lm %r0,%r1,__VDSO_TS_END(%r5) /* TOD steering end time */
32 s %r0,1(%r15)
33 sl %r1,5(%r15)
34 brc 3,14f
35 ahi %r0,-1
36 14: ltr %r0,%r0 /* past end of steering? */
37 jm 16f
38 srdl %r0,15 /* 1 per 2^16 */
39 tm __VDSO_TS_DIR+3(%r5),0x01 /* steering direction? */
40 jz 15f
41 lcr %r0,%r0 /* negative TOD offset */
42 lcr %r1,%r1
43 je 15f
44 ahi %r0,-1
45 15: a %r0,1(%r15) /* add TOD timestamp */
46 al %r1,5(%r15)
47 brc 12,17f
48 ahi %r0,1
49 j 17f
50 16: lm %r0,%r1,1(%r15) /* load TOD timestamp */
51 17: s %r0,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */
52 sl %r1,__VDSO_XTIME_STAMP+4(%r5)
53 brc 3,3f
54 ahi %r0,-1
55 3: ms %r0,__VDSO_TK_MULT(%r5) /* * tk->mult */
56 st %r0,0(%r15)
57 l %r0,__VDSO_TK_MULT(%r5)
58 ltr %r1,%r1
59 mr %r0,%r0
60 jnm 4f
61 a %r0,__VDSO_TK_MULT(%r5)
62 4: al %r0,0(%r15)
63 al %r0,__VDSO_XTIME_NSEC(%r5) /* + xtime */
64 al %r1,__VDSO_XTIME_NSEC+4(%r5)
65 brc 12,5f
66 ahi %r0,1
67 5: mvc 0(4,%r15),__VDSO_XTIME_SEC+4(%r5)
68 cl %r4,__VDSO_UPD_COUNT+4(%r5) /* check update counter */
69 jne 1b
70 l %r4,__VDSO_TK_SHIFT(%r5) /* Timekeeper shift */
71 srdl %r0,0(%r4) /* >> tk->shift */
72 l %r4,0(%r15) /* get tv_sec from stack */
73 basr %r5,0
74 6: ltr %r0,%r0
75 jnz 7f
76 cl %r1,11f-6b(%r5)
77 jl 8f
78 7: ahi %r4,1
79 sl %r1,11f-6b(%r5)
80 brc 3,6b
81 ahi %r0,-1
82 j 6b
83 8: st %r4,0(%r2) /* store tv->tv_sec */
84 ltr %r1,%r1
85 m %r0,12f-6b(%r5)
86 jnm 9f
87 al %r0,12f-6b(%r5)
88 9: srl %r0,6
89 st %r0,4(%r2) /* store tv->tv_usec */
90 10: slr %r2,%r2
91 ahi %r15,16
92 br %r14
93 11: .long 1000000000
94 12: .long 274877907
95 13: .long _vdso_data - 0b
96 .cfi_endproc
97 .size __kernel_gettimeofday,.-__kernel_gettimeofday