• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*++ @file
2   Reset Architectural Protocol as defined in UEFI/PI under Emulation
3 
4 Copyright (c) 2004 - 2009, Intel Corporation. All rights reserved.<BR>
5 Portions copyright (c) 2010 - 2011, Apple Inc. All rights reserved.
6 This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution.  The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
10 
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13 
14 **/
15 
16 #include <PiDxe.h>
17 
18 #include <Library/BaseLib.h>
19 #include <Library/DebugLib.h>
20 #include <Library/UefiLib.h>
21 #include <Library/UefiDriverEntryPoint.h>
22 #include <Library/MemoryAllocationLib.h>
23 #include <Library/UefiBootServicesTableLib.h>
24 #include <Library/EmuThunkLib.h>
25 
26 #include <Protocol/Reset.h>
27 
28 
29 VOID
30 EFIAPI
EmuResetSystem(IN EFI_RESET_TYPE ResetType,IN EFI_STATUS ResetStatus,IN UINTN DataSize,IN VOID * ResetData OPTIONAL)31 EmuResetSystem (
32   IN EFI_RESET_TYPE   ResetType,
33   IN EFI_STATUS       ResetStatus,
34   IN UINTN            DataSize,
35   IN VOID             *ResetData OPTIONAL
36   )
37 {
38   EFI_STATUS  Status;
39   UINTN       HandleCount;
40   EFI_HANDLE  *HandleBuffer;
41   UINTN       Index;
42 
43   //
44   // Disconnect all
45   //
46   Status = gBS->LocateHandleBuffer (
47                   AllHandles,
48                   NULL,
49                   NULL,
50                   &HandleCount,
51                   &HandleBuffer
52                   );
53   if (!EFI_ERROR (Status)) {
54     for (Index = 0; Index < HandleCount; Index++) {
55       Status = gBS->DisconnectController (HandleBuffer[Index], NULL, NULL);
56     }
57 
58     gBS->FreePool (HandleBuffer);
59   }
60 
61 
62   //
63   // Discard ResetType, always return 0 as exit code
64   //
65   gEmuThunk->Exit (0);
66 
67   //
68   // Should never go here
69   //
70   ASSERT (FALSE);
71 
72   return;
73 }
74 
75 
76 
77 EFI_STATUS
78 EFIAPI
InitializeEmuReset(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE * SystemTable)79 InitializeEmuReset (
80   IN EFI_HANDLE        ImageHandle,
81   IN EFI_SYSTEM_TABLE  *SystemTable
82   )
83 /*++
84 
85 Routine Description:
86 
87 
88 Arguments:
89 
90   ImageHandle of the loaded driver
91   Pointer to the System Table
92 
93 Returns:
94 
95   Status
96 **/
97 {
98   EFI_STATUS  Status;
99   EFI_HANDLE  Handle;
100 
101   SystemTable->RuntimeServices->ResetSystem = EmuResetSystem;
102 
103   Handle = NULL;
104   Status = gBS->InstallMultipleProtocolInterfaces (
105                   &Handle,
106                   &gEfiResetArchProtocolGuid,
107                   NULL,
108                   NULL
109                   );
110   ASSERT_EFI_ERROR (Status);
111 
112   return Status;
113 }
114 
115