cm_macros.S 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /*
  2. * Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved.
  3. *
  4. * Redistribution and use in source and binary forms, with or without
  5. * modification, are permitted provided that the following conditions are met:
  6. *
  7. * Redistributions of source code must retain the above copyright notice, this
  8. * list of conditions and the following disclaimer.
  9. *
  10. * Redistributions in binary form must reproduce the above copyright notice,
  11. * this list of conditions and the following disclaimer in the documentation
  12. * and/or other materials provided with the distribution.
  13. *
  14. * Neither the name of ARM nor the names of its contributors may be used
  15. * to endorse or promote products derived from this software without specific
  16. * prior written permission.
  17. *
  18. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  19. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  20. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  21. * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
  22. * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  23. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  24. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  25. * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  26. * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  27. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  28. * POSSIBILITY OF SUCH DAMAGE.
  29. */
  30. /* ---------------------------------------------
  31. * Zero out the callee saved register to prevent
  32. * leakage of secure state into the normal world
  33. * during the first ERET after a cold/warm boot.
  34. * ---------------------------------------------
  35. */
  36. .macro zero_callee_saved_regs
  37. mov x19, xzr
  38. mov x20, xzr
  39. mov x21, xzr
  40. mov x22, xzr
  41. mov x23, xzr
  42. mov x24, xzr
  43. mov x25, xzr
  44. mov x26, xzr
  45. mov x27, xzr
  46. mov x28, xzr
  47. mov x29, xzr
  48. .endm
  49. .macro switch_to_exception_stack reg1 reg2
  50. mov \reg1 , sp
  51. ldr \reg2, [\reg1, #CTX_EL3STATE_OFFSET + CTX_EXCEPTION_SP]
  52. mov sp, \reg2
  53. .endm
  54. /* -----------------------------------------------------
  55. * Handle SMC exceptions seperately from other sync.
  56. * exceptions.
  57. * -----------------------------------------------------
  58. */
  59. .macro handle_sync_exception
  60. stp x30, xzr, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR]
  61. mrs x30, esr_el3
  62. ubfx x30, x30, #ESR_EC_SHIFT, #ESR_EC_LENGTH
  63. cmp x30, #EC_AARCH32_SMC
  64. b.eq smc_handler32
  65. cmp x30, #EC_AARCH64_SMC
  66. b.eq smc_handler64
  67. /* -----------------------------------------------------
  68. * The following code handles any synchronous exception
  69. * that is not an SMC. SP_EL3 is pointing to a context
  70. * structure where all the scratch registers are saved.
  71. * An exception stack is also retrieved from the context
  72. * Currently, a register dump is printed since BL31 does
  73. * not expect any such exceptions.
  74. * -----------------------------------------------------
  75. */
  76. bl save_scratch_registers
  77. switch_to_exception_stack x0 x1
  78. /* Save the core_context pointer for handled faults */
  79. stp x0, xzr, [sp, #-0x10]!
  80. bl fault_handler
  81. ldp x0, xzr, [sp], #0x10
  82. mov sp, x0
  83. bl restore_scratch_registers
  84. ldp x30, xzr, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR]
  85. eret
  86. .endm
  87. /* -----------------------------------------------------
  88. * Use a platform defined mechanism to report an async.
  89. * exception.
  90. * -----------------------------------------------------
  91. */
  92. .macro handle_async_exception type
  93. stp x30, xzr, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR]
  94. bl save_scratch_registers
  95. switch_to_exception_stack x0 x1
  96. /* Save the core_context pointer */
  97. stp x0, xzr, [sp, #-0x10]!
  98. mov x0, \type
  99. bl plat_report_exception
  100. ldp x0, xzr, [sp], #0x10
  101. mov sp, x0
  102. bl restore_scratch_registers
  103. ldp x30, xzr, [sp, #CTX_GPREGS_OFFSET + CTX_GPREG_LR]
  104. .endm