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~

Reply via email to