]> git.proxmox.com Git - mirror_edk2.git/blame - EmulatorPkg/Library/ThunkProtocolList/ThunkProtocolList.c
EmulatorPkg: Replace BSD License with BSD+Patent License
[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
47c04c38 5 Copyright (c) 2011 - 2018, 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
40 CHAR16 *StartString;\r
41 CHAR16 *SubString;\r
42 UINTN Instance;\r
43 EMU_IO_THUNK_PROTOCOL_DATA *Private;\r
d18d8a1d 44\r
949f388f 45 if (ThunkIo == NULL) {\r
46 return EFI_INVALID_PARAMETER;\r
47 }\r
d18d8a1d 48\r
949f388f 49 Instance = 0;\r
b8800fc5 50 StartString = AllocatePool (StrSize (ConfigString));\r
949f388f 51 StrCpy (StartString, ConfigString);\r
52 while (*StartString != '\0') {\r
53\r
54 //\r
55 // Find the end of the sub string\r
56 //\r
57 SubString = StartString;\r
58 while (*SubString != '\0' && *SubString != '!') {\r
59 SubString++;\r
60 }\r
61\r
62 if (*SubString == '!') {\r
63 //\r
64 // Replace token with '\0' to make sub strings. If this is the end\r
65 // of the string SubString will already point to NULL.\r
66 //\r
67 *SubString = '\0';\r
68 SubString++;\r
69 }\r
70\r
b8800fc5 71 Private = AllocatePool (sizeof (EMU_IO_THUNK_PROTOCOL_DATA));\r
949f388f 72 if (Private == NULL) {\r
73 return EFI_OUT_OF_RESOURCES;\r
74 }\r
75 Private->Signature = EMU_IO_THUNK_PROTOCOL_DATA_SIGNATURE;\r
76 Private->EmuBusDriver = EmuBusDriver;\r
77\r
d18d8a1d 78 CopyMem (&Private->Data, ThunkIo, sizeof (EMU_IO_THUNK_PROTOCOL));\r
47c04c38 79 Private->Data.Instance = (UINT16)Instance++;\r
949f388f 80 Private->Data.ConfigString = StartString;\r
d18d8a1d 81\r
949f388f 82 InsertTailList (&mThunkList, &Private->Link);\r
83\r
84 //\r
85 // Parse Next sub string. This will point to '\0' if we are at the end.\r
86 //\r
87 StartString = SubString;\r
88 }\r
89\r
90 return EFI_SUCCESS;\r
91}\r
92\r
93\r
94EFI_STATUS\r
95EFIAPI\r
96GetNextThunkProtocol (\r
97 IN BOOLEAN EmuBusDriver,\r
98 OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL\r
99 )\r
100{\r
d18d8a1d 101 LIST_ENTRY *Link;\r
102 EMU_IO_THUNK_PROTOCOL_DATA *Private;\r
103\r
949f388f 104 if (mThunkList.ForwardLink == &mThunkList) {\r
105 // Skip parsing an empty list\r
106 return EFI_NOT_FOUND;\r
107 }\r
d18d8a1d 108\r
949f388f 109 for (Link = mThunkList.ForwardLink; Link != &mThunkList; Link = Link->ForwardLink) {\r
110 Private = CR (Link, EMU_IO_THUNK_PROTOCOL_DATA, Link, EMU_IO_THUNK_PROTOCOL_DATA_SIGNATURE);\r
111 if (EmuBusDriver & !Private->EmuBusDriver) {\r
112 continue;\r
113 } else if (*Instance == NULL) {\r
114 // Find 1st match in list\r
115 *Instance = &Private->Data;\r
116 return EFI_SUCCESS;\r
117 } else if (*Instance == &Private->Data) {\r
118 // Matched previous call so look for valid next entry\r
119 Link = Link->ForwardLink;\r
120 if (Link == &mThunkList) {\r
121 return EFI_NOT_FOUND;\r
122 }\r
123 Private = CR (Link, EMU_IO_THUNK_PROTOCOL_DATA, Link, EMU_IO_THUNK_PROTOCOL_DATA_SIGNATURE);\r
124 *Instance = &Private->Data;\r
125 return EFI_SUCCESS;\r
126 }\r
127 }\r
d18d8a1d 128\r
129\r
949f388f 130 return EFI_NOT_FOUND;\r
131}\r
132\r