ArmPlatformStackLib.asm 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. //
  2. // Copyright (c) 2012-2013, ARM Limited. All rights reserved.
  3. //
  4. // SPDX-License-Identifier: BSD-2-Clause-Patent
  5. //
  6. //
  7. #include <AutoGen.h>
  8. INCLUDE AsmMacroIoLib.inc
  9. EXPORT ArmPlatformStackSet
  10. EXPORT ArmPlatformStackSetPrimary
  11. EXPORT ArmPlatformStackSetSecondary
  12. IMPORT ArmPlatformIsPrimaryCore
  13. IMPORT ArmPlatformGetCorePosition
  14. IMPORT ArmPlatformGetPrimaryCoreMpId
  15. IMPORT _gPcd_FixedAtBuild_PcdCoreCount
  16. PRESERVE8
  17. AREA ArmPlatformStackLib, CODE, READONLY
  18. //VOID
  19. //ArmPlatformStackSet (
  20. // IN UINTN StackBase,
  21. // IN UINTN MpId,
  22. // IN UINTN PrimaryStackSize,
  23. // IN UINTN SecondaryStackSize
  24. // );
  25. ArmPlatformStackSet FUNCTION
  26. // Save parameters
  27. mov r6, r3
  28. mov r5, r2
  29. mov r4, r1
  30. mov r3, r0
  31. // Save the Link register
  32. mov r7, lr
  33. // Identify Stack
  34. mov r0, r1
  35. bl ArmPlatformIsPrimaryCore
  36. cmp r0, #1
  37. // Restore parameters
  38. mov r0, r3
  39. mov r1, r4
  40. mov r2, r5
  41. mov r3, r6
  42. // Restore the Link register
  43. mov lr, r7
  44. beq ArmPlatformStackSetPrimary
  45. bne ArmPlatformStackSetSecondary
  46. ENDFUNC
  47. //VOID
  48. //ArmPlatformStackSetPrimary (
  49. // IN UINTN StackBase,
  50. // IN UINTN MpId,
  51. // IN UINTN PrimaryStackSize,
  52. // IN UINTN SecondaryStackSize
  53. // );
  54. ArmPlatformStackSetPrimary FUNCTION
  55. mov r4, lr
  56. // Add stack of primary stack to StackBase
  57. add r0, r0, r2
  58. // Compute SecondaryCoresCount * SecondaryCoreStackSize
  59. mov32 r1, FixedPcdGet32 (PcdCoreCount)
  60. sub r1, #1
  61. mul r3, r3, r1
  62. // Set Primary Stack ((StackBase + PrimaryStackSize) + (SecondaryCoresCount * SecondaryCoreStackSize))
  63. add sp, r0, r3
  64. bx r4
  65. ENDFUNC
  66. //VOID
  67. //ArmPlatformStackSetSecondary (
  68. // IN UINTN StackBase,
  69. // IN UINTN MpId,
  70. // IN UINTN PrimaryStackSize,
  71. // IN UINTN SecondaryStackSize
  72. // );
  73. ArmPlatformStackSetSecondary FUNCTION
  74. mov r4, lr
  75. mov sp, r0
  76. // Get Core Position
  77. mov r0, r1
  78. bl ArmPlatformGetCorePosition
  79. mov r5, r0
  80. // Get Primary Core Position
  81. bl ArmPlatformGetPrimaryCoreMpId
  82. bl ArmPlatformGetCorePosition
  83. // Get Secondary Core Position. We should get consecutive secondary stack number from 1...(CoreCount-1)
  84. cmp r5, r0
  85. subhi r5, r5, #1
  86. add r5, r5, #1
  87. // Compute top of the secondary stack
  88. mul r3, r3, r5
  89. // Set stack
  90. add sp, sp, r3
  91. bx r4
  92. ENDFUNC
  93. END