1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * test helper assembly functions
4  *
5  * Copyright (C) 2016 Simon Guo, IBM Corporation.
6  * Copyright 2022 Michael Ellerman, IBM Corporation.
7  */
8 #include "basic_asm.h"
9 
10 #define GPR_SIZE	__SIZEOF_LONG__
11 #define FIRST_GPR	14
12 #define NUM_GPRS	(32 - FIRST_GPR)
13 #define STACK_SIZE	(NUM_GPRS * GPR_SIZE)
14 
15 // gpr_child_loop(int *read_flag, int *write_flag,
16 //		  unsigned long *gpr_buf, double *fpr_buf);
17 FUNC_START(gpr_child_loop)
18 	// r3 = read_flag
19 	// r4 = write_flag
20 	// r5 = gpr_buf
21 	// r6 = fpr_buf
22 	PUSH_BASIC_STACK(STACK_SIZE)
23 
24 	// Save non-volatile GPRs
25 	OP_REGS PPC_STL, GPR_SIZE, FIRST_GPR, 31, %r1, STACK_FRAME_LOCAL(0, 0), FIRST_GPR
26 
27 	// Load GPRs with expected values
28 	OP_REGS PPC_LL, GPR_SIZE, FIRST_GPR, 31, r5, 0, FIRST_GPR
29 
30 	// Load FPRs with expected values
31 	OP_REGS lfd, 8, 0, 31, r6
32 
33 	// Signal to parent that we're ready
34 	li	r0, 1
35 	stw	r0, 0(r4)
36 
37 	// Wait for parent to finish
38 1:	lwz	r0, 0(r3)
39 	cmpwi	r0, 0
40 	beq	1b	// Loop while flag is zero
41 
42 	// Save GPRs back to caller buffer
43 	OP_REGS PPC_STL, GPR_SIZE, FIRST_GPR, 31, r5, 0, FIRST_GPR
44 
45 	// Save FPRs
46 	OP_REGS stfd, 8, 0, 31, r6
47 
48 	// Reload non-volatile GPRs
49 	OP_REGS PPC_LL, GPR_SIZE, FIRST_GPR, 31, %r1, STACK_FRAME_LOCAL(0, 0), FIRST_GPR
50 
51 	POP_BASIC_STACK(STACK_SIZE)
52 	blr
53