]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blame - arch/s390/kernel/vdso32/gettimeofday.S
Merge branch 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[mirror_ubuntu-jammy-kernel.git] / arch / s390 / kernel / vdso32 / gettimeofday.S
CommitLineData
a17ae4c3 1/* SPDX-License-Identifier: GPL-2.0 */
b020632e
MS
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)
b020632e 8 */
b020632e
MS
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
9b2efe03 19 ahi %r15,-16
b020632e
MS
20 basr %r5,0
210: al %r5,13f-0b(%r5) /* get &_vdso_data */
221: ltr %r3,%r3 /* check if tz is NULL */
23 je 2f
24 mvc 0(8,%r3),__VDSO_TIMEZONE(%r5)
252: 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
9b2efe03 30 stcke 0(%r15) /* Store TOD clock */
75c7b6f3
MS
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
3614: 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
4515: a %r0,1(%r15) /* add TOD timestamp */
46 al %r1,5(%r15)
47 brc 12,17f
48 ahi %r0,1
49 j 17f
5016: lm %r0,%r1,1(%r15) /* load TOD timestamp */
5117: s %r0,__VDSO_XTIME_STAMP(%r5) /* TOD - cycle_last */
b020632e
MS
52 sl %r1,__VDSO_XTIME_STAMP+4(%r5)
53 brc 3,3f
54 ahi %r0,-1
79c74ecb 553: ms %r0,__VDSO_TK_MULT(%r5) /* * tk->mult */
9b2efe03 56 st %r0,0(%r15)
79c74ecb 57 l %r0,__VDSO_TK_MULT(%r5)
b020632e
MS
58 ltr %r1,%r1
59 mr %r0,%r0
60 jnm 4f
79c74ecb 61 a %r0,__VDSO_TK_MULT(%r5)
9b2efe03 624: al %r0,0(%r15)
b020632e
MS
63 al %r0,__VDSO_XTIME_NSEC(%r5) /* + xtime */
64 al %r1,__VDSO_XTIME_NSEC+4(%r5)
65 brc 12,5f
66 ahi %r0,1
9b2efe03 675: mvc 0(4,%r15),__VDSO_XTIME_SEC+4(%r5)
b020632e
MS
68 cl %r4,__VDSO_UPD_COUNT+4(%r5) /* check update counter */
69 jne 1b
79c74ecb
MS
70 l %r4,__VDSO_TK_SHIFT(%r5) /* Timekeeper shift */
71 srdl %r0,0(%r4) /* >> tk->shift */
9b2efe03 72 l %r4,0(%r15) /* get tv_sec from stack */
b020632e
MS
73 basr %r5,0
746: ltr %r0,%r0
75 jnz 7f
76 cl %r1,11f-6b(%r5)
77 jl 8f
787: ahi %r4,1
79 sl %r1,11f-6b(%r5)
80 brc 3,6b
81 ahi %r0,-1
82 j 6b
838: 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)
889: srl %r0,6
89 st %r0,4(%r2) /* store tv->tv_usec */
9010: slr %r2,%r2
9b2efe03 91 ahi %r15,16
b020632e
MS
92 br %r14
9311: .long 1000000000
9412: .long 274877907
9513: .long _vdso_data - 0b
96 .cfi_endproc
97 .size __kernel_gettimeofday,.-__kernel_gettimeofday