]> git.proxmox.com Git - mirror_edk2.git/blame - InOsEmuPkg/Library/ThunkProtocolList/ThunkProtocolList.c
Clarify the requirements for the Destination parameter of UnicodeStrToAsciiStr.
[mirror_edk2.git] / InOsEmuPkg / 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
b8800fc5 5 Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
949f388f 6 \r
7 This program and the accompanying materials\r
8 are licensed and made available under the terms and conditions of the BSD License\r
9 which accompanies this distribution. The full text of the license may be found at\r
10 http://opensource.org/licenses/bsd-license.php\r
11\r
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
14\r
15**/\r
16\r
17#include <Uefi.h>\r
18#include <Library/BaseLib.h>\r
19#include <Library/BaseMemoryLib.h>\r
20#include <Library/DebugLib.h>\r
b8800fc5 21#include <Library/MemoryAllocationLib.h>\r
949f388f 22\r
23#include <Protocol/EmuIoThunk.h>\r
24\r
949f388f 25\r
26#define EMU_IO_THUNK_PROTOCOL_DATA_SIGNATURE SIGNATURE_32('E','m','u','T')\r
27\r
28typedef struct {\r
29 UINTN Signature;\r
30 EMU_IO_THUNK_PROTOCOL Data;\r
31 BOOLEAN EmuBusDriver;\r
32 LIST_ENTRY Link;\r
33} EMU_IO_THUNK_PROTOCOL_DATA;\r
34\r
35LIST_ENTRY mThunkList = INITIALIZE_LIST_HEAD_VARIABLE (mThunkList);\r
36\r
37\r
38EFI_STATUS\r
39EFIAPI\r
40AddThunkProtocol (\r
41 IN EMU_IO_THUNK_PROTOCOL *ThunkIo, \r
42 IN CHAR16 *ConfigString,\r
43 IN BOOLEAN EmuBusDriver\r
44 )\r
45{\r
46 CHAR16 *StartString;\r
47 CHAR16 *SubString;\r
48 UINTN Instance;\r
49 EMU_IO_THUNK_PROTOCOL_DATA *Private;\r
50 \r
51 if (ThunkIo == NULL) {\r
52 return EFI_INVALID_PARAMETER;\r
53 }\r
54 \r
55 Instance = 0;\r
b8800fc5 56 StartString = AllocatePool (StrSize (ConfigString));\r
949f388f 57 StrCpy (StartString, ConfigString);\r
58 while (*StartString != '\0') {\r
59\r
60 //\r
61 // Find the end of the sub string\r
62 //\r
63 SubString = StartString;\r
64 while (*SubString != '\0' && *SubString != '!') {\r
65 SubString++;\r
66 }\r
67\r
68 if (*SubString == '!') {\r
69 //\r
70 // Replace token with '\0' to make sub strings. If this is the end\r
71 // of the string SubString will already point to NULL.\r
72 //\r
73 *SubString = '\0';\r
74 SubString++;\r
75 }\r
76\r
b8800fc5 77 Private = AllocatePool (sizeof (EMU_IO_THUNK_PROTOCOL_DATA));\r
949f388f 78 if (Private == NULL) {\r
79 return EFI_OUT_OF_RESOURCES;\r
80 }\r
81 Private->Signature = EMU_IO_THUNK_PROTOCOL_DATA_SIGNATURE;\r
82 Private->EmuBusDriver = EmuBusDriver;\r
83\r
84 CopyMem (&Private->Data, ThunkIo, sizeof (EMU_IO_THUNK_PROTOCOL)); \r
85 Private->Data.Instance = Instance++;\r
86 Private->Data.ConfigString = StartString;\r
87 \r
88 InsertTailList (&mThunkList, &Private->Link);\r
89\r
90 //\r
91 // Parse Next sub string. This will point to '\0' if we are at the end.\r
92 //\r
93 StartString = SubString;\r
94 }\r
95\r
96 return EFI_SUCCESS;\r
97}\r
98\r
99\r
100EFI_STATUS\r
101EFIAPI\r
102GetNextThunkProtocol (\r
103 IN BOOLEAN EmuBusDriver,\r
104 OUT EMU_IO_THUNK_PROTOCOL **Instance OPTIONAL\r
105 )\r
106{\r
107 LIST_ENTRY *Link; \r
108 EMU_IO_THUNK_PROTOCOL_DATA *Private; \r
109 \r
110 if (mThunkList.ForwardLink == &mThunkList) {\r
111 // Skip parsing an empty list\r
112 return EFI_NOT_FOUND;\r
113 }\r
114 \r
115 for (Link = mThunkList.ForwardLink; Link != &mThunkList; Link = Link->ForwardLink) {\r
116 Private = CR (Link, EMU_IO_THUNK_PROTOCOL_DATA, Link, EMU_IO_THUNK_PROTOCOL_DATA_SIGNATURE);\r
117 if (EmuBusDriver & !Private->EmuBusDriver) {\r
118 continue;\r
119 } else if (*Instance == NULL) {\r
120 // Find 1st match in list\r
121 *Instance = &Private->Data;\r
122 return EFI_SUCCESS;\r
123 } else if (*Instance == &Private->Data) {\r
124 // Matched previous call so look for valid next entry\r
125 Link = Link->ForwardLink;\r
126 if (Link == &mThunkList) {\r
127 return EFI_NOT_FOUND;\r
128 }\r
129 Private = CR (Link, EMU_IO_THUNK_PROTOCOL_DATA, Link, EMU_IO_THUNK_PROTOCOL_DATA_SIGNATURE);\r
130 *Instance = &Private->Data;\r
131 return EFI_SUCCESS;\r
132 }\r
133 }\r
134 \r
135 \r
136 return EFI_NOT_FOUND;\r
137}\r
138\r