[Pdbg] [PATCH v2 14/15] main: Convert getscom/putscom to use path based targeting
Alistair Popple
alistair at popple.id.au
Thu Nov 15 15:05:49 AEDT 2018
On Thursday, 15 November 2018 12:05:52 PM AEDT Amitay Isaacs wrote:
> > So how about we do this:
> > 1. If -P is specified print the full path and complete translated
> > address. eg:
> >
> > # pdbg -P /fsi0/pib0/chiplet5 getscom 0x1010
> > /fsi0/pib0/chiplet5:0x5001010 = 0xdeadbeef
> >
> > 2. If -p/-c is specified print the same short-hand notation
> > (p0:c0:<addr> =
> > <data>)
>
> If we print the translated address then it makes sense to print the
> target relative to which the address is translated. So even for
> chipsets specified with -P, printing "p0:<xlate-addr>" makes sense.
>
> Printing the translated address may be a way to confirm that the
> address translation is working correctly, specially once we add weird
> translation schemes. Is that the motivation behind printing translated
> addresses?
Yep, I should probably have been clearer about the motivation. In general when
debugging systems I've found it to be good not to hide magic - specifying a
path+offset is really just a convenient way of specifying a specific SCOM
operation, but it should always report the exact operation that was done (ie.
getscom <xlate-addr>)
It may also help new users figure out what specifying a path actually does.
> To be consistent we have to use either of the following formats.
>
> 1. /fsi0/pib0/chiplet5: 0x1010 = 0xdeadbeef
>
> This makes the explicit the target and the scom address specified.
>
> 2. p0: 0x5001010 = 0xdeadbeef
>
> This is more engineering output which tells what address space the scom
> address falls under and the actual translated address relative to that
> address space.
>
> The first format is advantageous if there are multiple targets printed:
>
> /fsi0/pib0/chiplet1: 0x1010 = 0xdeadbeef
> /fsi0/pib0/chiplet3: 0x1010 = 0xdeadbeef
> /fsi0/pib0/chiplet5: 0x1010 = 0xdeadbeef
>
> Rather than,
>
> p0: 0x1001010 = 0xdeadbeef
> p0: 0x3001010 = 0xdeadbeef
> p0: 0x5001010 = 0xdeadbeef
>
> 3. May be we want both formats and can be specified by user. We can
> add an option (e.g. -x) to print translated address.
>
> 4. How about combined output? May be too verbose.
>
> p0: 0x1001010 = 0xdeadbeef (/fsi0/pib0/chiplet1)
> p0: 0x3001010 =
> 0xdeadbeef (/fsi0/pib0/chiplet3)
> p0: 0x5001010 = 0xdeadbeef
> (/fsi0/pib0/chiplet5)
Actually I kinda like the combined output. I don't think it's too verbose or
any harder to read as the full paths should be aligned in a column anyway.
> > > Can we do getscom/putscom on non pib/core/thread targets? If yes,
> > > what
> > > should be the prefix for those targets?
> >
> > Yes, but lets not worry about prefixing those. Lets just print the
> > path in that
> > case. My primary concern was changing the output of something like:
> >
> > # pdbg -p0 getscom 0xf000f
> >
> > From `p0:0xf000f = <data>` to `/fsi0/pib1000 = <data>` which I
> > suspect may
> > confuse existing users. Anyone who figures out how to specify a path
> > wont (or
> > at least shouldn't) be surprised to see it in the output.
> >
> > > > Also I think we should print the complete translated SCOM address
> > > > rather than
> > > > the offset pdbg was called with. Thanks!
> > >
> > > We need pdbg_target_address_translate() or something similar. IIRC,
> > > there was a patch that added a public wrapper around
> > > get_class_target_addr() but used a bad name. :-)
> >
> > Yeah. But "somebody" said it was a bad API and we shouldn't need it
> >
> > :-)
> > :
> > > I can add that patch back.
> >
> > Turns out that somebody was correct though and we need a better name
> > and API.
> > Instead of manually specifying the target address class the API
> > should just
> > take target and address offset and magically return the translated
> > address for
> > the address space it belongs to. Something like:
> >
> > uint64_t target_parent_addr(struct pdbg_target *target, uint64_t
> > offset)
> >
> > Although happy to bike shed names. For the moment the "magic" could
> > just be
>
> pdbg_address_relative(), or
> pdbg_address_translate()
pdbg_address_absolute()? pdbg_address_translate() works as well though.
relative seems confusing to me because your passing in a relative address.
> > hardcoded to check scommable() and use the existing
> > get_class_target_addr(tgt,
> > "pib", offset). We can add better magic once this series is done.
>
> If we do automagic translation relative to the correct address space, I
> think the api should also return the base target whose address space
> the scom address resides in.
Excellent point, I agree. So basically just an automagic version of the
existing get_class_target_addr(). For the moment we can keep the
implementation simple. Something like the below psuedo-code should work:
struct target *pdbg_address_absolute(tgt, offset, addr) {
assert(pdbg_target_class(tgt) == "pib", "chiplet", "xbus", <rest of the
scommable classes>, ...);
tgt = get_class_target_addr(tgt, "pib", &addr);
return tgt;
}
I can start working on more generalised "magic".
- Alistair
> Amitay.
More information about the Pdbg
mailing list