On 16 June 2015 at 06:46, Peter Crosthwaite <crosthwaitepe...@gmail.com> wrote: > Add a wrapper around the CPUClass::set_pc hook. Accepts an error > pointer to report the case where the hook is not set. > > Signed-off-by: Peter Crosthwaite <crosthwaite.pe...@gmail.com> > --- > include/qom/cpu.h | 21 +++++++++++++++++++++ > 1 file changed, 21 insertions(+) > > diff --git a/include/qom/cpu.h b/include/qom/cpu.h > index 7db310e..97d4edf 100644 > --- a/include/qom/cpu.h > +++ b/include/qom/cpu.h > @@ -600,6 +600,27 @@ static inline void cpu_unaligned_access(CPUState *cpu, > vaddr addr, > #endif > > /** > + * cpu_set_pc: > + * @cpu: The CPU to set the program counter for. > + * @addr: Program counter value. > + * @errp: Error pointer to populate in case of error. > + * > + * Set the program counter for a CPU. If there is no available implementation > + * an error is raised. > + */ > + > +static inline void cpu_set_pc(CPUState *cpu, vaddr addr, Error **errp) > +{ > + CPUClass *cc = CPU_GET_CLASS(cpu); > + > + if (cc->set_pc) { > + cc->set_pc(cpu, addr); > + } else { > + error_setg(errp, "CPU does not implement set PC"); > + } > +}
I don't think there are any CPUClass implementations which don't implement set_pc. The code in cpu-exec.c which does this: if (cc->synchronize_from_tb) { cc->synchronize_from_tb(cpu, tb); } else { assert(cc->set_pc); cc->set_pc(cpu, tb->pc); } demonstrates that we only need to check the CPUs which implement synchronize_from_tb (i386, mips, sh4, sparc, tricore) to check they have a set_pc method too, and they all do. (You can also just grep for 'cc->set_pc' in target-*/ and confirm they all have one, as a crosscheck.) So I think this can simplify down to just calling the class method unconditionally. thanks -- PMM