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