e2k: Restore usage of env CRs.
Fixes syscall e2k_longjmp2.
This commit is contained in:
parent
ce88afe251
commit
28aafb053c
|
@ -61,6 +61,11 @@ static void proc_chain_save(CPUE2KState *env, int wd_base, target_ulong ret_ip)
|
||||||
{
|
{
|
||||||
env->pshtp.index += wd_base;
|
env->pshtp.index += wd_base;
|
||||||
|
|
||||||
|
pcs_push(env, env->crs.cr0_lo);
|
||||||
|
pcs_push(env, env->crs.cr0_hi);
|
||||||
|
pcs_push(env, env->crs.cr1.lo);
|
||||||
|
pcs_push(env, env->crs.cr1.hi);
|
||||||
|
|
||||||
env->crs.cr0_lo = env->pregs;
|
env->crs.cr0_lo = env->pregs;
|
||||||
env->crs.cr0_hi = ret_ip;
|
env->crs.cr0_hi = ret_ip;
|
||||||
env->crs.cr1.wbs = wd_base / 2;
|
env->crs.cr1.wbs = wd_base / 2;
|
||||||
|
@ -70,11 +75,6 @@ static void proc_chain_save(CPUE2KState *env, int wd_base, target_ulong ret_ip)
|
||||||
env->crs.cr1.br = e2k_state_br(env);
|
env->crs.cr1.br = e2k_state_br(env);
|
||||||
env->crs.cr1.ussz = env->usd.size >> 4;
|
env->crs.cr1.ussz = env->usd.size >> 4;
|
||||||
|
|
||||||
pcs_push(env, env->crs.cr0_lo);
|
|
||||||
pcs_push(env, env->crs.cr0_hi);
|
|
||||||
pcs_push(env, env->crs.cr1.lo);
|
|
||||||
pcs_push(env, env->crs.cr1.hi);
|
|
||||||
|
|
||||||
env->wd.fx = true;
|
env->wd.fx = true;
|
||||||
env->wd.base = e2k_wrap_reg_index(env->wd.base + wd_base);
|
env->wd.base = e2k_wrap_reg_index(env->wd.base + wd_base);
|
||||||
env->wd.size -= wd_base;
|
env->wd.size -= wd_base;
|
||||||
|
@ -85,11 +85,6 @@ static void proc_chain_restore(CPUE2KState *env)
|
||||||
{
|
{
|
||||||
int wd_base;
|
int wd_base;
|
||||||
|
|
||||||
env->crs.cr1.hi = pcs_pop(env);
|
|
||||||
env->crs.cr1.lo = pcs_pop(env);
|
|
||||||
env->crs.cr0_hi = pcs_pop(env);
|
|
||||||
env->crs.cr0_lo = pcs_pop(env);
|
|
||||||
|
|
||||||
env->pregs = env->crs.cr0_lo;
|
env->pregs = env->crs.cr0_lo;
|
||||||
env->ip = env->crs.cr0_hi;
|
env->ip = env->crs.cr0_hi;
|
||||||
wd_base = env->crs.cr1.wbs * 2;
|
wd_base = env->crs.cr1.wbs * 2;
|
||||||
|
@ -102,6 +97,11 @@ static void proc_chain_restore(CPUE2KState *env)
|
||||||
env->usd.size = env->crs.cr1.ussz << 4;
|
env->usd.size = env->crs.cr1.ussz << 4;
|
||||||
env->usd.base = env->sbr - env->usd.size;
|
env->usd.base = env->sbr - env->usd.size;
|
||||||
|
|
||||||
|
env->crs.cr1.hi = pcs_pop(env);
|
||||||
|
env->crs.cr1.lo = pcs_pop(env);
|
||||||
|
env->crs.cr0_hi = pcs_pop(env);
|
||||||
|
env->crs.cr0_lo = pcs_pop(env);
|
||||||
|
|
||||||
env->pshtp.index -= wd_base;
|
env->pshtp.index -= wd_base;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -209,7 +209,7 @@ uint64_t HELPER(prep_return)(CPUE2KState *env, int ipd)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret.base = cpu_ldq_le_data(env, env->pcsp.base + env->pcsp.index - 0x18);
|
ret.base = env->crs.cr0_hi;
|
||||||
ret.tag = CTPR_TAG_RETURN;
|
ret.tag = CTPR_TAG_RETURN;
|
||||||
ret.ipd = ipd;
|
ret.ipd = ipd;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue