1/* Save current context. 2 Copyright (C) 2004-2022 Free Software Foundation, Inc. 3 This file is part of the GNU C Library. 4 5 The GNU C Library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 The GNU C Library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with the GNU C Library. If not, see 17 <https://www.gnu.org/licenses/>. */ 18 19#include <sysdep.h> 20#include <ucontext-offsets.h> 21 22/* ??? Should be a better place for this that's asm friendly. */ 23#define SIG_BLOCK 1 24 25 26ENTRY (__getcontext) 27#ifdef PROF 28 ldgp gp, 0(pv) 29 .set noat 30 lda AT, _mcount 31 jsr AT, (AT), _mcount 32 .set at 33 .prologue 1 34#else 35 .prologue 0 36#endif 37 38 bsr $0, __getcontext_x 39 mov $31, $0 40 ret 41 42END(__getcontext) 43weak_alias (__getcontext, getcontext) 44 45 46/* An internal routine used by getcontext and setcontext. 47 The incomming return address register is $0. */ 48 49 .align 4 50 .globl __getcontext_x 51 .hidden __getcontext_x 52 .usepv __getcontext_x, no 53 54 cfi_startproc 55 cfi_return_column (64) 56__getcontext_x: 57 cfi_register (64, 0) 58 59 .set noat 60 61 /* Return value of getcontext. $0 is the only register 62 whose value is not preserved. */ 63 stq $31, UC_SIGCTX+SC_REGS($16) 64 65 /* Store all registers into the context. */ 66 stq $1, UC_SIGCTX+SC_REGS+1*8($16) 67 stq $2, UC_SIGCTX+SC_REGS+2*8($16) 68 stq $3, UC_SIGCTX+SC_REGS+3*8($16) 69 stq $4, UC_SIGCTX+SC_REGS+4*8($16) 70 stq $5, UC_SIGCTX+SC_REGS+5*8($16) 71 stq $6, UC_SIGCTX+SC_REGS+6*8($16) 72 stq $7, UC_SIGCTX+SC_REGS+7*8($16) 73 stq $8, UC_SIGCTX+SC_REGS+8*8($16) 74 stq $9, UC_SIGCTX+SC_REGS+9*8($16) 75 stq $10, UC_SIGCTX+SC_REGS+10*8($16) 76 stq $11, UC_SIGCTX+SC_REGS+11*8($16) 77 stq $12, UC_SIGCTX+SC_REGS+12*8($16) 78 stq $13, UC_SIGCTX+SC_REGS+13*8($16) 79 stq $14, UC_SIGCTX+SC_REGS+14*8($16) 80 stq $15, UC_SIGCTX+SC_REGS+15*8($16) 81 stq $16, UC_SIGCTX+SC_REGS+16*8($16) 82 stq $17, UC_SIGCTX+SC_REGS+17*8($16) 83 stq $18, UC_SIGCTX+SC_REGS+18*8($16) 84 stq $19, UC_SIGCTX+SC_REGS+19*8($16) 85 stq $20, UC_SIGCTX+SC_REGS+20*8($16) 86 stq $21, UC_SIGCTX+SC_REGS+21*8($16) 87 stq $22, UC_SIGCTX+SC_REGS+22*8($16) 88 stq $23, UC_SIGCTX+SC_REGS+23*8($16) 89 stq $24, UC_SIGCTX+SC_REGS+24*8($16) 90 stq $25, UC_SIGCTX+SC_REGS+25*8($16) 91 stq $26, UC_SIGCTX+SC_REGS+26*8($16) 92 stq $27, UC_SIGCTX+SC_REGS+27*8($16) 93 stq $28, UC_SIGCTX+SC_REGS+28*8($16) 94 stq $29, UC_SIGCTX+SC_REGS+29*8($16) 95 stq $30, UC_SIGCTX+SC_REGS+30*8($16) 96 stq $31, UC_SIGCTX+SC_REGS+31*8($16) 97 98 stt $f0, UC_SIGCTX+SC_FPREGS+0*8($16) 99 stt $f1, UC_SIGCTX+SC_FPREGS+1*8($16) 100 stt $f2, UC_SIGCTX+SC_FPREGS+2*8($16) 101 stt $f3, UC_SIGCTX+SC_FPREGS+3*8($16) 102 stt $f4, UC_SIGCTX+SC_FPREGS+4*8($16) 103 stt $f5, UC_SIGCTX+SC_FPREGS+5*8($16) 104 stt $f6, UC_SIGCTX+SC_FPREGS+6*8($16) 105 stt $f7, UC_SIGCTX+SC_FPREGS+7*8($16) 106 stt $f8, UC_SIGCTX+SC_FPREGS+8*8($16) 107 stt $f9, UC_SIGCTX+SC_FPREGS+9*8($16) 108 stt $f10, UC_SIGCTX+SC_FPREGS+10*8($16) 109 stt $f11, UC_SIGCTX+SC_FPREGS+11*8($16) 110 stt $f12, UC_SIGCTX+SC_FPREGS+12*8($16) 111 stt $f13, UC_SIGCTX+SC_FPREGS+13*8($16) 112 stt $f14, UC_SIGCTX+SC_FPREGS+14*8($16) 113 stt $f15, UC_SIGCTX+SC_FPREGS+15*8($16) 114 stt $f16, UC_SIGCTX+SC_FPREGS+16*8($16) 115 stt $f17, UC_SIGCTX+SC_FPREGS+17*8($16) 116 stt $f18, UC_SIGCTX+SC_FPREGS+18*8($16) 117 stt $f19, UC_SIGCTX+SC_FPREGS+19*8($16) 118 stt $f20, UC_SIGCTX+SC_FPREGS+20*8($16) 119 stt $f21, UC_SIGCTX+SC_FPREGS+21*8($16) 120 stt $f22, UC_SIGCTX+SC_FPREGS+22*8($16) 121 stt $f23, UC_SIGCTX+SC_FPREGS+23*8($16) 122 stt $f24, UC_SIGCTX+SC_FPREGS+24*8($16) 123 stt $f25, UC_SIGCTX+SC_FPREGS+25*8($16) 124 stt $f26, UC_SIGCTX+SC_FPREGS+26*8($16) 125 stt $f27, UC_SIGCTX+SC_FPREGS+27*8($16) 126 stt $f28, UC_SIGCTX+SC_FPREGS+28*8($16) 127 stt $f29, UC_SIGCTX+SC_FPREGS+29*8($16) 128 stt $f30, UC_SIGCTX+SC_FPREGS+30*8($16) 129 stt $f31, UC_SIGCTX+SC_FPREGS+31*8($16) 130 131 mf_fpcr $f0 132 lda $1, 8 133 stt $f0, UC_SIGCTX+SC_FPCR($16) 134 135 /* The return address of getcontext is the restart pc. */ 136 stq $26, UC_SIGCTX+SC_PC($16) 137 138 /* Userlevel always has a processor status word of 8. */ 139 stq $1, UC_SIGCTX+SC_PS($16) 140 141 /* Save registers around the syscall. We preserve $17 142 for the benefit of swapcontext. */ 143 subq $30, 4*8, $30 144 cfi_adjust_cfa_offset(4*8) 145 stq $0, 0($30) 146 cfi_rel_offset(64, 0) 147 stq $16, 8($30) 148 stq $17, 16($30) 149 150 /* Save the current signal mask. Whee, there are three 151 copies of this in the alpha ucontext_t. */ 152 lda $16, SIG_BLOCK 153 lda $17, 0 154 lda $0, __NR_osf_sigprocmask 155 callsys 156 157 ldq $16, 8($30) 158 ldq $17, 16($30) 159 160 stq $0, UC_OSF_SIGMASK($16) 161 stq $0, UC_SIGCTX+SC_MASK($16) 162 stq $0, UC_SIGMASK($16) 163 stq $31, UC_SIGMASK + 1*8($16) 164 stq $31, UC_SIGMASK + 2*8($16) 165 stq $31, UC_SIGMASK + 3*8($16) 166 stq $31, UC_SIGMASK + 4*8($16) 167 stq $31, UC_SIGMASK + 5*8($16) 168 stq $31, UC_SIGMASK + 6*8($16) 169 stq $31, UC_SIGMASK + 7*8($16) 170 stq $31, UC_SIGMASK + 8*8($16) 171 stq $31, UC_SIGMASK + 9*8($16) 172 stq $31, UC_SIGMASK +10*8($16) 173 stq $31, UC_SIGMASK +11*8($16) 174 stq $31, UC_SIGMASK +12*8($16) 175 stq $31, UC_SIGMASK +13*8($16) 176 stq $31, UC_SIGMASK +14*8($16) 177 stq $31, UC_SIGMASK +15*8($16) 178 179 ldq $0, 0($30) 180 addq $30, 4*8, $30 181 cfi_register (64, 0) 182 cfi_adjust_cfa_offset(-4*8) 183 ret $31, ($0), 1 184 185 cfi_endproc 186 .size __getcontext_x, .-__getcontext_x 187 .type __getcontext_x, @function 188