On Fri, Apr 23, 2021 at 10:28:14AM -0300, Fabiano Rosas wrote: > David Gibson writes: > > > On Thu, Apr 22, 2021 at 04:35:34PM -0300, Fabiano Rosas wrote: > >> Bruno Piazera Larsen writes: > >> > >> >> > You are correct! I've just tweaked the code that defines spr_register and > >> >> > it should be working now. I'm still working in splitting the SPR functions > >> >> > from translate_init, since I think it would make it easier to prepare the > >> >> > !TCG case and for adding new architectures in the future, and I found a > >> >> > few more problems: > >> >> > >> >> Actually looking at the stuff below, I suspect that separating our > >> >> "spr" logic specifically might be a bad idea. At least some of the > >> >> SPRs control pretty fundamental things about how the processor > >> >> operates, and I suspect separating it from the main translation logic > >> >> may be more trouble than it's worth. > >> > >> I disagree with the code proximity argument. Having TCG code clearly > >> separate from common code seems more important to me than having the SPR > >> callbacks close to the init_proc functions. > > > > Hmm.. I may be misinterpreting what you're intending here. I > > certainly agree that separating TCG only code from common code is a > > good idea. My point, though, is that the vast majority of the SPR > > code *is* TCG specific - there are just a relatively few cases where > > SPRs have a common path. That basically only happens when a) the SPR > > can be affected by means other than the guest executing instructions > > specifically to do that (i.e. usually by hypercalls) and b) accessing > > the SPR has some side effects that need to be handled in both TCG and > > KVM cases > > The SPR code in translate_init.c.inc currently comprises of: > > 1) the gen_spr* functions that are called during init_proc for each > processor type; Ah... that's one part of the confusion. I forgot about these functions. These should indeed be common, despite sharing the gen_*() prefix with mostly things that are explicitly TCG only. > 2) the spr_register macros and _spr_register function that adds the SPRs > to env->spr, called from (1); > > 3) the TCG-specific SPR read|write callbacks, registered by (2); > > 4) the KVM specific attribute one_reg_id, registered by (2). > > The intention is to have one .c file (cpu_init.c) that deals with > processor initialization, which is mostly setting PowerPCCPUClass > attributes and registering the appropriate SPRs for each processor > family (1,2). We're considering that to be shared between KVM and TCG > for now. Yes, that's what I'd expect. > What is going into a separate file are the read and write SPR callbacks, > which are TCG specific (3). They are still referenced from the other > file when registering the SPRs, but are ignored when building for > KVM-only. These are kept in a TCG-only compilation unit. Ah, right, I'd forgotten that many of the callbacks are in translate_init.c not translate.c. Indeed, those will have to move. > There's still a > decision to be made whether we should have a separate spr_tcg file for > them, or move them into translate.c along with the rest of TCG code. Ah, I see. Ok, yes, in that case moving them to a new TCG only spr file makes more sense to me. translate.c is already enormous. > > The one_reg_id is just one attribute so that does not change. > > > From the descriptions it sounded like you were trying to separate > > *all* SPR code, not just these specific cases from the translation > > core, and that's what I'm saying is a bad idea. > > So, if anything, the SPR callbacks are moving _closer_ to the > translation core. Right. Sorry for the misunderstanding. -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson