if (ret)
                return ret;
 
-       if (save_ret)
-               emit_sd(RV_REG_FP, -retval_off, regmap[BPF_REG_0], ctx);
+       if (save_ret) {
+               emit_sd(RV_REG_FP, -retval_off, RV_REG_A0, ctx);
+               emit_sd(RV_REG_FP, -(retval_off - 8), regmap[BPF_REG_0], ctx);
+       }
 
        /* update branch with beqz */
        if (ctx->insns) {
 
        save_ret = flags & (BPF_TRAMP_F_CALL_ORIG | BPF_TRAMP_F_RET_FENTRY_RET);
        if (save_ret) {
-               stack_size += 8;
+               stack_size += 16; /* Save both A5 (BPF R0) and A0 */
                retval_off = stack_size;
        }
 
                if (ret)
                        goto out;
                emit_sd(RV_REG_FP, -retval_off, RV_REG_A0, ctx);
+               emit_sd(RV_REG_FP, -(retval_off - 8), regmap[BPF_REG_0], ctx);
                im->ip_after_call = ctx->insns + ctx->ninsns;
                /* 2 nops reserved for auipc+jalr pair */
                emit(rv_nop(), ctx);
        if (flags & BPF_TRAMP_F_RESTORE_REGS)
                restore_args(nregs, args_off, ctx);
 
-       if (save_ret)
+       if (save_ret) {
                emit_ld(RV_REG_A0, -retval_off, RV_REG_FP, ctx);
+               emit_ld(regmap[BPF_REG_0], -(retval_off - 8), RV_REG_FP, ctx);
+       }
 
        emit_ld(RV_REG_S1, -sreg_off, RV_REG_FP, ctx);