]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/unix/sysv/linux/s390/s390-64/getcontext.S
Update copyright dates with scripts/update-copyrights
[thirdparty/glibc.git] / sysdeps / unix / sysv / linux / s390 / s390-64 / getcontext.S
CommitLineData
dff8da6b 1/* Copyright (C) 2001-2024 Free Software Foundation, Inc.
816fc1ed 2 This file is part of the GNU C Library.
816fc1ed
UD
3
4 The GNU C Library is free software; you can redistribute it and/or
41bdb6e2
AJ
5 modify it under the terms of the GNU Lesser General Public
6 License as published by the Free Software Foundation; either
7 version 2.1 of the License, or (at your option) any later version.
816fc1ed
UD
8
9 The GNU C Library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
41bdb6e2 12 Lesser General Public License for more details.
816fc1ed 13
41bdb6e2 14 You should have received a copy of the GNU Lesser General Public
59ba27a6 15 License along with the GNU C Library; if not, see
5a82c748 16 <https://www.gnu.org/licenses/>. */
816fc1ed
UD
17
18#include <sysdep.h>
19#include <features.h>
20
21#include "ucontext_i.h"
22
2f438e20
SL
23#include <shlib-compat.h>
24
816fc1ed
UD
25/* __getcontext (const ucontext_t *ucp)
26
27 Saves the machine context in UCP such that when it is activated,
58f46c79 28 it appears as if __getcontext() returned again.
816fc1ed
UD
29
30 This implementation is intended to be used for *synchronous* context
31 switches only. Therefore, it does not have to save anything
32 other than the PRESERVED state. */
33
34ENTRY(__getcontext)
e57d8fc9 35 lgr %r0,%r2
816fc1ed 36
05d138ef 37 /* rt_sigprocmask (SIG_BLOCK, NULL, &sc->sc_mask, sigsetsize). */
e57d8fc9 38 la %r4,SC_MASK(%r2)
816fc1ed 39 la %r2,SIG_BLOCK
cec75f99 40 slgr %r3,%r3
c3e94a95 41 lghi %r5,_NSIG8
e57d8fc9
SL
42 lghi %r1,SYS_ify(rt_sigprocmask)
43 svc 0
816fc1ed
UD
44
45 /* Store fpu context. */
e57d8fc9 46 lgr %r1,%r0
c3e94a95
AK
47 stfpc SC_FPC(%r1)
48 std %f0,SC_FPRS(%r1)
49 std %f1,SC_FPRS+8(%r1)
50 std %f2,SC_FPRS+16(%r1)
51 std %f3,SC_FPRS+24(%r1)
52 std %f4,SC_FPRS+32(%r1)
53 std %f5,SC_FPRS+40(%r1)
54 std %f6,SC_FPRS+48(%r1)
55 std %f7,SC_FPRS+56(%r1)
56 std %f8,SC_FPRS+64(%r1)
57 std %f9,SC_FPRS+72(%r1)
58 std %f10,SC_FPRS+80(%r1)
59 std %f11,SC_FPRS+88(%r1)
60 std %f12,SC_FPRS+96(%r1)
61 std %f13,SC_FPRS+104(%r1)
62 std %f14,SC_FPRS+112(%r1)
63 std %f15,SC_FPRS+120(%r1)
816fc1ed 64
58f46c79 65 /* Set __getcontext return value to 0. */
cec75f99 66 slgr %r2,%r2
58f46c79 67
8e294940 68 /* Store access registers. */
c3e94a95 69 stam %a0,%a15,SC_ACRS(%r1)
8e294940 70
816fc1ed 71 /* Store general purpose registers. */
c3e94a95 72 stmg %r0,%r15,SC_GPRS(%r1)
816fc1ed 73
664f565f
SL
74 /* Store psw mask to 0x0 and addr to return address. Then the address
75 can be retrieved from the ucontext structure in the same way as if it
76 is created by kernel and passed to a signal-handler. */
77 stg %r2,SC_PSW+0(%r1)
78 stg %r14,SC_PSW+8(%r1)
79
58f46c79 80 /* Return. */
816fc1ed
UD
81 br %r14
82END(__getcontext)
83
2f438e20
SL
84#if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_19, GLIBC_2_20)
85/* In glibc release 2.19 a new version of getcontext was introduced,
86 but was reverted before 2.20. Thus both versions are the same function. */
87weak_alias (__getcontext, __v1__getcontext)
88weak_alias (__getcontext, __v2__getcontext)
89versioned_symbol (libc, __v1__getcontext, getcontext, GLIBC_2_1)
90compat_symbol (libc, __v2__getcontext, getcontext, GLIBC_2_19)
37d13b17
SL
91
92#else
93
94weak_alias (__getcontext, getcontext)
95
96#endif /* !(defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_19, GLIBC_2_20)) */