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 | |