102 lines
1.4 KiB
C++
102 lines
1.4 KiB
C++
|
/*++
|
||
|
|
||
|
Copyright (c) 1999 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
efimisc.cxx
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include <pch.cxx>
|
||
|
|
||
|
// BUGBUG
|
||
|
// There doesn't seem to be any interlockedexchange compexchg or interlocked decrement/increment.
|
||
|
// so we define some here that work.
|
||
|
//
|
||
|
// Note that these won't work since they aren't really atomic, but my assumption is that
|
||
|
// EFI is a single threaded non-preemptive environment so this won't really matter.
|
||
|
|
||
|
LONG
|
||
|
InterlockedIncrement (
|
||
|
IN OUT LONG* Addend
|
||
|
)
|
||
|
{
|
||
|
*Addend = (*Addend)++;
|
||
|
return *Addend;
|
||
|
}
|
||
|
|
||
|
|
||
|
LONG
|
||
|
InterlockedDecrement (
|
||
|
IN OUT LONG* Addend
|
||
|
)
|
||
|
{
|
||
|
*Addend = (*Addend)--;
|
||
|
return *Addend;
|
||
|
}
|
||
|
|
||
|
LONG
|
||
|
InterlockedExchange (
|
||
|
IN OUT LONG* Target,
|
||
|
LONG Value
|
||
|
)
|
||
|
{
|
||
|
LONG temp;
|
||
|
|
||
|
temp = *Target;
|
||
|
(*Target) = Value;
|
||
|
return temp;
|
||
|
}
|
||
|
|
||
|
|
||
|
LONG
|
||
|
InterlockedCompareExchange (
|
||
|
IN OUT LONG* Destination,
|
||
|
IN LONG ExChange,
|
||
|
IN LONG Comperand
|
||
|
)
|
||
|
{
|
||
|
LONG temp = *Destination;
|
||
|
|
||
|
if (Comperand == *Destination) {
|
||
|
*Destination = ExChange;
|
||
|
}
|
||
|
|
||
|
return temp;
|
||
|
}
|
||
|
|
||
|
|
||
|
NTSTATUS
|
||
|
NtDelayExecution (
|
||
|
IN BOOLEAN Alertable,
|
||
|
IN PLARGE_INTEGER DelayInterval
|
||
|
)
|
||
|
{
|
||
|
BS->Stall(DelayInterval->LowPart);
|
||
|
|
||
|
return STATUS_SUCCESS;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
_chkstk()
|
||
|
{
|
||
|
};
|
||
|
|
||
|
void
|
||
|
_aNchkstk()
|
||
|
{
|
||
|
};
|
||
|
|
||
|
|
||
|
VOID
|
||
|
EfiWaitForKey()
|
||
|
{
|
||
|
EFI_INPUT_KEY Key;
|
||
|
|
||
|
WaitForSingleEvent (ST->ConIn->WaitForKey, 0);
|
||
|
// flush keyboard
|
||
|
ST->ConIn->ReadKeyStroke(ST->ConIn,&Key);
|
||
|
}
|
||
|
|