sec_firmware_asm.S 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. /* SPDX-License-Identifier: GPL-2.0+ */
  2. /*
  3. * Copyright 2016 NXP Semiconductor, Inc.
  4. */
  5. #include <config.h>
  6. #include <linux/linkage.h>
  7. #include <asm/system.h>
  8. #include <asm/macro.h>
  9. WEAK(_sec_firmware_entry)
  10. /*
  11. * x0: Secure Firmware entry point
  12. * x1: Exception return address Low
  13. * x2: Exception return address High
  14. */
  15. /* Save stack pointer for EL2 */
  16. mov x3, sp
  17. msr sp_el2, x3
  18. /* Set exception return address hold pointer */
  19. adr x4, 1f
  20. mov x3, x4
  21. #ifdef CONFIG_ARMV8_SEC_FIRMWARE_ERET_ADDR_REVERT
  22. rev w3, w3
  23. #endif
  24. str w3, [x1]
  25. lsr x3, x4, #32
  26. #ifdef CONFIG_ARMV8_SEC_FIRMWARE_ERET_ADDR_REVERT
  27. rev w3, w3
  28. #endif
  29. str w3, [x2]
  30. /* Call SEC monitor */
  31. br x0
  32. 1:
  33. mov x0, #0
  34. ret
  35. ENDPROC(_sec_firmware_entry)
  36. #ifdef CONFIG_SEC_FIRMWARE_ARMV8_PSCI
  37. ENTRY(_sec_firmware_support_psci_version)
  38. mov x0, 0x84000000
  39. mov x1, 0x0
  40. mov x2, 0x0
  41. mov x3, 0x0
  42. smc #0
  43. ret
  44. ENDPROC(_sec_firmware_support_psci_version)
  45. /*
  46. * Switch from AArch64 EL2 to AArch32 EL2
  47. * @param inputs:
  48. * x0: argument, zero
  49. * x1: machine nr
  50. * x2: fdt address
  51. * x3: input argument
  52. * x4: kernel entry point
  53. * @param outputs for secure firmware:
  54. * x0: function id
  55. * x1: kernel entry point
  56. * x2: machine nr
  57. * x3: fdt address
  58. */
  59. ENTRY(armv8_el2_to_aarch32)
  60. mov x3, x2
  61. mov x2, x1
  62. mov x1, x4
  63. ldr x0, =0xc200ff17
  64. smc #0
  65. ret
  66. ENDPROC(armv8_el2_to_aarch32)
  67. #endif