mirror of https://github.com/acidanthera/audk.git
131 lines
2.6 KiB
ArmAsm
131 lines
2.6 KiB
ArmAsm
|
#------------------------------------------------------------------------------
|
||
|
#
|
||
|
# Copyright (c) 2014, Intel Corporation. All rights reserved.<BR>
|
||
|
# 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.
|
||
|
#
|
||
|
# Module Name:
|
||
|
#
|
||
|
# PeiCoreEntry.S
|
||
|
#
|
||
|
# Abstract:
|
||
|
#
|
||
|
# Find and call SecStartup
|
||
|
#
|
||
|
#------------------------------------------------------------------------------
|
||
|
|
||
|
ASM_GLOBAL ASM_PFX(CallPeiCoreEntryPoint)
|
||
|
ASM_PFX(CallPeiCoreEntryPoint):
|
||
|
#
|
||
|
# Obtain the hob list pointer
|
||
|
#
|
||
|
movl 0x4(%esp), %eax
|
||
|
#
|
||
|
# Obtain the stack information
|
||
|
# ECX: start of range
|
||
|
# EDX: end of range
|
||
|
#
|
||
|
movl 0x8(%esp), %ecx
|
||
|
movl 0xC(%esp), %edx
|
||
|
|
||
|
#
|
||
|
# Platform init
|
||
|
#
|
||
|
pushal
|
||
|
pushl %edx
|
||
|
pushl %ecx
|
||
|
pushl %eax
|
||
|
call ASM_PFX(PlatformInit)
|
||
|
popl %eax
|
||
|
popl %eax
|
||
|
popl %eax
|
||
|
popal
|
||
|
|
||
|
#
|
||
|
# Set stack top pointer
|
||
|
#
|
||
|
movl %edx, %esp
|
||
|
|
||
|
#
|
||
|
# Push the hob list pointer
|
||
|
#
|
||
|
pushl %eax
|
||
|
|
||
|
#
|
||
|
# Save the value
|
||
|
# ECX: start of range
|
||
|
# EDX: end of range
|
||
|
#
|
||
|
movl %esp, %ebp
|
||
|
pushl %ecx
|
||
|
pushl %edx
|
||
|
|
||
|
#
|
||
|
# Push processor count to stack first, then BIST status (AP then BSP)
|
||
|
#
|
||
|
movl $1, %eax
|
||
|
cpuid
|
||
|
shr $16, %ebx
|
||
|
andl $0x000000FF, %ebx
|
||
|
cmp $1, %bl
|
||
|
jae PushProcessorCount
|
||
|
|
||
|
#
|
||
|
# Some processors report 0 logical processors. Effectively 0 = 1.
|
||
|
# So we fix up the processor count
|
||
|
#
|
||
|
inc %ebx
|
||
|
|
||
|
PushProcessorCount:
|
||
|
pushl %ebx
|
||
|
|
||
|
#
|
||
|
# We need to implement a long-term solution for BIST capture. For now, we just copy BSP BIST
|
||
|
# for all processor threads
|
||
|
#
|
||
|
xorl %ecx, %ecx
|
||
|
movb %bl, %cl
|
||
|
PushBist:
|
||
|
movd %mm0, %eax
|
||
|
pushl %eax
|
||
|
loop PushBist
|
||
|
|
||
|
# Save Time-Stamp Counter
|
||
|
movd %mm5, %eax
|
||
|
pushl %eax
|
||
|
|
||
|
movd %mm6, %eax
|
||
|
pushl %eax
|
||
|
|
||
|
#
|
||
|
# Pass entry point of the PEI core
|
||
|
#
|
||
|
movl $0xFFFFFFE0, %edi
|
||
|
pushl %ds:(%edi)
|
||
|
|
||
|
#
|
||
|
# Pass BFV into the PEI Core
|
||
|
#
|
||
|
movl $0xFFFFFFFC, %edi
|
||
|
pushl %ds:(%edi)
|
||
|
|
||
|
#
|
||
|
# Pass stack size into the PEI Core
|
||
|
#
|
||
|
movl -4(%ebp), %ecx
|
||
|
movl -8(%ebp), %edx
|
||
|
pushl %ecx # RamBase
|
||
|
|
||
|
subl %ecx, %edx
|
||
|
pushl %edx # RamSize
|
||
|
|
||
|
#
|
||
|
# Pass Control into the PEI Core
|
||
|
#
|
||
|
call ASM_PFX(SecStartup)
|