1 /**@file
2 EFI_PEI_STALL implementation for NT32 simulation environment.
3
4 Copyright (c) 2009 - 2013, 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 #include "WinNtPeim.h"
15
16 #include <Ppi/NtThunk.h>
17 #include <Ppi/Stall.h>
18 #include <Library/DebugLib.h>
19
20 EFI_STATUS
21 EFIAPI
22 Stall (
23 IN CONST EFI_PEI_SERVICES **PeiServices,
24 IN CONST EFI_PEI_STALL_PPI *This,
25 IN UINTN Microseconds
26 );
27
28 EFI_PEI_STALL_PPI mStallPpi = {1000, Stall};
29
30 EFI_PEI_PPI_DESCRIPTOR mPpiListStall[1] = {
31 {
32 (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
33 &gEfiPeiStallPpiGuid,
34 &mStallPpi
35 }
36 };
37
38
39 /**
40 PEIM's entry point.
41
42 This routine installs the simulation instance of EFI_PEI_STALL_PPI based
43 on Win API Sleep().
44
45 @param FileHandle Handle of the file being invoked.
46 @param PeiServices Describes the list of possible PEI Services.
47
48 @retval EFI_SUCCESS The PEIM executed normally.
49 @retval !EFI_SUCCESS The PEIM failed to execute normally.
50 **/
51 EFI_STATUS
52 EFIAPI
InitializeStall(IN EFI_PEI_FILE_HANDLE FileHandle,IN CONST EFI_PEI_SERVICES ** PeiServices)53 InitializeStall (
54 IN EFI_PEI_FILE_HANDLE FileHandle,
55 IN CONST EFI_PEI_SERVICES **PeiServices
56 )
57 {
58 EFI_STATUS Status;
59 Status = (*PeiServices)->InstallPpi (PeiServices, &mPpiListStall[0]);
60 ASSERT_EFI_ERROR (Status);
61
62 return Status;
63 }
64
65 /**
66 The Stall() function provides a blocking stall for at least the number
67 of microseconds stipulated in the final argument of the API.
68
69 @param PeiServices An indirect pointer to the PEI Services Table
70 published by the PEI Foundation.
71 @param This Pointer to the local data for the interface.
72 @param Microseconds Number of microseconds for which to stall.
73
74 @retval EFI_SUCCESS The service provided at least the required delay.
75
76 **/
77 EFI_STATUS
78 EFIAPI
Stall(IN CONST EFI_PEI_SERVICES ** PeiServices,IN CONST EFI_PEI_STALL_PPI * This,IN UINTN Microseconds)79 Stall (
80 IN CONST EFI_PEI_SERVICES **PeiServices,
81 IN CONST EFI_PEI_STALL_PPI *This,
82 IN UINTN Microseconds
83 )
84 {
85 EFI_STATUS Status;
86 PEI_NT_THUNK_PPI *PeiNtService;
87 EFI_WIN_NT_THUNK_PROTOCOL *NtThunk;
88
89 Status = (**PeiServices).LocatePpi (
90 (const EFI_PEI_SERVICES **)PeiServices,
91 &gPeiNtThunkPpiGuid,
92 0,
93 NULL,
94 (VOID**)&PeiNtService
95 );
96 ASSERT_EFI_ERROR (Status);
97
98 //
99 // Calculate the time to sleep. Win API smallest unit to sleep is 1 millisec
100 // so micro second units need be divided by 1000 to convert to ms
101 //
102 NtThunk = (EFI_WIN_NT_THUNK_PROTOCOL*) PeiNtService->NtThunk();
103 NtThunk->Sleep ((DWORD)((Microseconds + 999) / 1000));
104
105 return EFI_SUCCESS;
106 }
107