[PATCH v4 1/9] selftests/powerpc: Test the preservation of FPU and VMX regs across syscall

Michael Ellerman mpe at ellerman.id.au
Tue Feb 16 16:32:47 AEDT 2016


On Tue, 2016-02-16 at 11:06 +1100, Cyril Bur wrote:
> On Mon, 15 Feb 2016 22:29:17 +0530
> "Naveen N. Rao" <naveen.n.rao at linux.vnet.ibm.com> wrote:
> 
> > On 2016/02/15 04:07PM, Cyril Bur wrote:
> > > Test that the non volatile floating point and Altivec registers get
> > > correctly preserved across the fork() syscall.
> > > 
> > > fork() works nicely for this purpose, the registers should be the same for
> > > both parent and child
> > > 
> > > diff --git a/tools/testing/selftests/powerpc/basic_asm.h b/tools/testing/selftests/powerpc/basic_asm.h
> > > new file mode 100644
> > > index 0000000..f243da0
> > > --- /dev/null
> > > +++ b/tools/testing/selftests/powerpc/basic_asm.h
> > > @@ -0,0 +1,30 @@
> > > +#include <ppc-asm.h>
> > > +#include <asm/unistd.h>
> > > +
> > > +#define LOAD_REG_IMMEDIATE(reg,expr) \
> > > +	lis	reg,(expr)@highest;	\
> > > +	ori	reg,reg,(expr)@higher;	\
> > > +	rldicr	reg,reg,32,31;	\
> > > +	oris	reg,reg,(expr)@high;	\
> > > +	ori	reg,reg,(expr)@l;
> > > +
> > > +/* It is very important to note here that _extra is the extra amount of
> > > + * stack space needed.
> > > + * This space must be accessed at sp + 32!  
> > 
> 
> Hi Naveen,
> 
> Thanks for the review.

> > This looks to be specific to ABIv2. Is this series limited to ppc64le?  
> > If so, you might want to ensure this only builds there.
> > 
> 
> Is ABIv1 still in use? Can we still compile for v1? 

YES! >:E

> This is for series 64bit only, I've not really got any reason to believe this
> is LE only, shouldn't this work BE? The makefile enforces 64bit, I believe it is
> ok for kernel selftests to fail to compile if they aren't going to be able to
> run.

> > Also:
> > #define PPC_ABIV2_MIN_STACK_SIZE 32
> > 
> > or just:
> > #define PPC_MIN_STACK	32
> > 
> > ... is helpful. And, you might want to base the rest of your code that 
> > use PUSH_BASIC_STACK() on that. If we ever want to have these tests run 
> > anywhere else, that'll help a lot. (See further below)
> > 
> 
> So I thought about it. I agree that it would be nice, I just worry that I might
> get rabbitholed, I can see it going further and then providing stack accessors
> to abstract out even PPC_MIN_STACK except in a bunch of macros, and that's when
> I know I've gone too far.
> 
> Perhaps I could look at adding this when I write more tests, I have grand plans
> to push way more tests.

You definitely need a #define for the minimum stack frame size, based on the
ABI version. You can basically do what the kernel does for STACK_FRAME_MIN_SIZE.

You also need to cope with the TOC save slot moving between ABIv1 & 2, which
shouldn't be hard with a macro for it.

> > > + */
> > > +#define PUSH_BASIC_STACK(_extra) \
> > > +	mflr	r0; \
> > > +	std	r0,16(sp); \
> > > +	stdu	sp,-(_extra + 32)(sp); \
> > > +	mfcr	r0; \
> > > +	stw	r0,8(sp); \
> > > +	std	2,24(sp);  
> > 		^^
> > Better to use r2 here and below.
> > 
> 
> I think the reason I used '2' is that 'r2' isn't actually defined in ppc-asm.h
> for userspace, due to conventions, like 'sp', 'toc' has been used. So I could
> have used 'toc' but then there was an issue with toc NOT being defined, or
> getting undefined in some situations.

That's true, ppc-asm.h doesn't define r2, instead it defines toc.

But you can always use %r2, which is preferable to 2 IMHO.

Personally I'd rather you use %r1 than sp, but I won't make you. As someone who
has read lots of powerpc assembler %r1 translates as "stack pointer" where as
"sp" translates as "huh?".

> > > +FUNC_START(test_fpu)
> > > +	#r3 holds pointer to where to put the result of fork
> > > +	#r4 holds pointer to the pid
> > > +	#f14-f31 are non volatiles
> > > +	PUSH_BASIC_STACK(256)
> > > +	std	r3,40(sp) #Address of darray  
> > 
> > So, this could be:
> > 	PUSH_BASIC_STACK(256)
> > 	std	r3,PPC_MIN_STACK+8(sp)
> > 
> > ... though I wonder why there is +8 here?
> 
> I think the +8 is left over from my using +0 for something else and then not
> and not going back and being all neat about stack usage. Admittedly I didn't
> look over that too hard it being a selftest and all, I'm not sure optimal
> stack usage is super important here.

The first free slot is at PPC_MIN_STACK(%r1), so that's what you should use.

cheers



More information about the Linuxppc-dev mailing list