]> git.proxmox.com Git - mirror_edk2.git/blame - EmulatorPkg/Library/ThunkProtocolList/ThunkProtocolList.c
EmulatorPkg: Add -D DISABLE_NEW_DEPRECATED_INTERFACES
[mirror_edk2.git] / EmulatorPkg / Library / ThunkProtocolList / ThunkProtocolList.c
CommitLineData
949f388f 1/** @file\r
2 Emulator Thunk to abstract OS services from pure EFI code\r
3\r
4 Copyright (c) 2008 - 2011, Apple Inc. All rights reserved.<BR>\r
9e3ab94d 5 Copyright (c) 2011 - 2019, Intel Corporation. All rights reserved.<BR>\r
d18d8a1d 6\r
e3ba31da 7 SPDX-License-Identifier: BSD-2-Clause-Patent\r
949f388f 8\r
9**/\r
10\r
11#include <Uefi.h>\r
12#include <Library/BaseLib.h>\r
13#include <Library/BaseMemoryLib.h>\r
14#include <Library/DebugLib.h>\r
b8800fc5 15#include <Library/MemoryAllocationLib.h>\r
949f388f 16\r
17#include <Protocol/EmuIoThunk.h>\r
18\r
949f388f 19\r
20#define EMU_IO_THUNK_PROTOCOL_DATA_SIGNATURE SIGNATURE_32('E','m','u','T')\r
21\r
22typedef struct {\r
23 UINTN Signature;\r
24 EMU_IO_THUNK_PROTOCOL Data;\r
25 BOOLEAN EmuBusDriver;\r
26 LIST_ENTRY Link;\r
27} EMU_IO_THUNK_PROTOCOL_DATA;\r
28\r
29LIST_ENTRY mThunkList = INITIALIZE_LIST_HEAD_VARIABLE (mThunkList);\r
30\r
31\r
32EFI_STATUS\r
33EFIAPI\r
34AddThunkProtocol (\r
d18d8a1d 35 IN EMU_IO_THUNK_PROTOCOL *ThunkIo,\r
949f388f 36 IN CHAR16 *ConfigString,\r
37 IN BOOLEAN EmuBusDriver\r
38 )\r
39{\r
9e3ab94d 40 UINTN Size;\r
949f388f 41 CHAR16 *StartString;\r
42 CHAR16 *SubString;\r
43 UINTN Instance;\r
44 EMU_IO_THUNK_PROTOCOL_DATA *Private;\r
d18d8a1d 45\r
949f388f 46 if (ThunkIo == NULL) {\r
47 return EFI_INVALID_PARAMETER;\r
48 }\r
d18d8a1d 49\r
949f388f 50 Instance = 0;\r
9e3ab94d
MK
51 Size = StrSize (ConfigString);\r
52 StartString = AllocatePool (Size);\r
53 if (StartString == NULL) {\r
54 return EFI_OUT_OF_RESOURCES;\r
55 }\r
56 StrCpyS (StartString, Size / sizeof (CHAR16), ConfigString);\r
949f388f 57 while (*StartString != '\0') {\r
58\r
59 //\r
60 // Find the end of the sub string\r
61 //\r
62 SubString = StartString;\r
63 while (*SubString != '\0' && *SubString != '!') {\r
64 SubString++;\r
65 }\r
66\r
67 if (*SubString == '!') {\r
68 //\r
69 // Replace token with '\0' to make sub strings. If this is the end\r
70 // of the string SubString will already point to NULL.\r
71 //\r
72 *SubString = '\0';\r
73 SubString++;\r
74 }\r
75\r
b8800fc5 76 Private = AllocatePool (sizeof (EMU_IO_THUNK_PROTOCOL_DATA));\r
949f388f 77 if (Private == NULL) {\r
78 return EFI_OUT_OF_RESOURCES;\r
79 }\r
80 Private->Signature = EMU_IO_THUNK_PROTOCOL_DATA_SIGNATURE;\r
81 Private->EmuBusDriver = EmuBusDriver;\r
82\r
d18d8a1d 83 CopyMem (&Private->Data, ThunkIo, sizeof (EMU_IO_THUNK_PROTOCOL));\r
47c04c38 84 Private->Data.Instance = (UINT16)Instance++;\r
949f388f 85 Private->Data.ConfigString = StartString;\r
d18d8a1d 86\r
949f388f 87 InsertTailList (&mThunkList, &Private->Link);\r
88\r
89 //\r
90 // Parse Next sub string. This will point to '\0' if we are at the end.\r
91 //\r
92 StartString = SubString;\r
93 }\r
94\r
95 return EFI_SUCCESS;\r
96}\r
97\r
98\r
99EFI_STATUS\r
100EFIAPI\r
101GetNextThunkProtocol (\r
102 IN BOOLEAN EmuBusDriver,\r
103 OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL\r
104 )\r
105{\r
d18d8a1d 106 LIST_ENTRY *Link;\r
107 EMU_IO_THUNK_PROTOCOL_DATA *Private;\r
108\r
949f388f 109 if (mThunkList.ForwardLink == &mThunkList) {\r
110 // Skip parsing an empty list\r
111 return EFI_NOT_FOUND;\r
112 }\r
d18d8a1d 113\r
949f388f 114 for (Link = mThunkList.ForwardLink; Link != &mThunkList; Link = Link->ForwardLink) {\r
115 Private = CR (Link, EMU_IO_THUNK_PROTOCOL_DATA, Link, EMU_IO_THUNK_PROTOCOL_DATA_SIGNATURE);\r
116 if (EmuBusDriver & !Private->EmuBusDriver) {\r
117 continue;\r
118 } else if (*Instance == NULL) {\r
119 // Find 1st match in list\r
120 *Instance = &Private->Data;\r
121 return EFI_SUCCESS;\r
122 } else if (*Instance == &Private->Data) {\r
123 // Matched previous call so look for valid next entry\r
124 Link = Link->ForwardLink;\r
125 if (Link == &mThunkList) {\r
126 return EFI_NOT_FOUND;\r
127 }\r
128 Private = CR (Link, EMU_IO_THUNK_PROTOCOL_DATA, Link, EMU_IO_THUNK_PROTOCOL_DATA_SIGNATURE);\r
129 *Instance = &Private->Data;\r
130 return EFI_SUCCESS;\r
131 }\r
132 }\r
d18d8a1d 133\r
134\r
949f388f 135 return EFI_NOT_FOUND;\r
136}\r
137\r