> > +static void gen_wsr_litbase(DisasContext *dc, uint32_t sr, TCGv_i32 s) > > +{ > > + tcg_gen_mov_i32(cpu_SR[sr], s); > > + /* This can change tb->flags, so exit tb */ > > + gen_jumpi_check_loop_end(dc, -1); > > +} > > Surely you have to flush all TB's when changing litbase? > > > + ((dc->tb->flags & XTENSA_TBFLAG_LITBASE) ? > > + dc->litbase : > > + ((dc->pc + 3) & ~3)) + > > + (0xfffc0000 | (RI16_IMM16 << 2))); > > Unless you actually read from env->sr[LITBASE] here, instead > of building the value into the TB.
You're right, I have to flush all TBs at gen_wsr_litbase for this code to always work correctly. As far as I can see LITBASE usage pattern is that it is set up once in early initialization and is never changed after. Thanks. -- Max