/** A stub to convert framework boot script dispatch to PI boot script dispatch. @param ImageHandle It should be is NULL. @param Context The first parameter to pass to 32bit code @return dispatch value. **/ EFI_STATUS EFIAPI FrameworkBootScriptDispatchStub ( IN EFI_HANDLE ImageHandle, IN VOID *Context ) { EFI_STATUS Status; DISPATCH_ENTRYPOINT_FUNC EntryFunc; VOID *PeiServices; IA32_DESCRIPTOR Idtr; DEBUG ((EFI_D_ERROR, "FrameworkBootScriptDispatchStub - 0x%08x\n", (UINTN)Context)); EntryFunc = (DISPATCH_ENTRYPOINT_FUNC) (UINTN) (Context); AsmReadIdtr (&Idtr); PeiServices = (VOID *)(UINTN)(*(UINT32 *)(Idtr.Base - sizeof (UINT32))); // // ECP assumes first parameter is NULL, and second parameter is PeiServices. // Status = Execute32BitCode ((UINT64)(UINTN)EntryFunc, 0, (UINT64)(UINTN)PeiServices); return Status; }
/** Call FSP API - FspInit. @param[in] FspHeader FSP header pointer. @param[in] FspInitParams Address pointer to the FSP_INIT_PARAMS structure. @return EFI status returned by FspInit API. **/ EFI_STATUS EFIAPI CallFspInit ( IN FSP_INFO_HEADER *FspHeader, IN FSP_INIT_PARAMS *FspInitParams ) { FSP_INIT FspInitApi; EFI_STATUS Status; BOOLEAN InterruptState; FspInitApi = (FSP_INIT)(UINTN)(FspHeader->ImageBase + FspHeader->FspInitEntryOffset); InterruptState = SaveAndDisableInterrupts (); Status = Execute32BitCode ((UINTN)FspInitApi, (UINTN)FspInitParams); SetInterruptState (InterruptState); return Status; }
/** Call FSP API - TempRamExit. @param[in] FspHeader FSP header pointer. @param[in,out] TempRamExitParam Address pointer to the TempRamExit parameters structure. @return EFI status returned by TempRamExit API. **/ EFI_STATUS EFIAPI CallTempRamExit ( IN FSP_INFO_HEADER *FspHeader, IN OUT VOID *TempRamExitParam ) { FSP_TEMP_RAM_EXIT TempRamExitApi; EFI_STATUS Status; BOOLEAN InterruptState; TempRamExitApi = (FSP_TEMP_RAM_EXIT)(UINTN)(FspHeader->ImageBase + FspHeader->TempRamExitEntryOffset); InterruptState = SaveAndDisableInterrupts (); Status = Execute32BitCode ((UINTN)TempRamExitApi, (UINTN)TempRamExitParam); SetInterruptState (InterruptState); return Status; }
/** Call FSP API - FspNotifyPhase. @param[in] FspHeader FSP header pointer. @param[in] NotifyPhaseParams Address pointer to the NOTIFY_PHASE_PARAMS structure. @return EFI status returned by FspNotifyPhase API. **/ EFI_STATUS EFIAPI CallFspNotifyPhase ( IN FSP_INFO_HEADER *FspHeader, IN NOTIFY_PHASE_PARAMS *NotifyPhaseParams ) { FSP_NOTIFY_PHASE NotifyPhaseApi; EFI_STATUS Status; BOOLEAN InterruptState; NotifyPhaseApi = (FSP_NOTIFY_PHASE)(UINTN)(FspHeader->ImageBase + FspHeader->NotifyPhaseEntryOffset); InterruptState = SaveAndDisableInterrupts (); Status = Execute32BitCode ((UINTN)NotifyPhaseApi, (UINTN)NotifyPhaseParams); SetInterruptState (InterruptState); return Status; }