Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit be4a9f56 authored by Cyril Bur's avatar Cyril Bur Committed by Michael Ellerman
Browse files

selftests/powerpc: Rework FPU stack placement macros and move to header file



The FPU regs are placed at the top of the stack frame. Currently the
position expected to be passed to the macro. The macros now should be
passed the stack frame size and from there they can calculate where to
put the regs, this makes the use simpler.

Also move them to a header file to be used in an different area of the
powerpc selftests

Signed-off-by: default avatarCyril Bur <cyrilbur@gmail.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 65ca668f
Loading
Loading
Loading
Loading
+80 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright 2016, Cyril Bur, IBM Corp.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version
 * 2 of the License, or (at your option) any later version.
 */

#ifndef _SELFTESTS_POWERPC_FPU_ASM_H
#define _SELFTESTS_POWERPC_FPU_ASM_H
#include "basic_asm.h"

#define PUSH_FPU(stack_size) \
	stfd	f31,(stack_size + STACK_FRAME_MIN_SIZE)(%r1); \
	stfd	f30,(stack_size + STACK_FRAME_MIN_SIZE - 8)(%r1); \
	stfd	f29,(stack_size + STACK_FRAME_MIN_SIZE - 16)(%r1); \
	stfd	f28,(stack_size + STACK_FRAME_MIN_SIZE - 24)(%r1); \
	stfd	f27,(stack_size + STACK_FRAME_MIN_SIZE - 32)(%r1); \
	stfd	f26,(stack_size + STACK_FRAME_MIN_SIZE - 40)(%r1); \
	stfd	f25,(stack_size + STACK_FRAME_MIN_SIZE - 48)(%r1); \
	stfd	f24,(stack_size + STACK_FRAME_MIN_SIZE - 56)(%r1); \
	stfd	f23,(stack_size + STACK_FRAME_MIN_SIZE - 64)(%r1); \
	stfd	f22,(stack_size + STACK_FRAME_MIN_SIZE - 72)(%r1); \
	stfd	f21,(stack_size + STACK_FRAME_MIN_SIZE - 80)(%r1); \
	stfd	f20,(stack_size + STACK_FRAME_MIN_SIZE - 88)(%r1); \
	stfd	f19,(stack_size + STACK_FRAME_MIN_SIZE - 96)(%r1); \
	stfd	f18,(stack_size + STACK_FRAME_MIN_SIZE - 104)(%r1); \
	stfd	f17,(stack_size + STACK_FRAME_MIN_SIZE - 112)(%r1); \
	stfd	f16,(stack_size + STACK_FRAME_MIN_SIZE - 120)(%r1); \
	stfd	f15,(stack_size + STACK_FRAME_MIN_SIZE - 128)(%r1); \
	stfd	f14,(stack_size + STACK_FRAME_MIN_SIZE - 136)(%r1);

#define POP_FPU(stack_size) \
	lfd	f31,(stack_size + STACK_FRAME_MIN_SIZE)(%r1); \
	lfd	f30,(stack_size + STACK_FRAME_MIN_SIZE - 8)(%r1); \
	lfd	f29,(stack_size + STACK_FRAME_MIN_SIZE - 16)(%r1); \
	lfd	f28,(stack_size + STACK_FRAME_MIN_SIZE - 24)(%r1); \
	lfd	f27,(stack_size + STACK_FRAME_MIN_SIZE - 32)(%r1); \
	lfd	f26,(stack_size + STACK_FRAME_MIN_SIZE - 40)(%r1); \
	lfd	f25,(stack_size + STACK_FRAME_MIN_SIZE - 48)(%r1); \
	lfd	f24,(stack_size + STACK_FRAME_MIN_SIZE - 56)(%r1); \
	lfd	f23,(stack_size + STACK_FRAME_MIN_SIZE - 64)(%r1); \
	lfd	f22,(stack_size + STACK_FRAME_MIN_SIZE - 72)(%r1); \
	lfd	f21,(stack_size + STACK_FRAME_MIN_SIZE - 80)(%r1); \
	lfd	f20,(stack_size + STACK_FRAME_MIN_SIZE - 88)(%r1); \
	lfd	f19,(stack_size + STACK_FRAME_MIN_SIZE - 96)(%r1); \
	lfd	f18,(stack_size + STACK_FRAME_MIN_SIZE - 104)(%r1); \
	lfd	f17,(stack_size + STACK_FRAME_MIN_SIZE - 112)(%r1); \
	lfd	f16,(stack_size + STACK_FRAME_MIN_SIZE - 120)(%r1); \
	lfd	f15,(stack_size + STACK_FRAME_MIN_SIZE - 128)(%r1); \
	lfd	f14,(stack_size + STACK_FRAME_MIN_SIZE - 136)(%r1);

/*
 * Careful calling this, it will 'clobber' fpu (by design)
 * Don't call this from C
 */
FUNC_START(load_fpu)
	lfd	f14,0(r3)
	lfd	f15,8(r3)
	lfd	f16,16(r3)
	lfd	f17,24(r3)
	lfd	f18,32(r3)
	lfd	f19,40(r3)
	lfd	f20,48(r3)
	lfd	f21,56(r3)
	lfd	f22,64(r3)
	lfd	f23,72(r3)
	lfd	f24,80(r3)
	lfd	f25,88(r3)
	lfd	f26,96(r3)
	lfd	f27,104(r3)
	lfd	f28,112(r3)
	lfd	f29,120(r3)
	lfd	f30,128(r3)
	lfd	f31,136(r3)
	blr
