mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-02 13:03:28 +01:00
84f41b2b58
Signed-off-by: Slice <sergey.slice@gmail.com>
99 lines
2.1 KiB
ArmAsm
99 lines
2.1 KiB
ArmAsm
//
|
|
// Copyright (c) 2012-2013, ARM Limited. All rights reserved.
|
|
//
|
|
// SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
//
|
|
//
|
|
|
|
#include <AsmMacroIoLib.h>
|
|
|
|
//VOID
|
|
//ArmPlatformStackSet (
|
|
// IN UINTN StackBase,
|
|
// IN UINTN MpId,
|
|
// IN UINTN PrimaryStackSize,
|
|
// IN UINTN SecondaryStackSize
|
|
// );
|
|
ASM_FUNC(ArmPlatformStackSet)
|
|
// 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 ASM_PFX(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 ASM_PFX(ArmPlatformStackSetPrimary)
|
|
bne ASM_PFX(ArmPlatformStackSetSecondary)
|
|
|
|
//VOID
|
|
//ArmPlatformStackSetPrimary (
|
|
// IN UINTN StackBase,
|
|
// IN UINTN MpId,
|
|
// IN UINTN PrimaryStackSize,
|
|
// IN UINTN SecondaryStackSize
|
|
// );
|
|
ASM_FUNC(ArmPlatformStackSetPrimary)
|
|
mov r4, lr
|
|
|
|
// Add stack of primary stack to StackBase
|
|
add r0, r0, r2
|
|
|
|
// Compute SecondaryCoresCount * SecondaryCoreStackSize
|
|
MOV32 (r1, FixedPcdGet32(PcdCoreCount) - 1)
|
|
mul r3, r3, r1
|
|
|
|
// Set Primary Stack ((StackBase + PrimaryStackSize) + (SecondaryCoresCount * SecondaryCoreStackSize))
|
|
add sp, r0, r3
|
|
|
|
bx r4
|
|
|
|
//VOID
|
|
//ArmPlatformStackSetSecondary (
|
|
// IN UINTN StackBase,
|
|
// IN UINTN MpId,
|
|
// IN UINTN PrimaryStackSize,
|
|
// IN UINTN SecondaryStackSize
|
|
// );
|
|
ASM_FUNC(ArmPlatformStackSetSecondary)
|
|
mov r4, lr
|
|
mov sp, r0
|
|
|
|
// Get Core Position
|
|
mov r0, r1
|
|
bl ASM_PFX(ArmPlatformGetCorePosition)
|
|
mov r5, r0
|
|
|
|
// Get Primary Core Position
|
|
bl ASM_PFX(ArmPlatformGetPrimaryCoreMpId)
|
|
bl ASM_PFX(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
|
|
|