| /* SPDX-License-Identifier: GPL-2.0-or-later */ |
| /* |
| * test helper assembly functions |
| * |
| * Copyright (C) 2016 Simon Guo, IBM Corporation. |
| * Copyright 2022 Michael Ellerman, IBM Corporation. |
| */ |
| #include "basic_asm.h" |
| |
| #define GPR_SIZE __SIZEOF_LONG__ |
| #define FIRST_GPR 14 |
| #define NUM_GPRS (32 - FIRST_GPR) |
| #define STACK_SIZE (NUM_GPRS * GPR_SIZE) |
| |
| // gpr_child_loop(int *read_flag, int *write_flag, |
| // unsigned long *gpr_buf, double *fpr_buf); |
| FUNC_START(gpr_child_loop) |
| // r3 = read_flag |
| // r4 = write_flag |
| // r5 = gpr_buf |
| // r6 = fpr_buf |
| PUSH_BASIC_STACK(STACK_SIZE) |
| |
| // Save non-volatile GPRs |
| OP_REGS PPC_STL, GPR_SIZE, FIRST_GPR, 31, %r1, STACK_FRAME_LOCAL(0, 0), FIRST_GPR |
| |
| // Load GPRs with expected values |
| OP_REGS PPC_LL, GPR_SIZE, FIRST_GPR, 31, r5, 0, FIRST_GPR |
| |
| // Load FPRs with expected values |
| OP_REGS lfd, 8, 0, 31, r6 |
| |
| // Signal to parent that we're ready |
| li r0, 1 |
| stw r0, 0(r4) |
| |
| // Wait for parent to finish |
| 1: lwz r0, 0(r3) |
| cmpwi r0, 0 |
| beq 1b // Loop while flag is zero |
| |
| // Save GPRs back to caller buffer |
| OP_REGS PPC_STL, GPR_SIZE, FIRST_GPR, 31, r5, 0, FIRST_GPR |
| |
| // Save FPRs |
| OP_REGS stfd, 8, 0, 31, r6 |
| |
| // Reload non-volatile GPRs |
| OP_REGS PPC_LL, GPR_SIZE, FIRST_GPR, 31, %r1, STACK_FRAME_LOCAL(0, 0), FIRST_GPR |
| |
| POP_BASIC_STACK(STACK_SIZE) |
| blr |