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