2 Emulator Thunk to abstract OS services from pure EFI code
4 Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>
5 Copyright (c) 2011 - 2019, Intel Corporation. All rights reserved.<BR>
7 SPDX-License-Identifier: BSD-2-Clause-Patent
12 #include <Library/BaseLib.h>
13 #include <Library/BaseMemoryLib.h>
14 #include <Library/DebugLib.h>
15 #include <Library/MemoryAllocationLib.h>
17 #include <Protocol/EmuIoThunk.h>
20 #define EMU_IO_THUNK_PROTOCOL_DATA_SIGNATURE SIGNATURE_32('E','m','u','T')
24 EMU_IO_THUNK_PROTOCOL Data
;
27 } EMU_IO_THUNK_PROTOCOL_DATA
;
29 LIST_ENTRY mThunkList
= INITIALIZE_LIST_HEAD_VARIABLE (mThunkList
);
35 IN EMU_IO_THUNK_PROTOCOL
*ThunkIo
,
36 IN CHAR16
*ConfigString
,
37 IN BOOLEAN EmuBusDriver
44 EMU_IO_THUNK_PROTOCOL_DATA
*Private
;
46 if (ThunkIo
== NULL
) {
47 return EFI_INVALID_PARAMETER
;
51 Size
= StrSize (ConfigString
);
52 StartString
= AllocatePool (Size
);
53 if (StartString
== NULL
) {
54 return EFI_OUT_OF_RESOURCES
;
56 StrCpyS (StartString
, Size
/ sizeof (CHAR16
), ConfigString
);
57 while (*StartString
!= '\0') {
60 // Find the end of the sub string
62 SubString
= StartString
;
63 while (*SubString
!= '\0' && *SubString
!= '!') {
67 if (*SubString
== '!') {
69 // Replace token with '\0' to make sub strings. If this is the end
70 // of the string SubString will already point to NULL.
76 Private
= AllocatePool (sizeof (EMU_IO_THUNK_PROTOCOL_DATA
));
77 if (Private
== NULL
) {
78 return EFI_OUT_OF_RESOURCES
;
80 Private
->Signature
= EMU_IO_THUNK_PROTOCOL_DATA_SIGNATURE
;
81 Private
->EmuBusDriver
= EmuBusDriver
;
83 CopyMem (&Private
->Data
, ThunkIo
, sizeof (EMU_IO_THUNK_PROTOCOL
));
84 Private
->Data
.Instance
= (UINT16
)Instance
++;
85 Private
->Data
.ConfigString
= StartString
;
87 InsertTailList (&mThunkList
, &Private
->Link
);
90 // Parse Next sub string. This will point to '\0' if we are at the end.
92 StartString
= SubString
;
101 GetNextThunkProtocol (
102 IN BOOLEAN EmuBusDriver
,
103 OUT EMU_IO_THUNK_PROTOCOL
**Instance OPTIONAL
107 EMU_IO_THUNK_PROTOCOL_DATA
*Private
;
109 if (mThunkList
.ForwardLink
== &mThunkList
) {
110 // Skip parsing an empty list
111 return EFI_NOT_FOUND
;
114 for (Link
= mThunkList
.ForwardLink
; Link
!= &mThunkList
; Link
= Link
->ForwardLink
) {
115 Private
= CR (Link
, EMU_IO_THUNK_PROTOCOL_DATA
, Link
, EMU_IO_THUNK_PROTOCOL_DATA_SIGNATURE
);
116 if (EmuBusDriver
& !Private
->EmuBusDriver
) {
118 } else if (*Instance
== NULL
) {
119 // Find 1st match in list
120 *Instance
= &Private
->Data
;
122 } else if (*Instance
== &Private
->Data
) {
123 // Matched previous call so look for valid next entry
124 Link
= Link
->ForwardLink
;
125 if (Link
== &mThunkList
) {
126 return EFI_NOT_FOUND
;
128 Private
= CR (Link
, EMU_IO_THUNK_PROTOCOL_DATA
, Link
, EMU_IO_THUNK_PROTOCOL_DATA_SIGNATURE
);
129 *Instance
= &Private
->Data
;
135 return EFI_NOT_FOUND
;