/** @file
DpcDxe.h -- Header for DpcDxe
Copyright (c) HR650X BIOS Decompilation Project
**/
#ifndef __DPCDXE_H__
#define __DPCDXE_H__
#include "../uefi_headers/Uefi.h"
//
// Function Prototypes
//
EFI_STATUS
EFIAPI
DpcInternalIsListValid(
VOID
);
EFI_STATUS
EFIAPI
DpcInternalIsListEmpty(
VOID
);
EFI_STATUS
EFIAPI
DpcGetDebugOutputProtocol(
VOID
);
EFI_STATUS
EFIAPI
DpcDebugAssert(
VOID
);
EFI_STATUS
EFIAPI
DpcReportAssertError(
VOID
);
EFI_STATUS
EFIAPI
DpcReadUnaligned64(
VOID
);
EFI_STATUS
EFIAPI
DpcCompareGuid(
VOID
);
EFI_STATUS
EFIAPI
DpcHobInit(
VOID
);
EFI_STATUS
EFIAPI
DpcQueueDpc(
VOID
);
EFI_STATUS
EFIAPI
DpcDispatchDpc(
VOID
);
EFI_STATUS
EFIAPI
DpcDriverEntry(
VOID
);
EFI_STATUS
EFIAPI
ModuleEntryPoint(
VOID
);
EFI_STATUS
EFIAPI
data(
VOID
);
/// EFI_DPC_PROTOCOL
EFI_STATUS
EFIAPI
interface instance(
VOID
);
EFI_STATUS
EFIAPI
gDpcProtocolInterface;(
VOID
);
EFI_STATUS
EFIAPI
of the free DPC_ENTRY pool (at 0x1140)(
VOID
);
EFI_STATUS
EFIAPI
gDpcFreeListHead;(
VOID
);
/// one LIST_ENTRY per priority level (0..31)
EFI_STATUS
EFIAPI
queue heads(
VOID
);
EFI_STATUS
EFIAPI
at 0x11C0 .. 0x13AF (32 entries * 16 bytes each)(
VOID
);
EFI_STATUS
EFIAPI
gDpcQueue[DPC_NUM_QUEUES];(
VOID
);
EFI_STATUS
EFIAPI
(at 0x1160, 0x1170)(
VOID
);
EFI_STATUS
EFIAPI
gDpcQueueDepth = 0;(
VOID
);
EFI_STATUS
EFIAPI
registration handle (at 0x1168)(
VOID
);
EFI_STATUS
EFIAPI
gDpcProtocolHandle = NULL;(
VOID
);
EFI_STATUS
EFIAPI
output protocol (at 0x1198)(
VOID
);
EFI_STATUS
EFIAPI
*gDpcDebugProtocol = NULL;(
VOID
);
EFI_STATUS
EFIAPI
list pointer (at 0x11A0)(
VOID
);
EFI_STATUS
EFIAPI
*gDpcHobList = NULL;(
VOID
);
EFI_STATUS
EFIAPI
management(
VOID
);
EFI_STATUS
EFIAPI
output support(
VOID
);
/// check error reporting level.
EFI_STATUS
EFIAPI
CMOS status(
VOID
);
EFI_STATUS
EFIAPI
0x70 index, port 0x71 data.(
VOID
);
EFI_STATUS
EFIAPI
= __inbyte (0x70);(
VOID
);
EFI_STATUS
EFIAPI
CMOS value to EFI error severity.(
VOID
);
EFI_STATUS
EFIAPI
(CmosValue == 1) {(
VOID
);
EFI_STATUS
EFIAPI
} else {(
VOID
);
EFI_STATUS
EFIAPI
}(
VOID
);
EFI_STATUS
EFIAPI
comparison and HOB list initialization(
VOID
);
EFI_STATUS
EFIAPI
DpcToken (must be in range 4..0x1F).(
VOID
);
EFI_STATUS
EFIAPI
((DpcToken < 4) || (DpcToken > 0x1F)) {(
VOID
);
EFI_STATUS
EFIAPI
TPL to serialize access to the DPC free list and queues.(
VOID
);
EFI_STATUS
EFIAPI
= gBS->RaiseTPL (TPL_DPC_PROCESSING);(
VOID
);
EFI_STATUS
EFIAPI
if the free list has an entry.(
VOID
);
EFI_STATUS
EFIAPI
(DpcInternalIsListEmpty (&gDpcFreeListHead)) {(
VOID
);
/// try to allocate more entries.
EFI_STATUS
EFIAPI
list is empty(
VOID
);
EFI_STATUS
EFIAPI
(Tpl <= 16) {(
VOID
);
EFI_STATUS
EFIAPI
is high but still low enough for AllocatePool.(
VOID
);
EFI_STATUS
EFIAPI
up to DPC_ALLOCATE_BATCH (64) times, dropping and(
VOID
);
EFI_STATUS
EFIAPI
TPL each iteration.(
VOID
);
EFI_STATUS
EFIAPI
(RetryCount = 0; RetryCount < DPC_ALLOCATE_BATCH; RetryCount++) {(
VOID
);
EFI_STATUS
EFIAPI
TPL so AllocatePool can work.(
VOID
);
EFI_STATUS
EFIAPI
a new DPC entry.(
VOID
);
EFI_STATUS
EFIAPI
= DpcAllocatePool ();(
VOID
);
EFI_STATUS
EFIAPI
TPL back.(
VOID
);
EFI_STATUS
EFIAPI
again if free list is still empty (another thread(
VOID
);
EFI_STATUS
EFIAPI
have freed entries while TPL was lowered).(
VOID
);
/// add this entry to it.
EFI_STATUS
EFIAPI
list is still empty(
VOID
);
EFI_STATUS
EFIAPI
(&gDpcFreeListHead, &Entry->List);(
VOID
);
EFI_STATUS
EFIAPI
the loop, check if we now have an entry.(
VOID
);
EFI_STATUS
EFIAPI
is too high for pool allocation.(
VOID
);
EFI_STATUS
EFIAPI
= EFI_OUT_OF_RESOURCES;(
VOID
);
EFI_STATUS
EFIAPI
an entry from the free list.(
VOID
);
EFI_STATUS
EFIAPI
= BASE_CR (gDpcFreeListHead.ForwardLink, DPC_ENTRY, List);(
VOID
);
EFI_STATUS
EFIAPI
the DPC entry.(
VOID
);
EFI_STATUS
EFIAPI
to the correct priority-level list.(
VOID
);
EFI_STATUS
EFIAPI
(&gDpcQueue[DpcToken], &Entry->List);(
VOID
);
EFI_STATUS
EFIAPI
statistics.(
VOID
);
EFI_STATUS
EFIAPI
TPL to DPC_PROCESSING to serialize.(
VOID
);
EFI_STATUS
EFIAPI
priorities from the raised TPL (31) downwards.(
VOID
);
EFI_STATUS
EFIAPI
(Priority <= 31) {(
VOID
);
EFI_STATUS
EFIAPI
this priority queue has entries, drain it.(
VOID
);
EFI_STATUS
EFIAPI
(!DpcInternalIsListEmpty (&gDpcQueue[Priority])) {(
VOID
);
EFI_STATUS
EFIAPI
the first entry from the queue.(
VOID
);
EFI_STATUS
EFIAPI
= BASE_CR (gDpcQueue[Priority].ForwardLink(
VOID
);
EFI_STATUS
EFIAPI
the queue depth counter.(
VOID
);
EFI_STATUS
EFIAPI
TPL to the priority level so the callback(
VOID
);
EFI_STATUS
EFIAPI
execute at its intended TPL.(
VOID
);
EFI_STATUS
EFIAPI
the deferred procedure.(
VOID
);
EFI_STATUS
EFIAPI
TPL back, and return the entry to the free list.(
VOID
);
EFI_STATUS
EFIAPI
to the next lower priority level.(
VOID
);
EFI_STATUS
EFIAPI
(Priority == 0) {(
VOID
);
EFI_STATUS
EFIAPI
initialization(
VOID
);
EFI_STATUS
EFIAPI
if DPC protocol is already installed.(
VOID
);
EFI_STATUS
EFIAPI
= gBS->LocateProtocol ((
VOID
);
/// this is a bug in the calling driver.
EFI_STATUS
EFIAPI
already registered(
VOID
);
EFI_STATUS
EFIAPI
((
VOID
);
EFI_STATUS
EFIAPI
all 32 DPC queue heads.(
VOID
);
EFI_STATUS
EFIAPI
(QueueIndex = 0; QueueIndex < DPC_NUM_QUEUES; QueueIndex++) {(
VOID
);
EFI_STATUS
EFIAPI
the DPC protocol.(
VOID
);
EFI_STATUS
EFIAPI
= gBS->InstallProtocolInterface ((
VOID
);
EFI_STATUS
EFIAPI
UEFI globals.(
VOID
);
EFI_STATUS
EFIAPI
= ImageHandle;(
VOID
);
EFI_STATUS
EFIAPI
HOB list for DXE phase services.(
VOID
);
EFI_STATUS
EFIAPI
();(
VOID
);
EFI_STATUS
EFIAPI
DpcDriverEntry (ImageHandle, SystemTable);(
VOID
);
#endif /* __DPCDXE_H__ */