Lines Matching +full:default +full:- +full:blocked

1 /* SPDX-License-Identifier: GPL-2.0-or-later */
10 #include "user-internals.h"
11 #include "signal-common.h"
12 #include "linux-user/trace.h"
15 #include "vdso-asmoffset.h"
74 uint8_t __unused[1024 / 8 - sizeof(target_sigset_t)];
114 sp -= sizeof(struct target_sctx_info) + size; in extframe_alloc()
117 sctx->gaddr = sp; in extframe_alloc()
119 size = orig_sp - sp; in extframe_alloc()
120 sctx->size = size; in extframe_alloc()
121 extctx->size += size; in extframe_alloc()
132 sp = extframe_alloc(extctx, &extctx->end, 0, CONTEXT_INFO_ALIGN, sp); in setup_extcontext()
135 extctx->flags = SC_USED_FP; in setup_extcontext()
137 if (FIELD_EX64(env->CSR_EUEN, CSR_EUEN, ASXE)) { in setup_extcontext()
138 sp = extframe_alloc(extctx, &extctx->lasx, in setup_extcontext()
140 } else if (FIELD_EX64(env->CSR_EUEN, CSR_EUEN, SXE)) { in setup_extcontext()
141 sp = extframe_alloc(extctx, &extctx->lsx, in setup_extcontext()
144 sp = extframe_alloc(extctx, &extctx->fpu, in setup_extcontext()
158 __put_user(extctx->flags, &sc->sc_flags); in setup_sigframe()
159 __put_user(env->pc, &sc->sc_pc); in setup_sigframe()
160 __put_user(0, &sc->sc_regs[0]); in setup_sigframe()
162 __put_user(env->gpr[i], &sc->sc_regs[i]); in setup_sigframe()
169 if (FIELD_EX64(env->CSR_EUEN, CSR_EUEN, ASXE)) { in setup_sigframe()
171 info = extctx->lasx.haddr; in setup_sigframe()
173 __put_user(LASX_CTX_MAGIC, &info->magic); in setup_sigframe()
174 __put_user(extctx->lasx.size, &info->size); in setup_sigframe()
179 __put_user(env->fpr[i].vreg.UD(0), &lasx_ctx->regs[4 * i]); in setup_sigframe()
180 __put_user(env->fpr[i].vreg.UD(1), &lasx_ctx->regs[4 * i + 1]); in setup_sigframe()
181 __put_user(env->fpr[i].vreg.UD(2), &lasx_ctx->regs[4 * i + 2]); in setup_sigframe()
182 __put_user(env->fpr[i].vreg.UD(3), &lasx_ctx->regs[4 * i + 3]); in setup_sigframe()
184 __put_user(read_fcc(env), &lasx_ctx->fcc); in setup_sigframe()
185 __put_user(env->fcsr0, &lasx_ctx->fcsr); in setup_sigframe()
186 } else if (FIELD_EX64(env->CSR_EUEN, CSR_EUEN, SXE)) { in setup_sigframe()
188 info = extctx->lsx.haddr; in setup_sigframe()
190 __put_user(LSX_CTX_MAGIC, &info->magic); in setup_sigframe()
191 __put_user(extctx->lsx.size, &info->size); in setup_sigframe()
196 __put_user(env->fpr[i].vreg.UD(0), &lsx_ctx->regs[2 * i]); in setup_sigframe()
197 __put_user(env->fpr[i].vreg.UD(1), &lsx_ctx->regs[2 * i + 1]); in setup_sigframe()
199 __put_user(read_fcc(env), &lsx_ctx->fcc); in setup_sigframe()
200 __put_user(env->fcsr0, &lsx_ctx->fcsr); in setup_sigframe()
203 info = extctx->fpu.haddr; in setup_sigframe()
205 __put_user(FPU_CTX_MAGIC, &info->magic); in setup_sigframe()
206 __put_user(extctx->fpu.size, &info->size); in setup_sigframe()
211 __put_user(env->fpr[i].vreg.UD(0), &fpu_ctx->regs[i]); in setup_sigframe()
213 __put_user(read_fcc(env), &fpu_ctx->fcc); in setup_sigframe()
214 __put_user(env->fcsr0, &fpu_ctx->fcsr); in setup_sigframe()
220 info = extctx->end.haddr; in setup_sigframe()
221 __put_user(0, &info->magic); in setup_sigframe()
222 __put_user(0, &info->size); in setup_sigframe()
238 extctx->end.gaddr = frame; in parse_extcontext()
239 extctx->end.size = size; in parse_extcontext()
240 extctx->size += size; in parse_extcontext()
248 extctx->fpu.gaddr = frame; in parse_extcontext()
249 extctx->fpu.size = size; in parse_extcontext()
250 extctx->size += size; in parse_extcontext()
257 extctx->lsx.gaddr = frame; in parse_extcontext()
258 extctx->lsx.size = size; in parse_extcontext()
259 extctx->size += size; in parse_extcontext()
266 extctx->lasx.gaddr = frame; in parse_extcontext()
267 extctx->lasx.size = size; in parse_extcontext()
268 extctx->size += size; in parse_extcontext()
270 default: in parse_extcontext()
285 __get_user(env->pc, &sc->sc_pc); in restore_sigframe()
287 __get_user(env->gpr[i], &sc->sc_regs[i]); in restore_sigframe()
290 if (extctx->lasx.haddr) { in restore_sigframe()
292 extctx->lasx.haddr + sizeof(struct target_sctx_info); in restore_sigframe()
295 __get_user(env->fpr[i].vreg.UD(0), &lasx_ctx->regs[4 * i]); in restore_sigframe()
296 __get_user(env->fpr[i].vreg.UD(1), &lasx_ctx->regs[4 * i + 1]); in restore_sigframe()
297 __get_user(env->fpr[i].vreg.UD(2), &lasx_ctx->regs[4 * i + 2]); in restore_sigframe()
298 __get_user(env->fpr[i].vreg.UD(3), &lasx_ctx->regs[4 * i + 3]); in restore_sigframe()
300 __get_user(fcc, &lasx_ctx->fcc); in restore_sigframe()
302 __get_user(env->fcsr0, &lasx_ctx->fcsr); in restore_sigframe()
304 } else if (extctx->lsx.haddr) { in restore_sigframe()
306 extctx->lsx.haddr + sizeof(struct target_sctx_info); in restore_sigframe()
309 __get_user(env->fpr[i].vreg.UD(0), &lsx_ctx->regs[2 * i]); in restore_sigframe()
310 __get_user(env->fpr[i].vreg.UD(1), &lsx_ctx->regs[2 * i + 1]); in restore_sigframe()
312 __get_user(fcc, &lsx_ctx->fcc); in restore_sigframe()
314 __get_user(env->fcsr0, &lsx_ctx->fcsr); in restore_sigframe()
316 } else if (extctx->fpu.haddr) { in restore_sigframe()
318 extctx->fpu.haddr + sizeof(struct target_sctx_info); in restore_sigframe()
321 __get_user(env->fpr[i].vreg.UD(0), &fpu_ctx->regs[i]); in restore_sigframe()
323 __get_user(fcc, &fpu_ctx->fcc); in restore_sigframe()
325 __get_user(env->fcsr0, &fpu_ctx->fcsr); in restore_sigframe()
342 sp -= sizeof(struct target_rt_sigframe); in get_sigframe()
368 if (FIELD_EX64(env->CSR_EUEN, CSR_EUEN, ASXE)) { in setup_rt_frame()
369 extctx.lasx.haddr = (void *)frame + (extctx.lasx.gaddr - frame_addr); in setup_rt_frame()
370 extctx.end.haddr = (void *)frame + (extctx.end.gaddr - frame_addr); in setup_rt_frame()
371 } else if (FIELD_EX64(env->CSR_EUEN, CSR_EUEN, SXE)) { in setup_rt_frame()
372 extctx.lsx.haddr = (void *)frame + (extctx.lsx.gaddr - frame_addr); in setup_rt_frame()
373 extctx.end.haddr = (void *)frame + (extctx.end.gaddr - frame_addr); in setup_rt_frame()
375 extctx.fpu.haddr = (void *)frame + (extctx.fpu.gaddr - frame_addr); in setup_rt_frame()
376 extctx.end.haddr = (void *)frame + (extctx.end.gaddr - frame_addr); in setup_rt_frame()
379 frame->rs_info = *info; in setup_rt_frame()
381 __put_user(0, &frame->rs_uc.tuc_flags); in setup_rt_frame()
382 __put_user(0, &frame->rs_uc.tuc_link); in setup_rt_frame()
383 target_save_altstack(&frame->rs_uc.tuc_stack, env); in setup_rt_frame()
385 setup_sigframe(env, &frame->rs_uc.tuc_mcontext, &extctx); in setup_rt_frame()
388 __put_user(set->sig[i], &frame->rs_uc.tuc_sigmask.sig[i]); in setup_rt_frame()
391 env->gpr[4] = sig; in setup_rt_frame()
392 env->gpr[5] = frame_addr + offsetof(struct target_rt_sigframe, rs_info); in setup_rt_frame()
393 env->gpr[6] = frame_addr + offsetof(struct target_rt_sigframe, rs_uc); in setup_rt_frame()
394 env->gpr[3] = frame_addr; in setup_rt_frame()
395 env->gpr[1] = default_rt_sigreturn; in setup_rt_frame()
397 env->pc = ka->_sa_handler; in setup_rt_frame()
406 sigset_t blocked; in do_rt_sigreturn() local
408 frame_addr = env->gpr[3]; in do_rt_sigreturn()
422 extctx.lasx.haddr = (void *)frame + (extctx.lasx.gaddr - frame_addr); in do_rt_sigreturn()
424 extctx.lsx.haddr = (void *)frame + (extctx.lsx.gaddr - frame_addr); in do_rt_sigreturn()
426 extctx.fpu.haddr = (void *)frame + (extctx.fpu.gaddr - frame_addr); in do_rt_sigreturn()
429 target_to_host_sigset(&blocked, &frame->rs_uc.tuc_sigmask); in do_rt_sigreturn()
430 set_sigmask(&blocked); in do_rt_sigreturn()
432 restore_sigframe(env, &frame->rs_uc.tuc_mcontext, &extctx); in do_rt_sigreturn()
434 target_restore_altstack(&frame->rs_uc.tuc_stack, env); in do_rt_sigreturn()
437 return -QEMU_ESIGRETURN; in do_rt_sigreturn()
441 return -QEMU_ESIGRETURN; in do_rt_sigreturn()