• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /** @file
2   Ipf-specific functionality for DxeLoad.
3 
4 Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution.  The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9 
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 
13 **/
14 
15 #include "DxeIpl.h"
16 
17 
18 
19 /**
20    Transfers control to DxeCore.
21 
22    This function performs a CPU architecture specific operations to execute
23    the entry point of DxeCore with the parameters of HobList.
24    It also installs EFI_END_OF_PEI_PPI to signal the end of PEI phase.
25 
26    @param DxeCoreEntryPoint         The entry point of DxeCore.
27    @param HobList                   The start of HobList passed to DxeCore.
28 
29 **/
30 VOID
HandOffToDxeCore(IN EFI_PHYSICAL_ADDRESS DxeCoreEntryPoint,IN EFI_PEI_HOB_POINTERS HobList)31 HandOffToDxeCore (
32   IN EFI_PHYSICAL_ADDRESS   DxeCoreEntryPoint,
33   IN EFI_PEI_HOB_POINTERS   HobList
34   )
35 {
36   VOID                *BaseOfStack;
37   VOID                *TopOfStack;
38   VOID                *BspStore;
39   EFI_STATUS          Status;
40 
41   //
42   // Allocate 128KB for the Stack
43   //
44   BaseOfStack = AllocatePages (EFI_SIZE_TO_PAGES (STACK_SIZE));
45   ASSERT (BaseOfStack != NULL);
46 
47   //
48   // Allocate 16KB for the BspStore
49   //
50   BspStore    = AllocatePages (EFI_SIZE_TO_PAGES (BSP_STORE_SIZE));
51   ASSERT (BspStore != NULL);
52   //
53   // Build BspStoreHob
54   //
55   BuildBspStoreHob ((EFI_PHYSICAL_ADDRESS) (UINTN) BspStore, BSP_STORE_SIZE, EfiBootServicesData);
56 
57   //
58   // Compute the top of the stack we were allocated. Pre-allocate a UINTN
59   // for safety.
60   //
61   TopOfStack = (VOID *) ((UINTN) BaseOfStack + EFI_SIZE_TO_PAGES (STACK_SIZE) * EFI_PAGE_SIZE - CPU_STACK_ALIGNMENT);
62   TopOfStack = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT);
63 
64   //
65   // End of PEI phase signal
66   //
67   Status = PeiServicesInstallPpi (&gEndOfPeiSignalPpi);
68   ASSERT_EFI_ERROR (Status);
69 
70   //
71   // Update the contents of BSP stack HOB to reflect the real stack info passed to DxeCore.
72   //
73   UpdateStackHob ((EFI_PHYSICAL_ADDRESS)(UINTN) BaseOfStack, STACK_SIZE);
74 
75   //
76   // Transfer the control to the entry point of DxeCore.
77   //
78   SwitchStack (
79     (SWITCH_STACK_ENTRY_POINT)(UINTN)DxeCoreEntryPoint,
80     HobList.Raw,
81     NULL,
82     TopOfStack,
83     BspStore
84     );
85 }
86