save_boot_param.S 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /*
  2. * (C) Copyright 2016 Rockchip Electronics Co., Ltd
  3. * (C) Copyright 2017 Theobroma Systems Design und Consulting GmbH
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <linux/linkage.h>
  8. #if defined(CONFIG_ARM64)
  9. .globl SAVE_SP_ADDR
  10. SAVE_SP_ADDR:
  11. .quad 0
  12. ENTRY(save_boot_params)
  13. sub sp, sp, #0x60
  14. stp x29, x30, [sp, #0x50]
  15. stp x27, x28, [sp, #0x40]
  16. stp x25, x26, [sp, #0x30]
  17. stp x23, x24, [sp, #0x20]
  18. stp x21, x22, [sp, #0x10]
  19. stp x19, x20, [sp, #0]
  20. ldr x8, =SAVE_SP_ADDR
  21. mov x9, sp
  22. str x9, [x8]
  23. b save_boot_params_ret /* back to my caller */
  24. ENDPROC(save_boot_params)
  25. .globl _back_to_bootrom_s
  26. ENTRY(_back_to_bootrom_s)
  27. ldr x0, =SAVE_SP_ADDR
  28. ldr x0, [x0]
  29. mov sp, x0
  30. ldp x29, x30, [sp, #0x50]
  31. ldp x27, x28, [sp, #0x40]
  32. ldp x25, x26, [sp, #0x30]
  33. ldp x23, x24, [sp, #0x20]
  34. ldp x21, x22, [sp, #0x10]
  35. ldp x19, x20, [sp]
  36. add sp, sp, #0x60
  37. mov x0, xzr
  38. ret
  39. ENDPROC(_back_to_bootrom_s)
  40. #else
  41. .globl SAVE_SP_ADDR
  42. SAVE_SP_ADDR:
  43. .word 0
  44. /*
  45. * void save_boot_params
  46. *
  47. * Save sp, lr, r1~r12
  48. */
  49. ENTRY(save_boot_params)
  50. push {r1-r12, lr}
  51. ldr r0, =SAVE_SP_ADDR
  52. str sp, [r0]
  53. b save_boot_params_ret @ back to my caller
  54. ENDPROC(save_boot_params)
  55. .globl _back_to_bootrom_s
  56. ENTRY(_back_to_bootrom_s)
  57. ldr r0, =SAVE_SP_ADDR
  58. ldr sp, [r0]
  59. mov r0, #0
  60. pop {r1-r12, pc}
  61. ENDPROC(_back_to_bootrom_s)
  62. #endif