]> git.proxmox.com Git - mirror_edk2.git/blob - EmulatorPkg/CpuRuntimeDxe/CpuDriver.h
EmulatorPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / EmulatorPkg / CpuRuntimeDxe / CpuDriver.h
1 /*++ @file
2
3 Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
4 Portions copyright (c) 2011, Apple Inc. All rights reserved.
5
6 SPDX-License-Identifier: BSD-2-Clause-Patent
7
8 **/
9
10 #ifndef _CPU_ARCHITECTURAL_PROTOCOL_DRIVER_H_
11 #define _CPU_ARCHITECTURAL_PROTOCOL_DRIVER_H_
12
13
14 #include <PiDxe.h>
15 #include <IndustryStandard/SmBios.h>
16
17 #include <Protocol/Cpu.h>
18 #include <Protocol/Smbios.h>
19 #include <Protocol/MpService.h>
20 #include <Protocol/EmuThread.h>
21 #include <Protocol/CpuIo2.h>
22
23 #include <Guid/IdleLoopEvent.h>
24
25 #include <Library/BaseLib.h>
26 #include <Library/DebugLib.h>
27 #include <Library/UefiDriverEntryPoint.h>
28 #include <Library/BaseMemoryLib.h>
29 #include <Library/MemoryAllocationLib.h>
30 #include <Library/UefiBootServicesTableLib.h>
31 #include <Library/EmuThunkLib.h>
32 #include <Library/UefiLib.h>
33 #include <Library/PcdLib.h>
34
35
36
37 //
38 // Internal Data Structures
39 //
40 #define CPU_ARCH_PROT_PRIVATE_SIGNATURE SIGNATURE_32 ('c', 'a', 'p', 'd')
41
42 typedef struct {
43 UINTN Signature;
44 EFI_HANDLE Handle;
45
46 EFI_CPU_ARCH_PROTOCOL Cpu;
47 EFI_CPU_IO2_PROTOCOL CpuIo;
48
49 //
50 // Local Data for CPU interface goes here
51 //
52 BOOLEAN InterruptState;
53
54 } CPU_ARCH_PROTOCOL_PRIVATE;
55
56 #define CPU_ARCH_PROTOCOL_PRIVATE_DATA_FROM_THIS(a) \
57 CR (a, \
58 CPU_ARCH_PROTOCOL_PRIVATE, \
59 Cpu, \
60 CPU_ARCH_PROT_PRIVATE_SIGNATURE \
61 )
62
63
64
65 typedef enum {
66 CPU_STATE_IDLE,
67 CPU_STATE_BLOCKED,
68 CPU_STATE_READY,
69 CPU_STATE_BUSY,
70 CPU_STATE_FINISHED
71 } PROCESSOR_STATE;
72
73
74 //
75 // Define Individual Processor Data block.
76 //
77 typedef struct {
78 EFI_PROCESSOR_INFORMATION Info;
79 EFI_AP_PROCEDURE Procedure;
80 VOID *Parameter;
81 VOID *StateLock;
82 VOID *ProcedureLock;
83 PROCESSOR_STATE State;
84 EFI_EVENT CheckThisAPEvent;
85 } PROCESSOR_DATA_BLOCK;
86
87
88 //
89 // Define MP data block which consumes individual processor block.
90 //
91 typedef struct {
92 UINTN NumberOfProcessors;
93 UINTN NumberOfEnabledProcessors;
94 EFI_EVENT CheckAllAPsEvent;
95 EFI_EVENT WaitEvent;
96 UINTN FinishCount;
97 UINTN StartCount;
98 EFI_AP_PROCEDURE Procedure;
99 VOID *ProcedureArgument;
100 BOOLEAN SingleThread;
101 UINTN StartedNumber;
102 PROCESSOR_DATA_BLOCK *ProcessorData;
103 UINTN Timeout;
104 UINTN *FailedList;
105 UINTN FailedListIndex;
106 BOOLEAN TimeoutActive;
107 } MP_SYSTEM_DATA;
108
109
110
111
112
113 EFI_STATUS
114 EFIAPI
115 CpuMemoryServiceRead (
116 IN EFI_CPU_IO2_PROTOCOL *This,
117 IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
118 IN UINT64 Address,
119 IN UINTN Count,
120 IN OUT VOID *Buffer
121 );
122
123 EFI_STATUS
124 EFIAPI
125 CpuMemoryServiceWrite (
126 IN EFI_CPU_IO2_PROTOCOL *This,
127 IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
128 IN UINT64 Address,
129 IN UINTN Count,
130 IN OUT VOID *Buffer
131 );
132
133 EFI_STATUS
134 EFIAPI
135 CpuIoServiceRead (
136 IN EFI_CPU_IO2_PROTOCOL *This,
137 IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
138 IN UINT64 UserAddress,
139 IN UINTN Count,
140 IN OUT VOID *UserBuffer
141 );
142
143 EFI_STATUS
144 EFIAPI
145 CpuIoServiceWrite (
146 IN EFI_CPU_IO2_PROTOCOL *This,
147 IN EFI_CPU_IO_PROTOCOL_WIDTH Width,
148 IN UINT64 UserAddress,
149 IN UINTN Count,
150 IN OUT VOID *UserBuffer
151 );
152
153 EFI_STATUS
154 EFIAPI
155 InitializeCpu (
156 IN EFI_HANDLE ImageHandle,
157 IN EFI_SYSTEM_TABLE *SystemTable
158 );
159
160 EFI_STATUS
161 EFIAPI
162 EmuFlushCpuDataCache (
163 IN EFI_CPU_ARCH_PROTOCOL *This,
164 IN EFI_PHYSICAL_ADDRESS Start,
165 IN UINT64 Length,
166 IN EFI_CPU_FLUSH_TYPE FlushType
167 );
168
169 EFI_STATUS
170 EFIAPI
171 EmuEnableInterrupt (
172 IN EFI_CPU_ARCH_PROTOCOL *This
173 );
174
175 EFI_STATUS
176 EFIAPI
177 EmuDisableInterrupt (
178 IN EFI_CPU_ARCH_PROTOCOL *This
179 );
180
181 EFI_STATUS
182 EFIAPI
183 EmuGetInterruptState (
184 IN EFI_CPU_ARCH_PROTOCOL *This,
185 OUT BOOLEAN *State
186 );
187
188 EFI_STATUS
189 EFIAPI
190 EmuInit (
191 IN EFI_CPU_ARCH_PROTOCOL *This,
192 IN EFI_CPU_INIT_TYPE InitType
193 );
194
195 EFI_STATUS
196 EFIAPI
197 EmuRegisterInterruptHandler (
198 IN EFI_CPU_ARCH_PROTOCOL *This,
199 IN EFI_EXCEPTION_TYPE InterruptType,
200 IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler
201 );
202
203 EFI_STATUS
204 EFIAPI
205 EmuGetTimerValue (
206 IN EFI_CPU_ARCH_PROTOCOL *This,
207 IN UINT32 TimerIndex,
208 OUT UINT64 *TimerValue,
209 OUT UINT64 *TimerPeriod OPTIONAL
210 );
211
212 EFI_STATUS
213 EFIAPI
214 EmuSetMemoryAttributes (
215 IN EFI_CPU_ARCH_PROTOCOL *This,
216 IN EFI_PHYSICAL_ADDRESS BaseAddress,
217 IN UINT64 Length,
218 IN UINT64 Attributes
219 );
220
221 EFI_STATUS
222 CpuMpServicesInit (
223 OUT UINTN *MaxCores
224 );
225
226 EFI_STATUS
227 EFIAPI
228 CpuMpServicesWhoAmI (
229 IN EFI_MP_SERVICES_PROTOCOL *This,
230 OUT UINTN *ProcessorNumber
231 );
232
233 extern EFI_MP_SERVICES_PROTOCOL mMpServicesTemplate;
234
235
236 #endif