The RVCT .asm files include AsmMacroIoLib.h only for the definition of LoadConstantToReg (), which makes it tedious to make change to that file without the risk of making the RVCT assembler unhappy. So simply replace LoadConstantToReg() with mov32, which does the right thing in all cases. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Reviewed-by: Leif Lindholm <leif.lindholm@linaro.org>
		
			
				
	
	
		
			125 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
			
		
		
	
	
			125 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			NASM
		
	
	
	
	
	
| //
 | |
| //  Copyright (c) 2012-2013, ARM Limited. All rights reserved.
 | |
| //
 | |
| //  This program and the accompanying materials
 | |
| //  are licensed and made available under the terms and conditions of the BSD License
 | |
| //  which accompanies this distribution.  The full text of the license may be found at
 | |
| //  http://opensource.org/licenses/bsd-license.php
 | |
| //
 | |
| //  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | |
| //  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | |
| //
 | |
| //
 | |
| 
 | |
| #include <AutoGen.h>
 | |
| 
 | |
|   INCLUDE AsmMacroIoLib.inc
 | |
| 
 | |
|   EXPORT  ArmPlatformStackSet
 | |
|   EXPORT  ArmPlatformStackSetPrimary
 | |
|   EXPORT  ArmPlatformStackSetSecondary
 | |
| 
 | |
|   IMPORT  ArmPlatformIsPrimaryCore
 | |
|   IMPORT  ArmPlatformGetCorePosition
 | |
|   IMPORT  ArmPlatformGetPrimaryCoreMpId
 | |
| 
 | |
|   IMPORT  _gPcd_FixedAtBuild_PcdCoreCount
 | |
| 
 | |
|   PRESERVE8
 | |
|   AREA    ArmPlatformStackLib, CODE, READONLY
 | |
| 
 | |
| //VOID
 | |
| //ArmPlatformStackSet (
 | |
| //  IN UINTN StackBase,
 | |
| //  IN UINTN MpId,
 | |
| //  IN UINTN PrimaryStackSize,
 | |
| //  IN UINTN SecondaryStackSize
 | |
| //  );
 | |
| ArmPlatformStackSet FUNCTION
 | |
|   // Save parameters
 | |
|   mov   r6, r3
 | |
|   mov   r5, r2
 | |
|   mov   r4, r1
 | |
|   mov   r3, r0
 | |
| 
 | |
|   // Save the Link register
 | |
|   mov   r7, lr
 | |
| 
 | |
|   // Identify Stack
 | |
|   mov   r0, r1
 | |
|   bl    ArmPlatformIsPrimaryCore
 | |
|   cmp   r0, #1
 | |
| 
 | |
|   // Restore parameters
 | |
|   mov   r0, r3
 | |
|   mov   r1, r4
 | |
|   mov   r2, r5
 | |
|   mov   r3, r6
 | |
| 
 | |
|   // Restore the Link register
 | |
|   mov   lr, r7
 | |
| 
 | |
|   beq   ArmPlatformStackSetPrimary
 | |
|   bne   ArmPlatformStackSetSecondary
 | |
|   ENDFUNC
 | |
| 
 | |
| //VOID
 | |
| //ArmPlatformStackSetPrimary (
 | |
| //  IN UINTN StackBase,
 | |
| //  IN UINTN MpId,
 | |
| //  IN UINTN PrimaryStackSize,
 | |
| //  IN UINTN SecondaryStackSize
 | |
| //  );
 | |
| ArmPlatformStackSetPrimary FUNCTION
 | |
|   mov   r4, lr
 | |
| 
 | |
|   // Add stack of primary stack to StackBase
 | |
|   add   r0, r0, r2
 | |
| 
 | |
|   // Compute SecondaryCoresCount * SecondaryCoreStackSize
 | |
|   mov32 r1, FixedPcdGet32 (PcdCoreCount)
 | |
|   sub   r1, #1
 | |
|   mul   r3, r3, r1
 | |
| 
 | |
|   // Set Primary Stack ((StackBase + PrimaryStackSize) + (SecondaryCoresCount * SecondaryCoreStackSize))
 | |
|   add   sp, r0, r3
 | |
| 
 | |
|   bx    r4
 | |
|   ENDFUNC
 | |
| 
 | |
| //VOID
 | |
| //ArmPlatformStackSetSecondary (
 | |
| //  IN UINTN StackBase,
 | |
| //  IN UINTN MpId,
 | |
| //  IN UINTN PrimaryStackSize,
 | |
| //  IN UINTN SecondaryStackSize
 | |
| //  );
 | |
| ArmPlatformStackSetSecondary FUNCTION
 | |
|   mov   r4, lr
 | |
|   mov   sp, r0
 | |
| 
 | |
|   // Get Core Position
 | |
|   mov   r0, r1
 | |
|   bl ArmPlatformGetCorePosition
 | |
|   mov   r5, r0
 | |
| 
 | |
|   // Get Primary Core Position
 | |
|   bl ArmPlatformGetPrimaryCoreMpId
 | |
|   bl ArmPlatformGetCorePosition
 | |
| 
 | |
|   // Get Secondary Core Position. We should get consecutive secondary stack number from 1...(CoreCount-1)
 | |
|   cmp   r5, r0
 | |
|   subhi r5, r5, #1
 | |
|   add   r5, r5, #1
 | |
| 
 | |
|   // Compute top of the secondary stack
 | |
|   mul   r3, r3, r5
 | |
| 
 | |
|   // Set stack
 | |
|   add   sp, sp, r3
 | |
| 
 | |
|   bx r4
 | |
|   ENDFUNC
 | |
| 
 | |
|   END
 |