FUNC_END(load_fpu)

#endif /* _SELFTESTS_POWERPC_FPU_ASM_H */
+5 −68
Original line number Original line Diff line number Diff line
@@ -8,70 +8,7 @@
 */
 */


#include "../basic_asm.h"
#include "../basic_asm.h"

#include "../fpu_asm.h"
#define PUSH_FPU(pos) \
	stfd	f14,pos(sp); \
	stfd	f15,pos+8(sp); \
	stfd	f16,pos+16(sp); \
	stfd	f17,pos+24(sp); \
	stfd	f18,pos+32(sp); \
	stfd	f19,pos+40(sp); \
	stfd	f20,pos+48(sp); \
	stfd	f21,pos+56(sp); \
	stfd	f22,pos+64(sp); \
	stfd	f23,pos+72(sp); \
	stfd	f24,pos+80(sp); \
	stfd	f25,pos+88(sp); \
	stfd	f26,pos+96(sp); \
	stfd	f27,pos+104(sp); \
	stfd	f28,pos+112(sp); \
	stfd	f29,pos+120(sp); \
	stfd	f30,pos+128(sp); \
	stfd	f31,pos+136(sp);

#define POP_FPU(pos) \
	lfd	f14,pos(sp); \
	lfd	f15,pos+8(sp); \
	lfd	f16,pos+16(sp); \
	lfd	f17,pos+24(sp); \
	lfd	f18,pos+32(sp); \
	lfd	f19,pos+40(sp); \
	lfd	f20,pos+48(sp); \
	lfd	f21,pos+56(sp); \
	lfd	f22,pos+64(sp); \
	lfd	f23,pos+72(sp); \
	lfd	f24,pos+80(sp); \
	lfd	f25,pos+88(sp); \
	lfd	f26,pos+96(sp); \
	lfd	f27,pos+104(sp); \
	lfd	f28,pos+112(sp); \
	lfd	f29,pos+120(sp); \
	lfd	f30,pos+128(sp); \
	lfd	f31,pos+136(sp);

# Careful calling this, it will 'clobber' fpu (by design)
# Don't call this from C
FUNC_START(load_fpu)
	lfd	f14,0(r3)
	lfd	f15,8(r3)
	lfd	f16,16(r3)
	lfd	f17,24(r3)
	lfd	f18,32(r3)
	lfd	f19,40(r3)
	lfd	f20,48(r3)
	lfd	f21,56(r3)
	lfd	f22,64(r3)
	lfd	f23,72(r3)
	lfd	f24,80(r3)
	lfd	f25,88(r3)
	lfd	f26,96(r3)
	lfd	f27,104(r3)
	lfd	f28,112(r3)
	lfd	f29,120(r3)
	lfd	f30,128(r3)
	lfd	f31,136(r3)
	blr
FUNC_END(load_fpu)


FUNC_START(check_fpu)
FUNC_START(check_fpu)
	mr r4,r3
	mr r4,r3
@@ -138,9 +75,9 @@ FUNC_START(test_fpu)
	# r4 holds pointer to the pid
	# r4 holds pointer to the pid
	# f14-f31 are non volatiles
	# f14-f31 are non volatiles
	PUSH_BASIC_STACK(256)
	PUSH_BASIC_STACK(256)
	PUSH_FPU(256)
	std	r3,STACK_FRAME_PARAM(0)(sp) # Address of darray
	std	r3,STACK_FRAME_PARAM(0)(sp) # Address of darray
	std r4,STACK_FRAME_PARAM(1)(sp) # Address of pid
	std r4,STACK_FRAME_PARAM(1)(sp) # Address of pid
	PUSH_FPU(STACK_FRAME_LOCAL(2,0))


	bl load_fpu
	bl load_fpu
	nop
	nop
@@ -155,7 +92,7 @@ FUNC_START(test_fpu)
	bl check_fpu
	bl check_fpu
	nop
	nop


	POP_FPU(STACK_FRAME_LOCAL(2,0))
	POP_FPU(256)
	POP_BASIC_STACK(256)
	POP_BASIC_STACK(256)
	blr
	blr
FUNC_END(test_fpu)
FUNC_END(test_fpu)
@@ -166,10 +103,10 @@ FUNC_END(test_fpu)
# registers while running is not zero.
# registers while running is not zero.
FUNC_START(preempt_fpu)
FUNC_START(preempt_fpu)
	PUSH_BASIC_STACK(256)
	PUSH_BASIC_STACK(256)
	PUSH_FPU(256)
	std r3,STACK_FRAME_PARAM(0)(sp) # double *darray
	std r3,STACK_FRAME_PARAM(0)(sp) # double *darray
	std r4,STACK_FRAME_PARAM(1)(sp) # int *threads_starting
	std r4,STACK_FRAME_PARAM(1)(sp) # int *threads_starting
	std r5,STACK_FRAME_PARAM(2)(sp) # int *running
	std r5,STACK_FRAME_PARAM(2)(sp) # int *running
	PUSH_FPU(STACK_FRAME_LOCAL(3,0))


	bl load_fpu
	bl load_fpu
	nop
	nop
@@ -192,7 +129,7 @@ FUNC_START(preempt_fpu)
	cmpwi r5,0
	cmpwi r5,0
	bne 2b
	bne 2b


3:	POP_FPU(STACK_FRAME_LOCAL(3,0))
3:	POP_FPU(256)
	POP_BASIC_STACK(256)
	POP_BASIC_STACK(256)
	blr
	blr
FUNC_END(preempt_fpu)
FUNC_END(preempt_fpu)