On 10/01/2016 05:05 AM, Artyom Tarasenko wrote:
+ case ASI_SCRATCHPAD: /* UA2005 privileged scratchpad */
+ if (unlikely((addr >= 0x20) && (addr < 0x30))) {
+ /* Hyperprivileged access only */
+ cpu_unassigned_access(cs, addr, false, false, 1, size);
+ }
+ /* fall through */
+ case ASI_HYP_SCRATCHPAD: /* UA2005 hyperprivileged scratchpad */
+ {
+ unsigned int i = (addr >> 3) & 0x7;
+ ret = env->scratch[i];
+ break;
+ }
It *might* speed things up a teeny bit to implement ASI_HYP_SCRATCHPAD inline.
E.g.
case GET_ASI_HYP_SCRATCH:
{
TCGv_ptr tmp = tcg_temp_new_ptr();
#if UINTPTR_MAX == UINT32_MAX
tcg_gen_extrl_i64_i32(tmp, addr);
tcg_gen_andi_i32(tmp, tmp, 7 << 3);
#else
tcg_gen_andi_i64(tmp, addr, 7 << 3);
#endif
tcg_gen_add_ptr(tmp, tmp, cpu_env);
tcg_gen_ld_i64(dst, tmp, offsetof(CPUSPARCState, scratch));
tcg_temp_free_ptr(tmp);
}
break;
Of course, you can't do that for ASI_SCRATCHPAD because of the dynamic check
against ADDR.
@@ -2056,6 +2068,9 @@ void helper_st_asi(CPUSPARCState *env, target_ulong addr,
target_ulong val,
return;
case ASI_INTR_RECEIVE: /* Interrupt data receive */
env->ivec_status = val & 0x20;
+ if (!env->ivec_status) {
+ cpu_reset_interrupt(cs, CPU_INTERRUPT_HARD);
+ }
return;
This belongs in some other patch.
r~