2 * COPYRIGHT: See COPYING.ARM in the top level directory
3 * PROJECT: ReactOS UEFI Boot Library
4 * FILE: boot/environ/lib/firmware/efi/firmware.c
5 * PURPOSE: Boot Library Firmware Initialization for EFI
6 * PROGRAMMER: Alex Ionescu (alex.ionescu@reactos.org)
9 /* INCLUDES ******************************************************************/
13 /* DATA VARIABLES ************************************************************/
15 GUID EfiSimpleTextInputExProtocol
= EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL_GUID
;
17 PBL_FIRMWARE_DESCRIPTOR EfiFirmwareParameters
;
18 BL_FIRMWARE_DESCRIPTOR EfiFirmwareData
;
19 EFI_HANDLE EfiImageHandle
;
20 EFI_SYSTEM_TABLE
* EfiSystemTable
;
22 EFI_SYSTEM_TABLE
*EfiST
;
23 EFI_BOOT_SERVICES
*EfiBS
;
24 EFI_RUNTIME_SERVICES
*EfiRT
;
25 EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL
*EfiConOut
;
26 EFI_SIMPLE_TEXT_INPUT_PROTOCOL
*EfiConIn
;
27 EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL
*EfiConInEx
;
29 /* FUNCTIONS *****************************************************************/
33 _In_ EFI_HANDLE Handle
,
34 _In_ EFI_GUID
*Protocol
,
35 _Out_ PVOID
* Interface
42 /* Are we using virtual memory/ */
43 if (MmTranslationType
!= BlNone
)
45 /* We need complex tracking to make this work */
46 //Status = EfiVmOpenProtocol(Handle, Protocol, Interface);
47 Status
= STATUS_NOT_SUPPORTED
;
51 /* Are we in protected mode? */
52 OldMode
= CurrentExecutionContext
->Mode
;
53 if (OldMode
!= BlRealMode
)
55 /* FIXME: Not yet implemented */
56 return STATUS_NOT_IMPLEMENTED
;
59 /* Are we on legacy 1.02? */
60 if (EfiST
->FirmwareRevision
== EFI_1_02_SYSTEM_TABLE_REVISION
)
62 /* Make the legacy call */
63 EfiStatus
= EfiBS
->HandleProtocol(Handle
, Protocol
, Interface
);
67 /* Use the UEFI version */
68 EfiStatus
= EfiBS
->OpenProtocol(Handle
,
73 EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
75 /* Switch back to protected mode if we came from there */
76 if (OldMode
!= BlRealMode
)
78 BlpArchSwitchContext(OldMode
);
82 /* Convert the error to an NTSTATUS */
83 Status
= EfiGetNtStatusCode(EfiStatus
);
86 /* Clear the interface on failure, and return the status */
87 if (!NT_SUCCESS(Status
))
97 _In_ EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL
*ConInEx
,
98 _In_ EFI_KEY_TOGGLE_STATE
* KeyToggleState
101 BL_ARCH_MODE OldMode
;
102 EFI_STATUS EfiStatus
;
104 /* Are we in protected mode? */
105 OldMode
= CurrentExecutionContext
->Mode
;
106 if (OldMode
!= BlRealMode
)
108 /* FIXME: Not yet implemented */
109 return STATUS_NOT_IMPLEMENTED
;
112 /* Make the EFI call */
113 EfiStatus
= ConInEx
->SetState(ConInEx
, KeyToggleState
);
115 /* Switch back to protected mode if we came from there */
116 if (OldMode
!= BlRealMode
)
118 BlpArchSwitchContext(OldMode
);
121 /* Convert the error to an NTSTATUS */
122 return EfiGetNtStatusCode(EfiStatus
);
126 EfiSetWatchdogTimer (
130 BL_ARCH_MODE OldMode
;
131 EFI_STATUS EfiStatus
;
133 /* Are we in protected mode? */
134 OldMode
= CurrentExecutionContext
->Mode
;
135 if (OldMode
!= BlRealMode
)
137 /* FIXME: Not yet implemented */
138 return STATUS_NOT_IMPLEMENTED
;
141 /* Make the EFI call */
142 EfiStatus
= EfiBS
->SetWatchdogTimer(0, 0, 0, NULL
);
144 /* Switch back to protected mode if we came from there */
145 if (OldMode
!= BlRealMode
)
147 BlpArchSwitchContext(OldMode
);
150 /* Convert the error to an NTSTATUS */
151 return EfiGetNtStatusCode(EfiStatus
);
157 _In_ PBL_FIRMWARE_DESCRIPTOR FirmwareData
160 NTSTATUS Status
= STATUS_SUCCESS
;
161 EFI_KEY_TOGGLE_STATE KeyToggleState
;
163 /* Check if we have vaild firmware data */
164 if (!(FirmwareData
) || !(FirmwareData
->Version
))
166 return STATUS_INVALID_PARAMETER
;
169 /* Check which boot phase we're in */
172 /* Memory manager is ready, open the extended input protocol */
173 Status
= EfiOpenProtocol(EfiST
->ConsoleInHandle
,
174 &EfiSimpleTextInputExProtocol
,
175 (PVOID
*)&EfiConInEx
);
176 if (NT_SUCCESS(Status
))
178 /* Set the initial key toggle state */
179 KeyToggleState
= EFI_TOGGLE_STATE_VALID
| 40;
180 EfiConInExSetState(EfiST
->ConsoleInHandle
, &KeyToggleState
);
183 /* Setup the watchdog timer */
184 EfiSetWatchdogTimer();
188 /* Make a copy of the parameters */
189 EfiFirmwareParameters
= &EfiFirmwareData
;
191 /* Check which version we received */
192 if (FirmwareData
->Version
== 1)
194 /* FIXME: Not supported */
195 Status
= STATUS_NOT_SUPPORTED
;
197 else if (FirmwareData
->Version
>= 2)
199 /* Version 2 -- save the data */
200 EfiFirmwareData
= *FirmwareData
;
201 EfiSystemTable
= FirmwareData
->SystemTable
;
202 EfiImageHandle
= FirmwareData
->ImageHandle
;
204 /* Set the EDK-II style variables as well */
205 EfiST
= EfiSystemTable
;
206 EfiBS
= EfiSystemTable
->BootServices
;
207 EfiRT
= EfiSystemTable
->RuntimeServices
;
208 EfiConOut
= EfiSystemTable
->ConOut
;
209 EfiConIn
= EfiSystemTable
->ConIn
;
214 /* Unknown version */
215 Status
= STATUS_NOT_SUPPORTED
;
219 /* Return the initialization state */