localedata: dz_BT, bo_CN: convert to UTF-8
[glibc.git] / sysdeps / unix / sysv / linux / ia64 / setcontext.S
blobb5fc9327879b54f141c6a07425eb082b5927ab7d
1 /* Copyright (C) 2001-2024 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
4    The GNU C Library is free software; you can redistribute it and/or
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.
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
12    Lesser General Public License for more details.
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <https://www.gnu.org/licenses/>.  */
18 #include <sysdep.h>
19 #include <features.h>
21 #include "ucontext_i.h"
23 /*  __setcontext (const ucontext_t *ucp)
25   Restores the machine context in UCP and thereby resumes execution
26   in that context.
28   This implementation in intended to be used for *synchronous* context
29   switches only.  Therefore, it does not have to restore anything
30   other than the PRESERVED state.  */
32 ENTRY(__setcontext)
33         .prologue
34         .body
35         alloc r11 = ar.pfs, 1, 0, 4, 0
37         // sigprocmask (SIG_SETMASK, &sc->sc_mask, NULL):
39         mov r3 = SC_MASK
40         mov out0 = SIG_SETMASK
41         ;;
42         add out1 = r3, in0
43         mov out2 = 0
44         mov out3 = 8    // sizeof kernel sigset_t
46         invala
47         DO_CALL(__NR_rt_sigprocmask)
48         add r2 = SC_NAT, r32
50         add r3 = SC_RNAT, r32                   // r3 <- &sc_ar_rnat
51         add rPOS = SC_GR, r32                   // rPOS <- &sc_gr[0]
52         ;;
53         ld8 rNAT = [r2], (SC_BSP-SC_NAT)
54         extr.u rPOS = rPOS, 3, 6                // get NaT bit number for r0
55         ;;
56         ld8 rBSP = [r2], (SC_UNAT-SC_BSP)
57         ld8 rRNAT = [r3], (SC_FPSR-SC_RNAT)
58         /*
59          * Rotate NaT bits by rPOS positions to the left:
60          */
61         sub rCPOS = 64, rPOS
62         ;;
63         ld8 rUNAT = [r2], (SC_PFS-SC_UNAT)
64         ld8 rFPSR = [r3], (SC_LC-SC_FPSR)
65         shl rTMP = rNAT, rPOS
66         ;;
67         ld8 rPFS = [r2], (SC_PR-SC_PFS)
68         ld8 rLC = [r3], (SC_BR+0*8-SC_LC)
69         shr.u rNAT = rNAT, rCPOS
70         ;;
71         ld8 rPR = [r2], (SC_BR+1*8-SC_PR)
72         ld8 rB0 = [r3], 16
73         or rNAT = rNAT, rTMP
74         ;;
75         ld8 rB1 = [r2], 16
76         ld8 rB2 = [r3], 16
77         ;;
78         mov.m ar.unat = rNAT
79         mov.m rRSC = ar.rsc
80         ;;
81         ld8 rB3 = [r2], 16
82         ld8 rB4 = [r3], (SC_GR+1*8-(SC_BR+4*8))
83         ;;
84         ld8 rB5 = [r2], (SC_GR+4*8-(SC_BR+5*8))
85         ld8.fill r1 = [r3], (5*8 - 1*8)
86         ;;
87         ld8.fill r4 = [r2], 16
88         ld8.fill r5 = [r3], 16
89         mov b0 = rB0
90         ;;
91         ld8.fill r6 = [r2], 48
92         ld8.fill r7 = [r3], (SC_FR+2*16-(SC_GR+7*8))
93         ;;
94         ld8.fill sp = [r2], (SC_FR+3*16-(SC_GR+12*8))
95         mov.m ar.fpsr = rFPSR
96         mov.i ar.pfs = rPFS
97         ;;
98         ldf.fill f3 = [r2], 16
99         ldf.fill f2 = [r3], 48
100         mov b1 = rB1
101         ;;
102         ldf.fill f4 = [r2], (16*16-4*16)
103         ldf.fill f5 = [r3], (17*16-5*16)
104         mov b2 = rB2
105         ;;
106         ldf.fill f16 = [r2], 32
107         ldf.fill f17 = [r3], 32
108         mov b3 = rB3
109         ;;
110         ldf.fill f18 = [r2], 32
111         ldf.fill f19 = [r3], 32
112         mov b4 = rB4
113         ;;
114         ldf.fill f20 = [r2], 32
115         ldf.fill f21 = [r3], 32
116         mov b5 = rB5
117         ;;
118         ldf.fill f22 = [r2], 32
119         ldf.fill f23 = [r3], 32
120         mov r8 = 0
121         ;;
122         ldf.fill f24 = [r2], 32
123         ldf.fill f25 = [r3], 32
124         mov r9 = 0
125         ;;
126         ldf.fill f26 = [r2], 32
127         ldf.fill f27 = [r3], 32
128         dep rTMP = 0, rRSC, 16, 14      // clear ar.rsc.loadrs
129         ;;
130         ldf.fill f28 = [r2], 32
131         ldf.fill f29 = [r3], 32
132         and rTMP = ~0x3, rTMP           // clear ar.rsc.mode
133         ;;
134         ldf.fill f30 = [r2], 32
135         ldf.fill f31 = [r3], 32
136         mov pr = rPR, -1
137         ;;
138         mov.m ar.rsc = rTMP             // put RSE into enforced lazy mode
139         ;;
140         loadrs                          // drop dirty partition
141         ;;
142         mov.m ar.bspstore = rBSP
143         mov.m ar.unat = rUNAT
144         mov.i ar.lc = rLC
145         ;;
146         mov.m ar.rnat = rRNAT
147         mov.m ar.rsc = rRSC
148         ret
149 END(__setcontext)
151 weak_alias (__setcontext, setcontext)