On 9/3/25 06:25, Nicholas Piggin wrote:
static void restore_sigcontext(CPURISCVState *env, struct target_sigcontext
*sc)
{
+ struct target_ctx_hdr *hdr;
int i;
- __get_user(env->pc, &sc->pc);
+ __get_user(env->pc, &sc->sc_regs.pc);
for (i = 1; i < 32; ++i) {
- __get_user(env->gpr[i], &sc->gpr[i - 1]);
+ __get_user(env->gpr[i], &sc->sc_regs.gpr[i - 1]);
}
for (i = 0; i < 32; ++i) {
- __get_user(env->fpr[i], &sc->fpr[i]);
+ __get_user(env->fpr[i], &sc->sc_fpregs.fpr[i]);
}
uint32_t fcsr;
- __get_user(fcsr, &sc->fcsr);
+ __get_user(fcsr, &sc->sc_fpregs.fcsr);
riscv_csr_write(env, CSR_FCSR, fcsr);
+
+ hdr = &sc->sc_extdesc.hdr;
+ uint32_t rsv;
+ __get_user(rsv, &sc->sc_extdesc.reserved);
+ if (rsv != 0) {
+ qemu_log_mask(LOG_GUEST_ERROR, "signal: sigcontext reserved field is "
+ "non-zero. Attempting restore anyway.");
+ }
The kernel returns -EINVAL from restore_sigcontext, which causes rt_sigreturn to
force_sig(SIGSEGV). We don't need -ERRNO here, but returning bool success would be proper.
r~