1 // 2 // Copyright (c) 2012-2013, ARM Limited. All rights reserved. 3 // 4 // This program and the accompanying materials 5 // are licensed and made available under the terms and conditions of the BSD License 6 // which accompanies this distribution. The full text of the license may be found at 7 // http://opensource.org/licenses/bsd-license.php 8 // 9 // THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 10 // WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 11 // 12 // 13 14 #include <AsmMacroIoLib.h> 15 #include <Base.h> 16 #include <AutoGen.h> 17 18 INCLUDE AsmMacroIoLib.inc 19 20 EXPORT ArmPlatformStackSet 21 EXPORT ArmPlatformStackSetPrimary 22 EXPORT ArmPlatformStackSetSecondary 23 24 IMPORT ArmPlatformIsPrimaryCore 25 IMPORT ArmPlatformGetCorePosition 26 IMPORT ArmPlatformGetPrimaryCoreMpId 27 28 IMPORT _gPcd_FixedAtBuild_PcdCoreCount 29 30 PRESERVE8 31 AREA ArmPlatformStackLib, CODE, READONLY 32 33 //VOID 34 //ArmPlatformStackSet ( 35 // IN UINTN StackBase, 36 // IN UINTN MpId, 37 // IN UINTN PrimaryStackSize, 38 // IN UINTN SecondaryStackSize 39 // ); 40 ArmPlatformStackSet FUNCTION 41 // Save parameters 42 mov r6, r3 43 mov r5, r2 44 mov r4, r1 45 mov r3, r0 46 47 // Save the Link register 48 mov r7, lr 49 50 // Identify Stack 51 mov r0, r1 52 bl ArmPlatformIsPrimaryCore 53 cmp r0, #1 54 55 // Restore parameters 56 mov r0, r3 57 mov r1, r4 58 mov r2, r5 59 mov r3, r6 60 61 // Restore the Link register 62 mov lr, r7 63 64 beq ArmPlatformStackSetPrimary 65 bne ArmPlatformStackSetSecondary 66 ENDFUNC 67 68 //VOID 69 //ArmPlatformStackSetPrimary ( 70 // IN UINTN StackBase, 71 // IN UINTN MpId, 72 // IN UINTN PrimaryStackSize, 73 // IN UINTN SecondaryStackSize 74 // ); 75 ArmPlatformStackSetPrimary FUNCTION 76 mov r4, lr 77 78 // Add stack of primary stack to StackBase 79 add r0, r0, r2 80 81 // Compute SecondaryCoresCount * SecondaryCoreStackSize 82 LoadConstantToReg (_gPcd_FixedAtBuild_PcdCoreCount, r1) 83 ldr r1, [r1] 84 sub r1, #1 85 mul r3, r3, r1 86 87 // Set Primary Stack ((StackBase + PrimaryStackSize) + (SecondaryCoresCount * SecondaryCoreStackSize)) 88 add sp, r0, r3 89 90 bx r4 91 ENDFUNC 92 93 //VOID 94 //ArmPlatformStackSetSecondary ( 95 // IN UINTN StackBase, 96 // IN UINTN MpId, 97 // IN UINTN PrimaryStackSize, 98 // IN UINTN SecondaryStackSize 99 // ); 100 ArmPlatformStackSetSecondary FUNCTION 101 mov r4, lr 102 mov sp, r0 103 104 // Get Core Position 105 mov r0, r1 106 bl ArmPlatformGetCorePosition 107 mov r5, r0 108 109 // Get Primary Core Position 110 bl ArmPlatformGetPrimaryCoreMpId 111 bl ArmPlatformGetCorePosition 112 113 // Get Secondary Core Position. We should get consecutive secondary stack number from 1...(CoreCount-1) 114 cmp r5, r0 115 subhi r5, r5, #1 116 add r5, r5, #1 117 118 // Compute top of the secondary stack 119 mul r3, r3, r5 120 121 // Set stack 122 add sp, sp, r3 123 124 bx r4 125 ENDFUNC 126 127 END 128