From 878ddf1fc3540a715f63594ed22b6929e881afb4 Mon Sep 17 00:00:00 2001 From: bbahnsen Date: Fri, 21 Apr 2006 22:54:32 +0000 Subject: Initial import. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Dxe/WinNtThunk/Chipset/Metronome/Metronome.c | 129 +++++ .../Dxe/WinNtThunk/Chipset/Metronome/Metronome.dxs | 27 + .../Dxe/WinNtThunk/Chipset/Metronome/Metronome.h | 84 +++ .../Dxe/WinNtThunk/Chipset/Metronome/Metronome.mbd | 45 ++ .../Dxe/WinNtThunk/Chipset/Metronome/Metronome.msa | 61 +++ .../Dxe/WinNtThunk/Chipset/Metronome/build.xml | 47 ++ .../Chipset/RealTimeClock/RealTimeClock.c | 391 ++++++++++++++ .../Chipset/RealTimeClock/RealTimeClock.dxs | 27 + .../Chipset/RealTimeClock/RealTimeClock.mbd | 45 ++ .../Chipset/RealTimeClock/RealTimeClock.msa | 60 +++ .../Dxe/WinNtThunk/Chipset/RealTimeClock/build.xml | 47 ++ EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Reset/Reset.dxs | 27 + EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Reset/Reset.mbd | 45 ++ EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Reset/Reset.msa | 60 +++ EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Reset/build.xml | 47 ++ EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Reset/reset.c | 121 +++++ EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/Timer.c | 597 +++++++++++++++++++++ EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/Timer.dxs | 28 + EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/Timer.h | 162 ++++++ EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/Timer.mbd | 46 ++ EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/Timer.msa | 62 +++ EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/build.xml | 47 ++ 22 files changed, 2205 insertions(+) create mode 100644 EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Metronome/Metronome.c create mode 100644 EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Metronome/Metronome.dxs create mode 100644 EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Metronome/Metronome.h create mode 100644 EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Metronome/Metronome.mbd create mode 100644 EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Metronome/Metronome.msa create mode 100644 EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Metronome/build.xml create mode 100644 EdkNt32Pkg/Dxe/WinNtThunk/Chipset/RealTimeClock/RealTimeClock.c create mode 100644 EdkNt32Pkg/Dxe/WinNtThunk/Chipset/RealTimeClock/RealTimeClock.dxs create mode 100644 EdkNt32Pkg/Dxe/WinNtThunk/Chipset/RealTimeClock/RealTimeClock.mbd create mode 100644 EdkNt32Pkg/Dxe/WinNtThunk/Chipset/RealTimeClock/RealTimeClock.msa create mode 100644 EdkNt32Pkg/Dxe/WinNtThunk/Chipset/RealTimeClock/build.xml create mode 100644 EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Reset/Reset.dxs create mode 100644 EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Reset/Reset.mbd create mode 100644 EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Reset/Reset.msa create mode 100644 EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Reset/build.xml create mode 100644 EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Reset/reset.c create mode 100644 EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/Timer.c create mode 100644 EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/Timer.dxs create mode 100644 EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/Timer.h create mode 100644 EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/Timer.mbd create mode 100644 EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/Timer.msa create mode 100644 EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/build.xml (limited to 'EdkNt32Pkg/Dxe/WinNtThunk/Chipset') diff --git a/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Metronome/Metronome.c b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Metronome/Metronome.c new file mode 100644 index 0000000000..394ca6e717 --- /dev/null +++ b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Metronome/Metronome.c @@ -0,0 +1,129 @@ +/*++ + +Copyright (c) 2006, Intel Corporation +All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +Module Name: + + Metronome.c + +Abstract: + + NT Emulation Metronome Architectural Protocol Driver as defined in DXE CIS + +--*/ + +#include "Metronome.h" + +// +// Global Variables +// +EFI_METRONOME_ARCH_PROTOCOL mMetronome = { + WinNtMetronomeDriverWaitForTick, + TICK_PERIOD +}; + +// +// Worker Functions +// + +EFI_STATUS +EFIAPI +WinNtMetronomeDriverWaitForTick ( + IN EFI_METRONOME_ARCH_PROTOCOL *This, + IN UINT32 TickNumber + ) +/*++ + +Routine Description: + + The WaitForTick() function waits for the number of ticks specified by + TickNumber from a known time source in the platform. If TickNumber of + ticks are detected, then EFI_SUCCESS is returned. The actual time passed + between entry of this function and the first tick is between 0 and + TickPeriod 100 nS units. If you want to guarantee that at least TickPeriod + time has elapsed, wait for two ticks. This function waits for a hardware + event to determine when a tick occurs. It is possible for interrupt + processing, or exception processing to interrupt the execution of the + WaitForTick() function. Depending on the hardware source for the ticks, it + is possible for a tick to be missed. This function cannot guarantee that + ticks will not be missed. If a timeout occurs waiting for the specified + number of ticks, then EFI_TIMEOUT is returned. + +Arguments: + + This - The EFI_METRONOME_ARCH_PROTOCOL instance. + TickNumber - Number of ticks to wait. + +Returns: + + EFI_SUCCESS - The wait for the number of ticks specified by TickNumber + succeeded. + +--*/ +{ + UINT64 SleepTime; + + // + // Calculate the time to sleep. Win API smallest unit to sleep is 1 millisec + // Tick Period is in 100ns units, divide by 10000 to convert to ms + // + SleepTime = DivU64x32 (MultU64x32 ((UINT64) TickNumber, TICK_PERIOD) + 9999, 10000); + gWinNt->Sleep ((UINT32) SleepTime); + + return EFI_SUCCESS; +} + + +EFI_STATUS +EFIAPI +WinNtMetronomeDriverInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +/*++ + +Routine Description: + + Initialize the Metronome Architectural Protocol driver + +Arguments: + + ImageHandle - ImageHandle of the loaded driver + + + SystemTable - Pointer to the System Table + +Returns: + + EFI_SUCCESS - Metronome Architectural Protocol created + + EFI_OUT_OF_RESOURCES - Not enough resources available to initialize driver. + + EFI_DEVICE_ERROR - A device error occured attempting to initialize the driver. + +--*/ +{ + EFI_STATUS Status; + EFI_HANDLE Handle; + + + // + // Install the Metronome Architectural Protocol onto a new handle + // + Handle = NULL; + Status = gBS->InstallProtocolInterface ( + &Handle, + &gEfiMetronomeArchProtocolGuid, + EFI_NATIVE_INTERFACE, + &mMetronome + ); + + return Status; +} diff --git a/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Metronome/Metronome.dxs b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Metronome/Metronome.dxs new file mode 100644 index 0000000000..d11f48a5c9 --- /dev/null +++ b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Metronome/Metronome.dxs @@ -0,0 +1,27 @@ +/*++ + +Copyright (c) 2006, Intel Corporation +All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +Module Name: + + Metronome.dxs + +Abstract: + + Dependency expression source file. + +--*/ + +#include +#include + +DEPENDENCY_START + TRUE +DEPENDENCY_END diff --git a/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Metronome/Metronome.h b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Metronome/Metronome.h new file mode 100644 index 0000000000..d89a149a1c --- /dev/null +++ b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Metronome/Metronome.h @@ -0,0 +1,84 @@ +/*++ + +Copyright (c) 2006, Intel Corporation +All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +Module Name: + + Metronome.h + +Abstract: + + NT Emulation Metronome Architectural Protocol Driver as defined in DXE CIS + +--*/ + +#ifndef _NT_THUNK_METRONOME_H_ +#define _NT_THUNK_METRONOME_H_ + + + +// +// Period of on tick in 100 nanosecond units +// +#define TICK_PERIOD 2000 + +// +// Function Prototypes +// + +EFI_STATUS +EFIAPI +WinNtMetronomeDriverInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + ImageHandle - TODO: add argument description + SystemTable - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +EFI_STATUS +EFIAPI +WinNtMetronomeDriverWaitForTick ( + IN EFI_METRONOME_ARCH_PROTOCOL *This, + IN UINT32 TickNumber + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + This - TODO: add argument description + TickNumber - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +#endif diff --git a/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Metronome/Metronome.mbd b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Metronome/Metronome.mbd new file mode 100644 index 0000000000..f510b4250d --- /dev/null +++ b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Metronome/Metronome.mbd @@ -0,0 +1,45 @@ + + + + + Metronome + 154CAB4A-52B5-46CD-99C3-4368ABBACFFD + 0 + FIX ME! + Copyright (c) 2004-2006, Intel Corporation + + All rights reserved. This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + 2006-03-14 17:04 + 2006-03-19 15:17 + + + UefiBootServicesTableLib + DxeHobLib + BaseLib + UefiLib + UefiMemoryLib + UefiDriverEntryPoint + DxeReportStatusCodeLib + BaseDebugLibReportStatusCode + DxeWinNtLib + DxeMemoryAllocationLib + + + _ModuleEntryPoint + + diff --git a/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Metronome/Metronome.msa b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Metronome/Metronome.msa new file mode 100644 index 0000000000..0966e8294c --- /dev/null +++ b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Metronome/Metronome.msa @@ -0,0 +1,61 @@ + + + + + Metronome + DXE_DRIVER + BS_DRIVER + 154CAB4A-52B5-46CD-99C3-4368ABBACFFD + 0 + Component description file for Metronome module. + FIX ME! + Copyright (c) 2004-2006, Intel Corporation + + All rights reserved. This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + 0 + 2006-03-14 17:04 + 2006-03-19 15:17 + + + BaseLib + DebugLib + UefiLib + UefiDriverEntryPoint + WinNtLib + MemoryAllocationLib + UefiBootServicesTableLib + + + Metronome.c + Metronome.h + Metronome.dxs + + + MdePkg + EdkModulePkg + EdkNt32Pkg + + + Metronome + + + + WinNtMetronomeDriverInitialize + + + diff --git a/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Metronome/build.xml b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Metronome/build.xml new file mode 100644 index 0000000000..5922fac8f1 --- /dev/null +++ b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Metronome/build.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/RealTimeClock/RealTimeClock.c b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/RealTimeClock/RealTimeClock.c new file mode 100644 index 0000000000..b705ee6874 --- /dev/null +++ b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/RealTimeClock/RealTimeClock.c @@ -0,0 +1,391 @@ +/*++ + +Copyright (c) 2006, Intel Corporation +All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +Module Name: + + RealTimeClock.c + +Abstract: + + NT Emulation Architectural Protocol Driver as defined in Tiano + +--*/ + + + +BOOLEAN +DayValid ( + IN EFI_TIME *Time + ); + +BOOLEAN +IsLeapYear ( + IN EFI_TIME *Time + ); + +EFI_STATUS +RtcTimeFieldsValid ( + IN EFI_TIME *Time + ); + +EFI_STATUS +EFIAPI +InitializeRealTimeClock ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ); + +STATIC +EFI_STATUS +EFIAPI +WinNtGetTime ( + OUT EFI_TIME *Time, + OUT EFI_TIME_CAPABILITIES *Capabilities OPTIONAL + ) +/*++ + +Routine Description: + Service routine for RealTimeClockInstance->GetTime + +Arguments: + + Time - A pointer to storage that will receive a snapshot of the current time. + + Capabilities - A pointer to storage that will receive the capabilities of the real time clock + in the platform. This includes the real time clock's resolution and accuracy. + All reported device capabilities are rounded up. This is an OPTIONAL argument. + +Returns: + + EFI_SUCEESS - The underlying GetSystemTime call occurred and returned + Note that in the NT32 emulation, the GetSystemTime call has no return value + thus you will always receive a EFI_SUCCESS on this. + +--*/ +// TODO: EFI_INVALID_PARAMETER - add return value to function comment +{ + SYSTEMTIME SystemTime; + TIME_ZONE_INFORMATION TimeZone; + + // + // Check parameter for null pointer + // + if (Time == NULL) { + return EFI_INVALID_PARAMETER; + + } + + gWinNt->GetLocalTime (&SystemTime); + gWinNt->GetTimeZoneInformation (&TimeZone); + + Time->Year = (UINT16) SystemTime.wYear; + Time->Month = (UINT8) SystemTime.wMonth; + Time->Day = (UINT8) SystemTime.wDay; + Time->Hour = (UINT8) SystemTime.wHour; + Time->Minute = (UINT8) SystemTime.wMinute; + Time->Second = (UINT8) SystemTime.wSecond; + Time->Nanosecond = (UINT32) (SystemTime.wMilliseconds * 1000000); + Time->TimeZone = (INT16) TimeZone.Bias; + + if (Capabilities != NULL) { + Capabilities->Resolution = 1; + Capabilities->Accuracy = 50000000; + Capabilities->SetsToZero = FALSE; + } + + Time->Daylight = 0; + if (TimeZone.StandardDate.wMonth) { + Time->Daylight = EFI_TIME_ADJUST_DAYLIGHT; + } + + return EFI_SUCCESS; +} + +STATIC +EFI_STATUS +EFIAPI +WinNtSetTime ( + IN EFI_TIME *Time + ) +/*++ + +Routine Description: + Service routine for RealTimeClockInstance->SetTime + +Arguments: + + Time - A pointer to storage containing the time and date information to + program into the real time clock. + +Returns: + + EFI_SUCEESS - The operation completed successfully. + + EFI_INVALID_PARAMETER - One of the fields in Time is out of range. + + EFI_DEVICE_ERROR - The operation could not be complete due to a device error. + +--*/ +// TODO: EFI_SUCCESS - add return value to function comment +{ + TIME_ZONE_INFORMATION TimeZone; + EFI_STATUS Status; + SYSTEMTIME SystemTime; + BOOL Flag; + + if (Time == NULL) { + return EFI_INVALID_PARAMETER; + } + // + // Make sure that the time fields are valid + // + Status = RtcTimeFieldsValid (Time); + if (EFI_ERROR (Status)) { + return Status; + } + // + // Set Daylight savings time information and Time Zone + // + gWinNt->GetTimeZoneInformation (&TimeZone); + TimeZone.StandardDate.wMonth = Time->Daylight; + TimeZone.Bias = Time->TimeZone; + gWinNt->SetTimeZoneInformation (&TimeZone); + + SystemTime.wYear = Time->Year; + SystemTime.wMonth = Time->Month; + SystemTime.wDay = Time->Day; + SystemTime.wHour = Time->Hour; + SystemTime.wMinute = Time->Minute; + SystemTime.wSecond = Time->Second; + SystemTime.wMilliseconds = (INT16) (Time->Nanosecond / 1000000); + + Flag = gWinNt->SetLocalTime (&SystemTime); + + if (!Flag) { + return EFI_DEVICE_ERROR; + } else { + return EFI_SUCCESS; + } +} + +STATIC +EFI_STATUS +EFIAPI +WinNtGetWakeupTime ( + OUT BOOLEAN *Enabled, + OUT BOOLEAN *Pending, + OUT EFI_TIME *Time + ) +/*++ + +Routine Description: + Service routine for RealTimeClockInstance->GetWakeupTime + +Arguments: + This - Indicates the protocol instance structure. + + Enabled - Indicates if the alarm is currently enabled or disabled. + + Pending - Indicates if the alarm signal is pending and requires + acknowledgement. + + Time - The current alarm setting. + +Returns: + + EFI_SUCEESS - The operation completed successfully. + + EFI_DEVICE_ERROR - The operation could not be complete due to a device error. + + EFI_UNSUPPORTED - The operation is not supported on this platform. + +--*/ +{ + return EFI_UNSUPPORTED; +} + +STATIC +EFI_STATUS +EFIAPI +WinNtSetWakeupTime ( + IN BOOLEAN Enable, + OUT EFI_TIME *Time + ) +/*++ + +Routine Description: + Service routine for RealTimeClockInstance->SetWakeupTime + +Arguments: + + Enabled - Enable or disable the wakeup alarm. + + Time - If enable is TRUE, the time to set the wakup alarm for. + If enable is FALSE, then this parameter is optional, and + may be NULL. + +Returns: + + EFI_SUCEESS - The operation completed successfully. + + EFI_DEVICE_ERROR - The operation could not be complete due to a device error. + + EFI_INVALID_PARAMETER - A field in Time is out of range. + + EFI_UNSUPPORTED - The operation is not supported on this platform. + +--*/ +{ + return EFI_UNSUPPORTED; +} + +EFI_STATUS +EFIAPI +InitializeRealTimeClock ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +/*++ + +Routine Description: + Install Real Time Clock Protocol + +Arguments: + (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT) + +Returns: + + EFI_SUCEESS - Real Time Clock Services are installed into the Runtime Services Table + +--*/ +// TODO: ImageHandle - add argument and description to function comment +// TODO: SystemTable - add argument and description to function comment +{ + EFI_STATUS Status; + EFI_HANDLE Handle; + + + SystemTable->RuntimeServices->GetTime = WinNtGetTime; + SystemTable->RuntimeServices->SetTime = WinNtSetTime; + SystemTable->RuntimeServices->GetWakeupTime = WinNtGetWakeupTime; + SystemTable->RuntimeServices->SetWakeupTime = WinNtSetWakeupTime; + + Handle = NULL; + Status = gBS->InstallMultipleProtocolInterfaces ( + &Handle, + &gEfiRealTimeClockArchProtocolGuid, + NULL, + NULL + ); + return Status; +} + +EFI_STATUS +RtcTimeFieldsValid ( + IN EFI_TIME *Time + ) +/*++ + +Routine Description: + + Arguments: + + Returns: +--*/ +// TODO: Time - add argument and description to function comment +// TODO: EFI_INVALID_PARAMETER - add return value to function comment +// TODO: EFI_SUCCESS - add return value to function comment +{ + if (Time->Year < 1998 || + Time->Year > 2099 || + Time->Month < 1 || + Time->Month > 12 || + (!DayValid (Time)) || + Time->Hour > 23 || + Time->Minute > 59 || + Time->Second > 59 || + Time->Nanosecond > 999999999 || + (!(Time->TimeZone == EFI_UNSPECIFIED_TIMEZONE || (Time->TimeZone >= -1440 && Time->TimeZone <= 1440))) || + (Time->Daylight & (~(EFI_TIME_ADJUST_DAYLIGHT | EFI_TIME_IN_DAYLIGHT))) + ) { + return EFI_INVALID_PARAMETER; + } + + return EFI_SUCCESS; +} + +BOOLEAN +DayValid ( + IN EFI_TIME *Time + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + Time - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +{ + + INTN DayOfMonth[12] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + + if (Time->Day < 1 || + Time->Day > DayOfMonth[Time->Month - 1] || + (Time->Month == 2 && (!IsLeapYear (Time) && Time->Day > 28)) + ) { + return FALSE; + } + + return TRUE; +} + +BOOLEAN +IsLeapYear ( + IN EFI_TIME *Time + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + Time - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +{ + if (Time->Year % 4 == 0) { + if (Time->Year % 100 == 0) { + if (Time->Year % 400 == 0) { + return TRUE; + } else { + return FALSE; + } + } else { + return TRUE; + } + } else { + return FALSE; + } +} diff --git a/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/RealTimeClock/RealTimeClock.dxs b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/RealTimeClock/RealTimeClock.dxs new file mode 100644 index 0000000000..01f441c562 --- /dev/null +++ b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/RealTimeClock/RealTimeClock.dxs @@ -0,0 +1,27 @@ +/*++ + +Copyright (c) 2006, Intel Corporation +All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +Module Name: + + RealTimeClock.dxs + +Abstract: + + Dependency expression source file. + +--*/ + +#include +#include + +DEPENDENCY_START + TRUE +DEPENDENCY_END diff --git a/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/RealTimeClock/RealTimeClock.mbd b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/RealTimeClock/RealTimeClock.mbd new file mode 100644 index 0000000000..2eeac01ee9 --- /dev/null +++ b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/RealTimeClock/RealTimeClock.mbd @@ -0,0 +1,45 @@ + + + + + RealTimeClock + 27F05AF5-1644-4EF4-8944-48C4F75675A0 + 0 + FIX ME! + Copyright (c) 2004-2006, Intel Corporation + + All rights reserved. This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + 2006-03-14 17:04 + 2006-03-19 15:17 + + + UefiBootServicesTableLib + DxeHobLib + DxeWinNtLib + BaseLib + UefiLib + UefiMemoryLib + UefiDriverEntryPoint + DxeReportStatusCodeLib + BaseDebugLibReportStatusCode + DxeMemoryAllocationLib + + + _ModuleEntryPoint + + diff --git a/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/RealTimeClock/RealTimeClock.msa b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/RealTimeClock/RealTimeClock.msa new file mode 100644 index 0000000000..fd0761a7a0 --- /dev/null +++ b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/RealTimeClock/RealTimeClock.msa @@ -0,0 +1,60 @@ + + + + + RealTimeClock + DXE_DRIVER + BS_DRIVER + 27F05AF5-1644-4EF4-8944-48C4F75675A0 + 0 + Component description file for RealTimeClock module. + FIX ME! + Copyright (c) 2004-2006, Intel Corporation + + All rights reserved. This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + 0 + 2006-03-14 17:04 + 2006-03-19 15:17 + + + BaseLib + DebugLib + UefiLib + UefiDriverEntryPoint + WinNtLib + MemoryAllocationLib + UefiBootServicesTableLib + + + RealTimeClock.c + RealTimeClock.dxs + + + MdePkg + EdkModulePkg + EdkNt32Pkg + + + RealTimeClock + + + + InitializeRealTimeClock + + + diff --git a/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/RealTimeClock/build.xml b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/RealTimeClock/build.xml new file mode 100644 index 0000000000..b649e11eb5 --- /dev/null +++ b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/RealTimeClock/build.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Reset/Reset.dxs b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Reset/Reset.dxs new file mode 100644 index 0000000000..5dfb191aef --- /dev/null +++ b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Reset/Reset.dxs @@ -0,0 +1,27 @@ +/*++ + +Copyright (c) 2006, Intel Corporation +All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +Module Name: + + Reset.dxs + +Abstract: + + Dependency expression source file. + +--*/ + +#include +#include + +DEPENDENCY_START + TRUE +DEPENDENCY_END diff --git a/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Reset/Reset.mbd b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Reset/Reset.mbd new file mode 100644 index 0000000000..817bc4ed18 --- /dev/null +++ b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Reset/Reset.mbd @@ -0,0 +1,45 @@ + + + + + Reset + BA929954-35B0-4dd3-90CD-9634BD7E1CF1 + 0 + FIX ME! + Copyright (c) 2004-2006, Intel Corporation + + All rights reserved. This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + 2006-03-14 17:04 + 2006-03-19 15:17 + + + UefiBootServicesTableLib + DxeHobLib + BaseLib + UefiLib + UefiMemoryLib + UefiDriverEntryPoint + DxeReportStatusCodeLib + BaseDebugLibReportStatusCode + DxeWinNtLib + DxeMemoryAllocationLib + + + _ModuleEntryPoint + + diff --git a/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Reset/Reset.msa b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Reset/Reset.msa new file mode 100644 index 0000000000..8887df13d9 --- /dev/null +++ b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Reset/Reset.msa @@ -0,0 +1,60 @@ + + + + + Reset + DXE_DRIVER + BS_DRIVER + BA929954-35B0-4dd3-90CD-9634BD7E1CF1 + 0 + description of file contents + FIX ME! + Copyright (c) 2004-2006, Intel Corporation + + All rights reserved. This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + 0 + 2006-03-14 17:04 + 2006-03-19 15:17 + + + BaseLib + DebugLib + UefiLib + UefiDriverEntryPoint + WinNtLib + MemoryAllocationLib + UefiBootServicesTableLib + + + Reset.c + Reset.dxs + + + MdePkg + EdkModulePkg + EdkNt32Pkg + + + Reset + + + + InitializeNtReset + + + diff --git a/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Reset/build.xml b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Reset/build.xml new file mode 100644 index 0000000000..f924c6b261 --- /dev/null +++ b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Reset/build.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Reset/reset.c b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Reset/reset.c new file mode 100644 index 0000000000..d1b841de39 --- /dev/null +++ b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Reset/reset.c @@ -0,0 +1,121 @@ +/*++ + +Copyright (c) 2006, Intel Corporation +All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +Module Name: + + Reset.c + +Abstract: + + Reset Architectural Protocol as defined in Tiano under NT Emulation + +--*/ + + + +EFI_STATUS +EFIAPI +InitializeNtReset ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ); + +STATIC +EFI_STATUS +EFIAPI +WinNtResetSystem ( + IN EFI_RESET_TYPE ResetType, + IN EFI_STATUS ResetStatus, + IN UINTN DataSize, + IN CHAR16 *ResetData OPTIONAL + ); + + +EFI_STATUS +EFIAPI +InitializeNtReset ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +/*++ + +Routine Description: + + +Arguments: + + ImageHandle of the loaded driver + Pointer to the System Table + +Returns: + + Status +--*/ +// TODO: SystemTable - add argument and description to function comment +{ + EFI_STATUS Status; + EFI_HANDLE Handle; + + SystemTable->RuntimeServices->ResetSystem = WinNtResetSystem; + + Handle = NULL; + Status = gBS->InstallMultipleProtocolInterfaces ( + &Handle, + &gEfiResetArchProtocolGuid, + NULL, + NULL + ); + ASSERT_EFI_ERROR (Status); + + return Status; +} + +STATIC +EFI_STATUS +EFIAPI +WinNtResetSystem ( + IN EFI_RESET_TYPE ResetType, + IN EFI_STATUS ResetStatus, + IN UINTN DataSize, + IN CHAR16 *ResetData OPTIONAL + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + ResetType - TODO: add argument description + ResetStatus - TODO: add argument description + DataSize - TODO: add argument description + ResetData - TODO: add argument description + +Returns: + + EFI_SUCCESS - TODO: Add description for return value + +--*/ +{ + // + // BUGBUG Need to kill all console windows later + // + // + // Discard ResetType, always return 0 as exit code + // + gWinNt->ExitProcess (0); + + // + // Should never go here + // + return EFI_SUCCESS; +} diff --git a/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/Timer.c b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/Timer.c new file mode 100644 index 0000000000..18779a6b5e --- /dev/null +++ b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/Timer.c @@ -0,0 +1,597 @@ +/*++ + +Copyright (c) 2006, Intel Corporation +All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +Module Name: + + Timer.c + +Abstract: + + NT Emulation Timer Architectural Protocol Driver as defined in DXE CIS + + This Timer module uses an NT Thread to simulate the timer-tick driven + timer service. In the future, the Thread creation should possibly be + abstracted by the CPU architectural protocol + +--*/ + +#include "Timer.h" + +// +// Pointer to the CPU Architectural Protocol instance +// +EFI_CPU_ARCH_PROTOCOL *mCpu; + +// +// The Timer Architectural Protocol that this driver produces +// +EFI_TIMER_ARCH_PROTOCOL mTimer = { + WinNtTimerDriverRegisterHandler, + WinNtTimerDriverSetTimerPeriod, + WinNtTimerDriverGetTimerPeriod, + WinNtTimerDriverGenerateSoftInterrupt +}; + +// +// Define a global that we can use to shut down the NT timer thread when +// the timer is canceled. +// +BOOLEAN mCancelTimerThread = FALSE; + +// +// The notification function to call on every timer interrupt +// +EFI_TIMER_NOTIFY mTimerNotifyFunction = NULL; + +// +// The current period of the timer interrupt +// +UINT64 mTimerPeriod; + +// +// The thread handle for this driver +// +HANDLE mNtMainThreadHandle; + +// +// The timer value from the last timer interrupt +// +UINT32 mNtLastTick; + +// +// Critical section used to update varibles shared between the main thread and +// the timer interrupt thread. +// +CRITICAL_SECTION mNtCriticalSection; + +// +// Worker Functions +// +UINT mMMTimerThreadID = 0; + +VOID +CALLBACK +MMTimerThread ( + UINT wTimerID, + UINT msg, + DWORD dwUser, + DWORD dw1, + DWORD dw2 + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + wTimerID - TODO: add argument description + msg - TODO: add argument description + dwUser - TODO: add argument description + dw1 - TODO: add argument description + dw2 - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +{ + EFI_TPL OriginalTPL; + UINT32 CurrentTick; + UINT32 Delta; + EFI_TIMER_NOTIFY CallbackFunction; + BOOLEAN InterruptState; + + if (!mCancelTimerThread) { + + // + // Suspend the main thread until we are done + // + + gWinNt->SuspendThread (mNtMainThreadHandle); + + // + // If the timer thread is being canceled, then bail immediately. + // We check again here because there's a small window of time from when + // this thread was kicked off and when we suspended the main thread above. + // + if (mCancelTimerThread) { + gWinNt->ResumeThread (mNtMainThreadHandle); + gWinNt->timeKillEvent (wTimerID); + mMMTimerThreadID = 0; + return ; + } + + mCpu->GetInterruptState (mCpu, &InterruptState); + while (!InterruptState) { + // + // Resume the main thread + // + gWinNt->ResumeThread (mNtMainThreadHandle); + + // + // Wait for interrupts to be enabled. + // + mCpu->GetInterruptState (mCpu, &InterruptState); + while (!InterruptState) { + gWinNt->Sleep (0); + mCpu->GetInterruptState (mCpu, &InterruptState); + } + + // + // Suspend the main thread until we are done + // + gWinNt->SuspendThread (mNtMainThreadHandle); + mCpu->GetInterruptState (mCpu, &InterruptState); + } + + // + // Get the current system tick + // + CurrentTick = gWinNt->GetTickCount (); + Delta = CurrentTick - mNtLastTick; + mNtLastTick = CurrentTick; + + // + // If delay was more then 1 second, ignore it (probably debugging case) + // + if (Delta < 1000) { + + OriginalTPL = gBS->RaiseTPL (EFI_TPL_HIGH_LEVEL); + + // + // Inform the firmware of an "timer interrupt". The time + // expired since the last call is 10,000 times the number + // of ms. (or 100ns units) + // + gWinNt->EnterCriticalSection (&mNtCriticalSection); + CallbackFunction = mTimerNotifyFunction; + gWinNt->LeaveCriticalSection (&mNtCriticalSection); + + // + // Only invoke the callback function if a Non-NULL handler has been + // registered. Assume all other handlers are legal. + // + if (CallbackFunction != NULL) { + CallbackFunction ((UINT64) (Delta * 10000)); + } + + gBS->RestoreTPL (OriginalTPL); + + } + + // + // Resume the main thread + // + gWinNt->ResumeThread (mNtMainThreadHandle); + } else { + gWinNt->timeKillEvent (wTimerID); + mMMTimerThreadID = 0; + } + +} + +UINT +CreateNtTimer ( + VOID + ) +/*++ + +Routine Description: + + It is used to emulate a platform + timer-driver interrupt handler. + +Returns: + + Timer ID + +--*/ +// TODO: function comment is missing 'Arguments:' +{ + UINT32 SleepCount; + + // + // Set our thread priority higher than the "main" thread. + // + gWinNt->SetThreadPriority ( + gWinNt->GetCurrentThread (), + THREAD_PRIORITY_HIGHEST + ); + + // + // Calc the appropriate interval + // + gWinNt->EnterCriticalSection (&mNtCriticalSection); + SleepCount = (UINT32) (mTimerPeriod + 5000) / 10000; + gWinNt->LeaveCriticalSection (&mNtCriticalSection); + + return gWinNt->timeSetEvent ( + SleepCount, + 0, + MMTimerThread, + (DWORD_PTR) NULL, + TIME_PERIODIC | TIME_KILL_SYNCHRONOUS | TIME_CALLBACK_FUNCTION + ); + +} + +EFI_STATUS +EFIAPI +WinNtTimerDriverRegisterHandler ( + IN EFI_TIMER_ARCH_PROTOCOL *This, + IN EFI_TIMER_NOTIFY NotifyFunction + ) +/*++ + +Routine Description: + + This function registers the handler NotifyFunction so it is called every time + the timer interrupt fires. It also passes the amount of time since the last + handler call to the NotifyFunction. If NotifyFunction is NULL, then the + handler is unregistered. If the handler is registered, then EFI_SUCCESS is + returned. If the CPU does not support registering a timer interrupt handler, + then EFI_UNSUPPORTED is returned. If an attempt is made to register a handler + when a handler is already registered, then EFI_ALREADY_STARTED is returned. + If an attempt is made to unregister a handler when a handler is not registered, + then EFI_INVALID_PARAMETER is returned. If an error occurs attempting to + register the NotifyFunction with the timer interrupt, then EFI_DEVICE_ERROR + is returned. + +Arguments: + + This - The EFI_TIMER_ARCH_PROTOCOL instance. + + NotifyFunction - The function to call when a timer interrupt fires. This + function executes at TPL_HIGH_LEVEL. The DXE Core will + register a handler for the timer interrupt, so it can know + how much time has passed. This information is used to + signal timer based events. NULL will unregister the handler. + +Returns: + + EFI_SUCCESS - The timer handler was registered. + + EFI_UNSUPPORTED - The platform does not support timer interrupts. + + EFI_ALREADY_STARTED - NotifyFunction is not NULL, and a handler is already + registered. + + EFI_INVALID_PARAMETER - NotifyFunction is NULL, and a handler was not + previously registered. + + EFI_DEVICE_ERROR - The timer handler could not be registered. + +--*/ +{ + // + // Check for invalid parameters + // + if (NotifyFunction == NULL && mTimerNotifyFunction == NULL) { + return EFI_INVALID_PARAMETER; + } + + if (NotifyFunction != NULL && mTimerNotifyFunction != NULL) { + return EFI_ALREADY_STARTED; + } + + // + // Use Critical Section to update the notification function that is + // used from the timer interrupt thread. + // + gWinNt->EnterCriticalSection (&mNtCriticalSection); + + mTimerNotifyFunction = NotifyFunction; + + gWinNt->LeaveCriticalSection (&mNtCriticalSection); + + return EFI_SUCCESS; +} + +EFI_STATUS +EFIAPI +WinNtTimerDriverSetTimerPeriod ( + IN EFI_TIMER_ARCH_PROTOCOL *This, + IN UINT64 TimerPeriod + ) +/*++ + +Routine Description: + + This function adjusts the period of timer interrupts to the value specified + by TimerPeriod. If the timer period is updated, then the selected timer + period is stored in EFI_TIMER.TimerPeriod, and EFI_SUCCESS is returned. If + the timer hardware is not programmable, then EFI_UNSUPPORTED is returned. + If an error occurs while attempting to update the timer period, then the + timer hardware will be put back in its state prior to this call, and + EFI_DEVICE_ERROR is returned. If TimerPeriod is 0, then the timer interrupt + is disabled. This is not the same as disabling the CPU's interrupts. + Instead, it must either turn off the timer hardware, or it must adjust the + interrupt controller so that a CPU interrupt is not generated when the timer + interrupt fires. + +Arguments: + + This - The EFI_TIMER_ARCH_PROTOCOL instance. + + TimerPeriod - The rate to program the timer interrupt in 100 nS units. If + the timer hardware is not programmable, then EFI_UNSUPPORTED is + returned. If the timer is programmable, then the timer period + will be rounded up to the nearest timer period that is supported + by the timer hardware. If TimerPeriod is set to 0, then the + timer interrupts will be disabled. + +Returns: + + EFI_SUCCESS - The timer period was changed. + + EFI_UNSUPPORTED - The platform cannot change the period of the timer interrupt. + + EFI_DEVICE_ERROR - The timer period could not be changed due to a device error. + +--*/ +{ + + // + // If TimerPeriod is 0, then the timer thread should be canceled + // + if (TimerPeriod == 0) { + // + // Cancel the timer thread + // + gWinNt->EnterCriticalSection (&mNtCriticalSection); + + mCancelTimerThread = TRUE; + + gWinNt->LeaveCriticalSection (&mNtCriticalSection); + + // + // Wait for the timer thread to exit + // + + if (mMMTimerThreadID) { + gWinNt->timeKillEvent (mMMTimerThreadID); + } + + mMMTimerThreadID = 0; + + // + // Update the timer period + // + gWinNt->EnterCriticalSection (&mNtCriticalSection); + + mTimerPeriod = TimerPeriod; + + gWinNt->LeaveCriticalSection (&mNtCriticalSection); + + // + // NULL out the thread handle so it will be re-created if the timer is enabled again + // + + } else if ((TimerPeriod > TIMER_MINIMUM_VALUE) && (TimerPeriod < TIMER_MAXIMUM_VALUE)) { + // + // If the TimerPeriod is valid, then create and/or adjust the period of the timer thread + // + gWinNt->EnterCriticalSection (&mNtCriticalSection); + + mTimerPeriod = TimerPeriod; + + mCancelTimerThread = FALSE; + + gWinNt->LeaveCriticalSection (&mNtCriticalSection); + + // + // Get the starting tick location if we are just starting the timer thread + // + mNtLastTick = gWinNt->GetTickCount (); + + if (mMMTimerThreadID) { + gWinNt->timeKillEvent (mMMTimerThreadID); + } + + mMMTimerThreadID = 0; + + mMMTimerThreadID = CreateNtTimer (); + + } + + return EFI_SUCCESS; +} + +EFI_STATUS +EFIAPI +WinNtTimerDriverGetTimerPeriod ( + IN EFI_TIMER_ARCH_PROTOCOL *This, + OUT UINT64 *TimerPeriod + ) +/*++ + +Routine Description: + + This function retrieves the period of timer interrupts in 100 ns units, + returns that value in TimerPeriod, and returns EFI_SUCCESS. If TimerPeriod + is NULL, then EFI_INVALID_PARAMETER is returned. If a TimerPeriod of 0 is + returned, then the timer is currently disabled. + +Arguments: + + This - The EFI_TIMER_ARCH_PROTOCOL instance. + + TimerPeriod - A pointer to the timer period to retrieve in 100 ns units. If + 0 is returned, then the timer is currently disabled. + +Returns: + + EFI_SUCCESS - The timer period was returned in TimerPeriod. + + EFI_INVALID_PARAMETER - TimerPeriod is NULL. + +--*/ +{ + if (TimerPeriod == NULL) { + return EFI_INVALID_PARAMETER; + } + + *TimerPeriod = mTimerPeriod; + + return EFI_SUCCESS; +} + +EFI_STATUS +EFIAPI +WinNtTimerDriverGenerateSoftInterrupt ( + IN EFI_TIMER_ARCH_PROTOCOL *This + ) +/*++ + +Routine Description: + + This function generates a soft timer interrupt. If the platform does not support soft + timer interrupts, then EFI_UNSUPPORTED is returned. Otherwise, EFI_SUCCESS is returned. + If a handler has been registered through the EFI_TIMER_ARCH_PROTOCOL.RegisterHandler() + service, then a soft timer interrupt will be generated. If the timer interrupt is + enabled when this service is called, then the registered handler will be invoked. The + registered handler should not be able to distinguish a hardware-generated timer + interrupt from a software-generated timer interrupt. + +Arguments: + + This - The EFI_TIMER_ARCH_PROTOCOL instance. + +Returns: + + EFI_SUCCESS - The soft timer interrupt was generated. + + EFI_UNSUPPORTEDT - The platform does not support the generation of soft timer interrupts. + +--*/ +{ + return EFI_UNSUPPORTED; +} + + +EFI_STATUS +EFIAPI +WinNtTimerDriverInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +/*++ + +Routine Description: + + Initialize the Timer Architectural Protocol driver + +Arguments: + + ImageHandle - ImageHandle of the loaded driver + + SystemTable - Pointer to the System Table + +Returns: + + EFI_SUCCESS - Timer Architectural Protocol created + + EFI_OUT_OF_RESOURCES - Not enough resources available to initialize driver. + + EFI_DEVICE_ERROR - A device error occured attempting to initialize the driver. + +--*/ +{ + EFI_STATUS Status; + UINTN Result; + EFI_HANDLE Handle; + + // + // Make sure the Timer Architectural Protocol is not already installed in the system + // + ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiTimerArchProtocolGuid); + + // + // Get the CPU Architectural Protocol instance + // + Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, &mCpu); + ASSERT_EFI_ERROR (Status); + + // + // Get our handle so the timer tick thread can suspend + // + Result = gWinNt->DuplicateHandle ( + gWinNt->GetCurrentProcess (), + gWinNt->GetCurrentThread (), + gWinNt->GetCurrentProcess (), + &mNtMainThreadHandle, + 0, + FALSE, + DUPLICATE_SAME_ACCESS + ); + if (Result == 0) { + return EFI_DEVICE_ERROR; + } + + // + // Initialize Critical Section used to update variables shared between the main + // thread and the timer interrupt thread. + // + gWinNt->InitializeCriticalSection (&mNtCriticalSection); + + // + // Start the timer thread at the default timer period + // + Status = mTimer.SetTimerPeriod (&mTimer, DEFAULT_TIMER_TICK_DURATION); + if (EFI_ERROR (Status)) { + gWinNt->DeleteCriticalSection (&mNtCriticalSection); + return Status; + } + + // + // Install the Timer Architectural Protocol onto a new handle + // + Handle = NULL; + Status = gBS->InstallProtocolInterface ( + &Handle, + &gEfiTimerArchProtocolGuid, + EFI_NATIVE_INTERFACE, + &mTimer + ); + if (EFI_ERROR (Status)) { + // + // Cancel the timer + // + mTimer.SetTimerPeriod (&mTimer, 0); + gWinNt->DeleteCriticalSection (&mNtCriticalSection); + return Status; + } + + return EFI_SUCCESS; +} diff --git a/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/Timer.dxs b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/Timer.dxs new file mode 100644 index 0000000000..6e6638331b --- /dev/null +++ b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/Timer.dxs @@ -0,0 +1,28 @@ +/*++ + +Copyright (c) 2006, Intel Corporation +All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +Module Name: + + Timer.dxs + +Abstract: + + Dependency expression source file. + +--*/ + + +#include +#include + +DEPENDENCY_START + EFI_CPU_ARCH_PROTOCOL_GUID +DEPENDENCY_END diff --git a/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/Timer.h b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/Timer.h new file mode 100644 index 0000000000..218ece65a5 --- /dev/null +++ b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/Timer.h @@ -0,0 +1,162 @@ +/*++ + +Copyright (c) 2006, Intel Corporation +All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +Module Name: + + Timer.h + +Abstract: + + NT Emulation Architectural Protocol Driver as defined in Tiano. + This Timer module uses an NT Thread to simulate the timer-tick driven + timer service. + +--*/ + +#ifndef _TIMER_H_ +#define _TIMER_H_ + + + + +// +// Legal timer value range in 100 ns units +// +#define TIMER_MINIMUM_VALUE 0 +#define TIMER_MAXIMUM_VALUE (0x100000000 - 1) + +// +// Default timer value in 100 ns units (10 ms) +// +#define DEFAULT_TIMER_TICK_DURATION 100000 + +// +// Function Prototypes +// +EFI_STATUS +EFIAPI +WinNtTimerDriverInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + ImageHandle - TODO: add argument description + SystemTable - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +EFI_STATUS +EFIAPI +WinNtTimerDriverRegisterHandler ( + IN EFI_TIMER_ARCH_PROTOCOL *This, + IN EFI_TIMER_NOTIFY NotifyFunction + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + This - TODO: add argument description + NotifyFunction - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +EFI_STATUS +EFIAPI +WinNtTimerDriverSetTimerPeriod ( + IN EFI_TIMER_ARCH_PROTOCOL *This, + IN UINT64 TimerPeriod + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + This - TODO: add argument description + TimerPeriod - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +EFI_STATUS +EFIAPI +WinNtTimerDriverGetTimerPeriod ( + IN EFI_TIMER_ARCH_PROTOCOL *This, + OUT UINT64 *TimerPeriod + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + This - TODO: add argument description + TimerPeriod - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +EFI_STATUS +EFIAPI +WinNtTimerDriverGenerateSoftInterrupt ( + IN EFI_TIMER_ARCH_PROTOCOL *This + ) +/*++ + +Routine Description: + + TODO: Add function description + +Arguments: + + This - TODO: add argument description + +Returns: + + TODO: add return values + +--*/ +; + +#endif diff --git a/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/Timer.mbd b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/Timer.mbd new file mode 100644 index 0000000000..3b8602d4f2 --- /dev/null +++ b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/Timer.mbd @@ -0,0 +1,46 @@ + + + + + Timer + C3811036-710B-4E39-8CF1-0AF9BE3A8198 + 0 + FIX ME! + Copyright (c) 2004-2006, Intel Corporation + + All rights reserved. This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + 2006-03-14 17:04 + 2006-03-19 15:17 + + + UefiBootServicesTableLib + BaseDebugLibReportStatusCode + DxeHobLib + BaseLib + UefiLib + HiiLib + UefiMemoryLib + UefiDriverEntryPoint + DxeReportStatusCodeLib + DxeWinNtLib + DxeMemoryAllocationLib + + + _ModuleEntryPoint + + diff --git a/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/Timer.msa b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/Timer.msa new file mode 100644 index 0000000000..d89ddf7433 --- /dev/null +++ b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/Timer.msa @@ -0,0 +1,62 @@ + + + + + Timer + DXE_DRIVER + BS_DRIVER + C3811036-710B-4E39-8CF1-0AF9BE3A8198 + 0 + Component description file for Timer module. + FIX ME! + Copyright (c) 2004-2006, Intel Corporation + + All rights reserved. This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + + 0 + 2006-03-14 17:04 + 2006-03-19 15:17 + + + BaseLib + DebugLib + UefiLib + UefiDriverEntryPoint + WinNtLib + MemoryAllocationLib + UefiBootServicesTableLib + + + Timer.h + Timer.c + Timer.dxs + + + MdePkg + EdkModulePkg + EdkNt32Pkg + + + Timer + Cpu + + + + WinNtTimerDriverInitialize + + + diff --git a/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/build.xml b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/build.xml new file mode 100644 index 0000000000..fac1fa4061 --- /dev/null +++ b/EdkNt32Pkg/Dxe/WinNtThunk/Chipset/Timer/build.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file -- cgit v1.2.3