mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-11-04 05:25:45 +01:00 
			
		
		
		
	Contributed-under: TianoCore Contribution Agreement 1.0 Signed off by: Jiewen Yao <jiewen.yao@intel.com> Reviewed by: Ravi Rangarajan <ravi.p.rangarajan@intel.com> Reviewed by: Maurice Ma <maurice.ma@intel.com> Reviewed by: Giri Mudusuru <giri.p.mudusuru@intel.com> Reviewed by: Liming Gao <liming.gao@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15676 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			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)
 |