[PATCH] powerpc64/linux: Fix 64-bit process detection on embedded

James Yang James.Yang at freescale.com
Tue Feb 25 23:19:57 UTC 2014


On Tue, 25 Feb 2014, Dmitry V. Levin wrote:

> On Wed, Feb 19, 2014 at 07:10:53PM -0600, James Yang wrote:
> > On Thu, 20 Feb 2014, Dmitry V. Levin wrote:
> > 
> > > On Tue, Feb 18, 2014 at 03:32:43PM -0600, James Yang wrote:
> > > > * syscall.c: Fix 64-bit process detection on embedded powerpc
> > > > 
> > > > Signed-off-by: James Yang <james.yang at freescale.com>
> > > > ---
> > > >  syscall.c |    5 +++--
> > > >  1 files changed, 3 insertions(+), 2 deletions(-)
> > > > 
> > > > diff --git a/syscall.c b/syscall.c
> > > > index 3477dcd..8d47e7e 100644
> > > > --- a/syscall.c
> > > > +++ b/syscall.c
> > > > @@ -1222,8 +1222,9 @@ get_scno(struct tcb *tcp)
> > > >  	int currpers;
> > > >  
> > > >  	/* Check for 64/32 bit mode. */
> > > > -	/* SF is bit 0 of MSR */
> > > > -	if ((ppc_regs.msr >> 63) & 1)
> > > > +	/* SF is bit 0 of MSR (a 64-bit register in Server) */
> > > > +	/* CM is bit 0 of MSR (a 32-bit register in Embedded) */
> > > > +	if (((ppc_regs.msr >> 63) & 1) || ((ppc_regs.msr >> 31) & 1))
> > > >  		currpers = 0;
> > > >  	else
> > > >  		currpers = 1;
> > > 
> > > In case of 64-bit MSR, that would be a test for 32th bit.
> > > I'm not quite familiar with ppc64, is there any risk for a false positive
> > > in this case?
> > 
> > When tested on a POWER7 running Linux, MSR bit 32 is clear.  So 
> > empircally, it is not in use.
> > 
> > It is documented as part of a reserved field according to Power ISA 
> > Book III-S so it should read as 0 unless there's an implementation- 
> > specific use of the bit.  No documentation I have found describes the 
> > use of it as other than reserved.
> 
> OK, let's assume it's safe to do the check this way.
> 
> There seems to be a shorter equivalent check for these two bits:
> 	ppc_regs.msr & 0x8000000080000000
>
> Which of them would you prefer, the longer one or the shorter one?


If bit 32 ends up being used by server someday for some meaning where 
it could be set for a 32-bit process, the long way will still be able 
to confidently identify a 64-bit process, but it will not confidently 
identify a 32-bit process.  The short way will have no confidence at 
all for either 32-bit or 64-bit.

The mask has better codegen as long as we make the assumption bit 32 
is reserved and will read as 0.

Until use of bit 32 becomes a reality (per above, I have no 
information that it will be used), I'd say using a mask is fine.





More information about the Strace-devel mailing list