Author: ion
Date: Sat Sep 5 20:31:14 2015
New Revision: 69041
URL:
http://svn.reactos.org/svn/reactos?rev=69041&view=rev
Log:
[BOOTMGFW]:
- Add very early EFI Firmware and x86 Context Management Support.
Added:
trunk/reactos/boot/environ/lib/arch/i386/ (with props)
trunk/reactos/boot/environ/lib/arch/i386/arch.c (with props)
trunk/reactos/boot/environ/lib/firmware/efi/ (with props)
trunk/reactos/boot/environ/lib/firmware/efi/firmware.c (with props)
Modified:
trunk/reactos/boot/environ/CMakeLists.txt
trunk/reactos/boot/environ/app/bootmgr/efiemu.c
trunk/reactos/boot/environ/include/bl.h
trunk/reactos/boot/environ/lib/bootlib.c
Modified: trunk/reactos/boot/environ/CMakeLists.txt
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/CMakeLists.tx…
==============================================================================
--- trunk/reactos/boot/environ/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/reactos/boot/environ/CMakeLists.txt [iso-8859-1] Sat Sep 5 20:31:14 2015
@@ -11,14 +11,15 @@
app/bootmgr/bootmgr.h
lib/bootlib.c
lib/misc/bcd.c
- lib/misc/util.c)
+ lib/misc/util.c
+ lib/firmware/efi/firmware.c)
if(ARCH STREQUAL "i386")
list(APPEND BOOTLIB_ASM_SOURCE
#lib/arch/i386/foo.asm
)
list(APPEND BOOTLIB_SOURCE
- #lib/arch/i386/foo.c
+ lib/arch/i386/arch.c
)
elseif(ARCH STREQUAL "amd64")
list(APPEND BOOTLIB_ASM_SOURCE
Modified: trunk/reactos/boot/environ/app/bootmgr/efiemu.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/app/bootmgr/e…
==============================================================================
--- trunk/reactos/boot/environ/app/bootmgr/efiemu.c [iso-8859-1] (original)
+++ trunk/reactos/boot/environ/app/bootmgr/efiemu.c [iso-8859-1] Sat Sep 5 20:31:14 2015
@@ -677,7 +677,7 @@
/* Zero out the header, and write down the signature */
RtlZeroMemory(Entry, sizeof(BL_APPLICATION_ENTRY));
- RtlCopyMemory(Entry->Signature, "BTAPENT", 7);
+ RtlCopyMemory(Entry->Signature, BL_APP_ENTRY_SIGNATURE, 7);
/* Check if a BCD object was passed on the command-line */
ObjectString = wcsstr(CommandLine, L"BCDOBJECT=");
Modified: trunk/reactos/boot/environ/include/bl.h
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/include/bl.h?…
==============================================================================
--- trunk/reactos/boot/environ/include/bl.h [iso-8859-1] (original)
+++ trunk/reactos/boot/environ/include/bl.h [iso-8859-1] Sat Sep 5 20:31:14 2015
@@ -19,6 +19,9 @@
/* NT Base Headers */
#include <ntifs.h>
+/* NDK Headers */
+#include <ntndk.h>
+
/* UEFI Headers */
#include <Uefi.h>
#include <DevicePath.h>
@@ -28,6 +31,8 @@
#define BL_APPLICATION_FLAG_CONVERTED_FROM_EFI 0x01
+#define BL_APP_ENTRY_SIGNATURE "BTAPENT"
+
#define BOOT_APPLICATION_SIGNATURE_1 'TOOB'
#define BOOT_APPLICATION_SIGNATURE_2 ' PPA'
@@ -41,7 +46,24 @@
#define BL_APPLICATION_ENTRY_FLAG_NO_GUID 0x01
+#define BL_CONTEXT_PAGING_ON 1
+#define BL_CONTEXT_INTERRUPTS_ON 2
+
/* ENUMERATIONS **************************************************************/
+
+typedef enum _BL_TRANSLATION_TYPE
+{
+ BlNone,
+ BlVirtual,
+ BlPae,
+ BlMax
+} BL_TRANSLATION_TYPE;
+
+typedef enum _BL_ARCH_MODE
+{
+ BlProtectedMode,
+ BlRealMode
+} BL_ARCH_MODE;
//
// Boot Device Types
@@ -325,6 +347,13 @@
WCHAR LoadOptions[ANYSIZE_ARRAY];
} BL_WINDOWS_LOAD_OPTIONS, *PBL_WINDOWS_LOAD_OPTIONS;
+typedef struct _BL_ARCH_CONTEXT
+{
+ BL_ARCH_MODE Mode;
+ BL_TRANSLATION_TYPE TranslationType;
+ ULONG ContextFlags;
+} BL_ARCH_CONTEXT, *PBL_ARCH_CONTEXT;
+
/* INITIALIZATION ROUTINES ***************************************************/
NTSTATUS
@@ -333,6 +362,17 @@
_In_ PBL_LIBRARY_PARAMETERS LibraryParameters
);
+NTSTATUS
+BlpArchInitialize (
+ _In_ ULONG Phase
+ );
+
+NTSTATUS
+BlpFwInitialize (
+ _In_ ULONG Phase,
+ _In_ PBL_FIRMWARE_DESCRIPTOR FirmwareParameters
+ );
+
/* UTILITY ROUTINES **********************************************************/
EFI_STATUS
@@ -340,6 +380,11 @@
_In_ NTSTATUS Status
);
+NTSTATUS
+EfiGetNtStatusCode (
+ _In_ EFI_STATUS EfiStatus
+ );
+
/* BCD ROUTINES **************************************************************/
ULONG
@@ -347,4 +392,16 @@
_In_ PBL_BCD_OPTION BcdOption
);
+/* CONTEXT ROUTINES **********************************************************/
+
+VOID
+BlpArchSwitchContext (
+ _In_ BL_ARCH_MODE NewMode
+ );
+
+extern ULONG BlpApplicationFlags;
+extern BL_LIBRARY_PARAMETERS BlpLibraryParameters;
+extern BL_TRANSLATION_TYPE MmTranslationType;
+extern PBL_ARCH_CONTEXT CurrentExecutionContext;
+
#endif
Propchange: trunk/reactos/boot/environ/lib/arch/i386/
------------------------------------------------------------------------------
--- bugtraq:logregex (added)
+++ bugtraq:logregex Sat Sep 5 20:31:14 2015
@@ -0,0 +1 @@
+((CORE|ROSTESTS|ROSAPPS)-\d+)(,? ?((CORE|ROSTESTS|ROSAPPS)-\d+))*(,? ?(and |or
)?((CORE|ROSTESTS|ROSAPPS)-\d+))?
Propchange: trunk/reactos/boot/environ/lib/arch/i386/
------------------------------------------------------------------------------
bugtraq:message = See issue %BUGID% for more details.
Propchange: trunk/reactos/boot/environ/lib/arch/i386/
------------------------------------------------------------------------------
bugtraq:url =
https://jira.reactos.org/browse/%BUGID%
Propchange: trunk/reactos/boot/environ/lib/arch/i386/
------------------------------------------------------------------------------
tsvn:logminsize = 10
Added: trunk/reactos/boot/environ/lib/arch/i386/arch.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/lib/arch/i386…
==============================================================================
--- trunk/reactos/boot/environ/lib/arch/i386/arch.c (added)
+++ trunk/reactos/boot/environ/lib/arch/i386/arch.c [iso-8859-1] Sat Sep 5 20:31:14 2015
@@ -0,0 +1,250 @@
+/*
+ * COPYRIGHT: See COPYING.ARM in the top level directory
+ * PROJECT: ReactOS UEFI Boot Library
+ * FILE: boot/environ/lib/arch/i386/arch.c
+ * PURPOSE: Boot Library Architectural Initialization for i386
+ * PROGRAMMER: Alex Ionescu (alex.ionescu(a)reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include "bl.h"
+
+/* DATA VARIABLES ************************************************************/
+
+BL_ARCH_CONTEXT FirmwareExecutionContext;
+BL_ARCH_CONTEXT ApplicationExecutionContext;
+PBL_ARCH_CONTEXT CurrentExecutionContext;
+
+/* FUNCTIONS *****************************************************************/
+
+VOID
+//__declspec(naked) fixme: gcc
+ArchTrapNoProcess (
+ VOID
+ )
+{
+ /* Do nothing, this is an unsupported debugging interrupt */
+ // _asm { iret } FIXME: GCC
+}
+
+VOID
+ArchSwitchContext (
+ _In_ PBL_ARCH_CONTEXT NewContext,
+ _In_ PBL_ARCH_CONTEXT OldContext
+ )
+{
+ /* Are we switching to real mode? */
+ if (NewContext->Mode == BlRealMode)
+ {
+ /* Disable paging */
+ __writecr0(__readcr0() & ~CR0_PG);
+
+ /* Are we coming from PAE mode? */
+ if ((OldContext != NULL) && (OldContext->TranslationType == BlPae))
+ {
+ /* Turn off PAE */
+ __writecr4(__readcr4() & ~CR4_PAE);
+ }
+
+ /* Enable interrupts */
+ _enable();
+ }
+ else
+ {
+ /* Switching to protected mode -- disable interrupts if needed */
+ if (!(NewContext->ContextFlags & BL_CONTEXT_INTERRUPTS_ON))
+ {
+ _disable();
+ }
+
+ /* Are we enabling paging for the first time? */
+ if (NewContext->ContextFlags & BL_CONTEXT_PAGING_ON)
+ {
+ /* In PAE mode? */
+ if (NewContext->TranslationType == BlPae)
+ {
+ /* Turn on PAE */
+ __writecr4(__readcr4() | CR4_PAE);
+ }
+
+ /* Turn on paging */
+ __writecr0(__readcr0() | CR0_PG);
+ }
+ }
+}
+
+NTSTATUS
+ArchInitializeContext (
+ _In_ PBL_ARCH_CONTEXT Context
+ )
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ /* Are we initializing real mode? */
+ if (Context->Mode == BlRealMode)
+ {
+ /* Disable paging, enable interrupts */
+ Context->ContextFlags &= ~BL_CONTEXT_PAGING_ON;
+ Context->ContextFlags |= BL_CONTEXT_INTERRUPTS_ON;
+ }
+ else if (!(BlpApplicationFlags & BL_APPLICATION_FLAG_CONVERTED_FROM_EFI) ||
+ (BlpLibraryParameters.TranslationType != BlNone))
+ {
+ /* Read the current translation type */
+ Context->TranslationType = BlpLibraryParameters.TranslationType;
+
+ /* Disable paging (it's already on), enable interrupts */
+ Context->ContextFlags &= ~BL_CONTEXT_PAGING_ON;
+ Context->ContextFlags |= BL_CONTEXT_INTERRUPTS_ON;
+
+ /* Enable FXSR support in the FPU */
+ __writecr4(__readcr4() | CR4_FXSR);
+ }
+ else
+ {
+ /* Invalid context */
+ Status = STATUS_NOT_SUPPORTED;
+ }
+
+ /* Return context status */
+ return Status;
+}
+
+NTSTATUS
+ArchInitializeContexts (
+ VOID
+ )
+{
+ PBL_ARCH_CONTEXT Context = NULL;
+ NTSTATUS EfiStatus, AppStatus;
+
+ /* No current context */
+ CurrentExecutionContext = NULL;
+
+ /* Setup the EFI and Application modes respectively */
+ FirmwareExecutionContext.Mode = BlRealMode;
+ ApplicationExecutionContext.Mode = BlProtectedMode;
+
+ /* Initialize application mode */
+ AppStatus = ArchInitializeContext(&ApplicationExecutionContext);
+ if (NT_SUCCESS(AppStatus))
+ {
+ /* Set it as current if it worked */
+ Context = &ApplicationExecutionContext;
+ CurrentExecutionContext = &ApplicationExecutionContext;
+ }
+
+ /* Initialize EFI mode */
+ EfiStatus = ArchInitializeContext(&FirmwareExecutionContext);
+ if (NT_SUCCESS(EfiStatus))
+ {
+ /* Set it as current if application context failed */
+ if (!NT_SUCCESS(AppStatus))
+ {
+ Context = &FirmwareExecutionContext;
+ CurrentExecutionContext = &FirmwareExecutionContext;
+ }
+
+ /* Switch to application mode, or EFI if that one failed */
+ ArchSwitchContext(Context, NULL);
+ EfiStatus = STATUS_SUCCESS;
+ }
+
+ /* Return initialization state */
+ return EfiStatus;
+}
+
+VOID
+BlpArchSwitchContext (
+ _In_ BL_ARCH_MODE NewMode
+ )
+{
+ PBL_ARCH_CONTEXT Context;
+
+ /* In real mode, use EFI, otherwise, use the application mode */
+ Context = &FirmwareExecutionContext;
+ if (NewMode != BlProtectedMode) Context = &ApplicationExecutionContext;
+
+ /* Are we in a different mode? */
+ if (CurrentExecutionContext->Mode != NewMode)
+ {
+ /* Switch to the new one */
+ ArchSwitchContext(Context, CurrentExecutionContext);
+ CurrentExecutionContext = Context;
+ }
+}
+
+/*++
+* @name BlpArchInitialize
+*
+* The BlpArchInitialize function initializes the Boot Library.
+*
+* @param Phase
+* Pointer to the Boot Application Parameter Block.
+*
+* @return NT_SUCCESS if the boot library was loaded correctly, relevant error
+* otherwise.
+*
+*--*/
+NTSTATUS
+BlpArchInitialize (
+ _In_ ULONG Phase
+ )
+{
+ KDESCRIPTOR Idtr;
+ USHORT CodeSegment;
+ NTSTATUS Status;
+ PKIDTENTRY IdtBase;
+
+ /* Assume success */
+ Status = STATUS_SUCCESS;
+
+ /* Is this phase 1? */
+ if (Phase != 0)
+ {
+ /* Get the IDT */
+ __sidt(&Idtr);
+ IdtBase = (PKIDTENTRY)Idtr.Base;
+
+ /* Get the Code Segment */
+ // _asm { mov CodeSegment, cs } FIXME: GCC
+ CodeSegment = 8; // fix fix
+
+ /* Set up INT 3, ASSERT, and SECURITY_ASSERT to be no-op (for Rtl) */
+ IdtBase[3].Offset = (USHORT)(ULONG_PTR)ArchTrapNoProcess;
+ IdtBase[3].Selector = CodeSegment;
+ IdtBase[3].Access = 0x8E00u;
+ IdtBase[3].ExtendedOffset = (ULONG_PTR)ArchTrapNoProcess >> 16;
+ IdtBase[0x2C].Offset = (USHORT)(ULONG_PTR)ArchTrapNoProcess;
+ IdtBase[0x2C].Selector = CodeSegment;
+ IdtBase[0x2C].Access = 0x8E00u;
+ IdtBase[0x2C].ExtendedOffset = (ULONG_PTR)ArchTrapNoProcess >> 16;
+ IdtBase[0x2D].Offset = (USHORT)(ULONG_PTR)ArchTrapNoProcess;
+ IdtBase[0x2D].Selector = CodeSegment;
+ IdtBase[0x2D].Access = 0x8E00u;
+ IdtBase[0x2D].ExtendedOffset = (ULONG_PTR)ArchTrapNoProcess >> 16;
+
+ /* Write the IDT back */
+ Idtr.Base = (ULONG)IdtBase;
+ __lidt(&Idtr);
+
+ /* Reset FPU state */
+ // __asm { fninit } FIXME: GCC
+ }
+ else
+ {
+ /* Reset TSC if needed */
+ if ((__readmsr(0x10) >> 32) & 0xFFC00000)
+ {
+ __writemsr(0x10, 0);
+ }
+
+ /* Initialize all the contexts */
+ Status = ArchInitializeContexts();
+ }
+
+ /* Return initialization state */
+ return Status;
+}
+
Propchange: trunk/reactos/boot/environ/lib/arch/i386/arch.c
------------------------------------------------------------------------------
svn:eol-style = native
Modified: trunk/reactos/boot/environ/lib/bootlib.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/lib/bootlib.c…
==============================================================================
--- trunk/reactos/boot/environ/lib/bootlib.c [iso-8859-1] (original)
+++ trunk/reactos/boot/environ/lib/bootlib.c [iso-8859-1] Sat Sep 5 20:31:14 2015
@@ -1,10 +1,10 @@
/*
-* COPYRIGHT: See COPYING.ARM in the top level directory
-* PROJECT: ReactOS UEFI Boot Library
-* FILE: boot/environ/lib/bootlib.c
-* PURPOSE: Boot Library Initialization
-* PROGRAMMER: Alex Ionescu (alex.ionescu(a)reactos.org)
-*/
+ * COPYRIGHT: See COPYING.ARM in the top level directory
+ * PROJECT: ReactOS UEFI Boot Library
+ * FILE: boot/environ/lib/bootlib.c
+ * PURPOSE: Boot Library Initialization
+ * PROGRAMMER: Alex Ionescu (alex.ionescu(a)reactos.org)
+ */
/* INCLUDES ******************************************************************/
@@ -13,6 +13,14 @@
/* DATA VARIABLES ************************************************************/
BL_LIBRARY_PARAMETERS BlpLibraryParameters;
+PBL_DEVICE_DESCRIPTOR BlpBootDevice;
+PWCHAR BlpApplicationBaseDirectory;
+PBOOT_APPLICATION_PARAMETER_BLOCK BlpApplicationParameters;
+BL_APPLICATION_ENTRY BlpApplicationEntry;
+BOOLEAN BlpLibraryParametersInitialized;
+
+/* temp */
+BL_TRANSLATION_TYPE MmTranslationType;
/* FUNCTIONS *****************************************************************/
@@ -37,10 +45,66 @@
_In_ PBL_LIBRARY_PARAMETERS LibraryParameters
)
{
- DBG_UNREFERENCED_PARAMETER(BootAppParameters);
- DBG_UNREFERENCED_PARAMETER(LibraryParameters);
+ NTSTATUS Status;
+ //PBL_MEMORY_DATA MemoryData;
+ PBL_APPLICATION_ENTRY AppEntry;
+ PBL_FIRMWARE_DESCRIPTOR FirmwareDescriptor;
+ ULONG_PTR ParamPointer = (ULONG_PTR)BootAppParameters;
- return STATUS_NOT_IMPLEMENTED;
+ /* Validate correct Boot Application data */
+ if (!(BootAppParameters) ||
+ (BootAppParameters->Signature[0] != BOOT_APPLICATION_SIGNATURE_1) ||
+ (BootAppParameters->Signature[1] != BOOT_APPLICATION_SIGNATURE_2) ||
+ (BootAppParameters->Size < sizeof(*BootAppParameters)))
+ {
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ /* Get sub-structures */
+ //MemoryData = (PBL_MEMORY_DATA)(ParamPointer +
BootAppParameters->MemoryDataOffset);
+ FirmwareDescriptor = (PBL_FIRMWARE_DESCRIPTOR)(ParamPointer +
BootAppParameters->FirmwareParametersOffset);
+ AppEntry = (PBL_APPLICATION_ENTRY)(ParamPointer +
BootAppParameters->AppEntryOffset);
+ BlpBootDevice = (PBL_DEVICE_DESCRIPTOR)(ParamPointer +
BootAppParameters->BootDeviceOffset);
+ BlpApplicationBaseDirectory = LibraryParameters->ApplicationBaseDirectory;
+
+ /* Initialize the firmware table */
+ Status = BlpFwInitialize(0, FirmwareDescriptor);
+ if (!NT_SUCCESS(Status))
+ {
+ goto Quickie;
+ }
+
+ /* Find boot application entry */
+ if (strncmp(AppEntry->Signature, BL_APP_ENTRY_SIGNATURE, 7))
+ {
+ Status = STATUS_INVALID_PARAMETER_9;
+ }
+
+ /* Read parameters */
+ BlpApplicationParameters = BootAppParameters;
+ BlpLibraryParameters = *LibraryParameters;
+
+ /* Save the application entry */
+ if (AppEntry->Flags & 2)
+ {
+ AppEntry->Flags = (AppEntry->Flags & ~0x2) | 0x80;
+ }
+ BlpApplicationEntry = *AppEntry;
+
+ /* Everything has been captured */
+ BlpLibraryParametersInitialized = TRUE;
+
+ /* Initialize the architecture (PM or RM) switching */
+ Status = BlpArchInitialize(0);
+ if (!NT_SUCCESS(Status))
+ {
+ goto Quickie;
+ }
+
+ Status = STATUS_NOT_IMPLEMENTED;
+
+Quickie:
+ return Status;
}
/*++
Propchange: trunk/reactos/boot/environ/lib/firmware/efi/
------------------------------------------------------------------------------
--- bugtraq:logregex (added)
+++ bugtraq:logregex Sat Sep 5 20:31:14 2015
@@ -0,0 +1 @@
+((CORE|ROSTESTS|ROSAPPS)-\d+)(,? ?((CORE|ROSTESTS|ROSAPPS)-\d+))*(,? ?(and |or
)?((CORE|ROSTESTS|ROSAPPS)-\d+))?
Propchange: trunk/reactos/boot/environ/lib/firmware/efi/
------------------------------------------------------------------------------
bugtraq:message = See issue %BUGID% for more details.
Propchange: trunk/reactos/boot/environ/lib/firmware/efi/
------------------------------------------------------------------------------
bugtraq:url =
https://jira.reactos.org/browse/%BUGID%
Propchange: trunk/reactos/boot/environ/lib/firmware/efi/
------------------------------------------------------------------------------
tsvn:logminsize = 10
Added: trunk/reactos/boot/environ/lib/firmware/efi/firmware.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/boot/environ/lib/firmware/…
==============================================================================
--- trunk/reactos/boot/environ/lib/firmware/efi/firmware.c (added)
+++ trunk/reactos/boot/environ/lib/firmware/efi/firmware.c [iso-8859-1] Sat Sep 5
20:31:14 2015
@@ -0,0 +1,222 @@
+/*
+ * COPYRIGHT: See COPYING.ARM in the top level directory
+ * PROJECT: ReactOS UEFI Boot Library
+ * FILE: boot/environ/lib/firmware/efi/firmware.c
+ * PURPOSE: Boot Library Firmware Initialization for EFI
+ * PROGRAMMER: Alex Ionescu (alex.ionescu(a)reactos.org)
+ */
+
+/* INCLUDES ******************************************************************/
+
+#include "bl.h"
+
+/* DATA VARIABLES ************************************************************/
+
+GUID EfiSimpleTextInputExProtocol = EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL_GUID;
+
+PBL_FIRMWARE_DESCRIPTOR EfiFirmwareParameters;
+BL_FIRMWARE_DESCRIPTOR EfiFirmwareData;
+EFI_HANDLE EfiImageHandle;
+EFI_SYSTEM_TABLE* EfiSystemTable;
+
+EFI_SYSTEM_TABLE *EfiST;
+EFI_BOOT_SERVICES *EfiBS;
+EFI_RUNTIME_SERVICES *EfiRT;
+EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *EfiConOut;
+EFI_SIMPLE_TEXT_INPUT_PROTOCOL *EfiConIn;
+EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *EfiConInEx;
+
+/* FUNCTIONS *****************************************************************/
+
+NTSTATUS
+EfiOpenProtocol (
+ _In_ EFI_HANDLE Handle,
+ _In_ EFI_GUID *Protocol,
+ _Out_ PVOID* Interface
+ )
+{
+ EFI_STATUS EfiStatus;
+ NTSTATUS Status;
+ BL_ARCH_MODE OldMode;
+
+ /* Are we using virtual memory/ */
+ if (MmTranslationType != BlNone)
+ {
+ /* We need complex tracking to make this work */
+ //Status = EfiVmOpenProtocol(Handle, Protocol, Interface);
+ Status = STATUS_NOT_SUPPORTED;
+ }
+ else
+ {
+ /* Are we in protected mode? */
+ OldMode = CurrentExecutionContext->Mode;
+ if (OldMode != BlRealMode)
+ {
+ /* FIXME: Not yet implemented */
+ return STATUS_NOT_IMPLEMENTED;
+ }
+
+ /* Are we on legacy 1.02? */
+ if (EfiST->FirmwareRevision == EFI_1_02_SYSTEM_TABLE_REVISION)
+ {
+ /* Make the legacy call */
+ EfiStatus = EfiBS->HandleProtocol(Handle, Protocol, Interface);
+ }
+ else
+ {
+ /* Use the UEFI version */
+ EfiStatus = EfiBS->OpenProtocol(Handle,
+ Protocol,
+ Interface,
+ EfiImageHandle,
+ NULL,
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL);
+
+ /* Switch back to protected mode if we came from there */
+ if (OldMode != BlRealMode)
+ {
+ BlpArchSwitchContext(OldMode);
+ }
+ }
+
+ /* Convert the error to an NTSTATUS */
+ Status = EfiGetNtStatusCode(EfiStatus);
+ }
+
+ /* Clear the interface on failure, and return the status */
+ if (!NT_SUCCESS(Status))
+ {
+ *Interface = NULL;
+ }
+
+ return Status;
+}
+
+NTSTATUS
+EfiConInExSetState (
+ _In_ EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *ConInEx,
+ _In_ EFI_KEY_TOGGLE_STATE* KeyToggleState
+ )
+{
+ BL_ARCH_MODE OldMode;
+ EFI_STATUS EfiStatus;
+
+ /* Are we in protected mode? */
+ OldMode = CurrentExecutionContext->Mode;
+ if (OldMode != BlRealMode)
+ {
+ /* FIXME: Not yet implemented */
+ return STATUS_NOT_IMPLEMENTED;
+ }
+
+ /* Make the EFI call */
+ EfiStatus = ConInEx->SetState(ConInEx, KeyToggleState);
+
+ /* Switch back to protected mode if we came from there */
+ if (OldMode != BlRealMode)
+ {
+ BlpArchSwitchContext(OldMode);
+ }
+
+ /* Convert the error to an NTSTATUS */
+ return EfiGetNtStatusCode(EfiStatus);
+}
+
+NTSTATUS
+EfiSetWatchdogTimer (
+ VOID
+ )
+{
+ BL_ARCH_MODE OldMode;
+ EFI_STATUS EfiStatus;
+
+ /* Are we in protected mode? */
+ OldMode = CurrentExecutionContext->Mode;
+ if (OldMode != BlRealMode)
+ {
+ /* FIXME: Not yet implemented */
+ return STATUS_NOT_IMPLEMENTED;
+ }
+
+ /* Make the EFI call */
+ EfiStatus = EfiBS->SetWatchdogTimer(0, 0, 0, NULL);
+
+ /* Switch back to protected mode if we came from there */
+ if (OldMode != BlRealMode)
+ {
+ BlpArchSwitchContext(OldMode);
+ }
+
+ /* Convert the error to an NTSTATUS */
+ return EfiGetNtStatusCode(EfiStatus);
+}
+
+NTSTATUS
+BlpFwInitialize (
+ _In_ ULONG Phase,
+ _In_ PBL_FIRMWARE_DESCRIPTOR FirmwareData
+ )
+{
+ NTSTATUS Status = STATUS_SUCCESS;
+ EFI_KEY_TOGGLE_STATE KeyToggleState;
+
+ /* Check if we have vaild firmware data */
+ if (!(FirmwareData) || !(FirmwareData->Version))
+ {
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ /* Check which boot phase we're in */
+ if (Phase != 0)
+ {
+ /* Memory manager is ready, open the extended input protocol */
+ Status = EfiOpenProtocol(EfiST->ConsoleInHandle,
+ &EfiSimpleTextInputExProtocol,
+ (PVOID*)&EfiConInEx);
+ if (NT_SUCCESS(Status))
+ {
+ /* Set the initial key toggle state */
+ KeyToggleState = EFI_TOGGLE_STATE_VALID | 40;
+ EfiConInExSetState(EfiST->ConsoleInHandle, &KeyToggleState);
+ }
+
+ /* Setup the watchdog timer */
+ EfiSetWatchdogTimer();
+ }
+ else
+ {
+ /* Make a copy of the parameters */
+ EfiFirmwareParameters = &EfiFirmwareData;
+
+ /* Check which version we received */
+ if (FirmwareData->Version == 1)
+ {
+ /* FIXME: Not supported */
+ Status = STATUS_NOT_SUPPORTED;
+ }
+ else if (FirmwareData->Version >= 2)
+ {
+ /* Version 2 -- save the data */
+ EfiFirmwareData = *FirmwareData;
+ EfiSystemTable = FirmwareData->SystemTable;
+ EfiImageHandle = FirmwareData->ImageHandle;
+
+ /* Set the EDK-II style variables as well */
+ EfiST = EfiSystemTable;
+ EfiBS = EfiSystemTable->BootServices;
+ EfiRT = EfiSystemTable->RuntimeServices;
+ EfiConOut = EfiSystemTable->ConOut;
+ EfiConIn = EfiSystemTable->ConIn;
+ EfiConInEx = NULL;
+ }
+ else
+ {
+ /* Unknown version */
+ Status = STATUS_NOT_SUPPORTED;
+ }
+ }
+
+ /* Return the initialization state */
+ return Status;
+}
+
Propchange: trunk/reactos/boot/environ/lib/firmware/efi/firmware.c
------------------------------------------------------------------------------
svn:eol-style = native