ptrace-gpr.S 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  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. #define GPR_SIZE __SIZEOF_LONG__
  10. #define FIRST_GPR 14
  11. #define NUM_GPRS (32 - FIRST_GPR)
  12. #define STACK_SIZE (NUM_GPRS * GPR_SIZE)
  13. // gpr_child_loop(int *read_flag, int *write_flag,
  14. // unsigned long *gpr_buf, double *fpr_buf);
  15. FUNC_START(gpr_child_loop)
  16. // r3 = read_flag
  17. // r4 = write_flag
  18. // r5 = gpr_buf
  19. // r6 = fpr_buf
  20. PUSH_BASIC_STACK(STACK_SIZE)
  21. // Save non-volatile GPRs
  22. OP_REGS PPC_STL, GPR_SIZE, FIRST_GPR, 31, %r1, STACK_FRAME_LOCAL(0, 0), FIRST_GPR
  23. // Load GPRs with expected values
  24. OP_REGS PPC_LL, GPR_SIZE, FIRST_GPR, 31, r5, 0, FIRST_GPR
  25. // Load FPRs with expected values
  26. OP_REGS lfd, 8, 0, 31, r6
  27. // Signal to parent that we're ready
  28. li r0, 1
  29. stw r0, 0(r4)
  30. // Wait for parent to finish
  31. 1: lwz r0, 0(r3)
  32. cmpwi r0, 0
  33. beq 1b // Loop while flag is zero
  34. // Save GPRs back to caller buffer
  35. OP_REGS PPC_STL, GPR_SIZE, FIRST_GPR, 31, r5, 0, FIRST_GPR
  36. // Save FPRs
  37. OP_REGS stfd, 8, 0, 31, r6
  38. // Reload non-volatile GPRs
  39. OP_REGS PPC_LL, GPR_SIZE, FIRST_GPR, 31, %r1, STACK_FRAME_LOCAL(0, 0), FIRST_GPR
  40. POP_BASIC_STACK(STACK_SIZE)
  41. blr