Merge tag 'trace-printf-v6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/trace...
[drm/drm-misc.git] / tools / testing / selftests / powerpc / ptrace / ptrace-gpr.S
blob070e8443e3ccddb44868edbd46181d91e9d58b74
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"
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)
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)
24         // Save non-volatile GPRs
25         OP_REGS PPC_STL, GPR_SIZE, FIRST_GPR, 31, %r1, STACK_FRAME_LOCAL(0, 0), FIRST_GPR
27         // Load GPRs with expected values
28         OP_REGS PPC_LL, GPR_SIZE, FIRST_GPR, 31, r5, 0, FIRST_GPR
30         // Load FPRs with expected values
31         OP_REGS lfd, 8, 0, 31, r6
33         // Signal to parent that we're ready
34         li      r0, 1
35         stw     r0, 0(r4)
37         // Wait for parent to finish
38 1:      lwz     r0, 0(r3)
39         cmpwi   r0, 0
40         beq     1b      // Loop while flag is zero
42         // Save GPRs back to caller buffer
43         OP_REGS PPC_STL, GPR_SIZE, FIRST_GPR, 31, r5, 0, FIRST_GPR
45         // Save FPRs
46         OP_REGS stfd, 8, 0, 31, r6
48         // Reload non-volatile GPRs
49         OP_REGS PPC_LL, GPR_SIZE, FIRST_GPR, 31, %r1, STACK_FRAME_LOCAL(0, 0), FIRST_GPR
51         POP_BASIC_STACK(STACK_SIZE)
52         blr