/* we restore the process signal mask as the sigreturn should
do it (XXX: use sigsetjmp) */
sigprocmask(SIG_SETMASK, old_set, NULL);
- raise_exception_err(EXCP0E_PAGE, env->error_code);
+ raise_exception_err(env->exception_index, env->error_code);
} else {
/* activate soft MMU for this block */
env->hflags |= HF_SOFTMMU_MASK;
}
}
if (retaddr)
- raise_exception_err(EXCP0E_PAGE, env->error_code);
+ raise_exception_err(env->exception_index, env->error_code);
else
- raise_exception_err_norestore(EXCP0E_PAGE, env->error_code);
+ raise_exception_err_norestore(env->exception_index, env->error_code);
}
env = saved_env;
}
env->cr[2] = addr;
env->error_code = (is_write << PG_ERROR_W_BIT);
env->error_code |= PG_ERROR_U_MASK;
+ env->exception_index = EXCP0E_PAGE;
return 1;
}
/* test virtual address sign extension */
sext = (int64_t)addr >> 47;
if (sext != 0 && sext != -1) {
- error_code = 0;
- goto do_fault;
+ env->error_code = 0;
+ env->exception_index = EXCP0D_GPF;
+ return 1;
}
pml4e_addr = ((env->cr[3] & ~0xfff) + (((addr >> 39) & 0x1ff) << 3)) &
(env->cr[4] & CR4_PAE_MASK))
error_code |= PG_ERROR_I_D_MASK;
env->error_code = error_code;
+ env->exception_index = EXCP0E_PAGE;
return 1;
}