1 /** @file
2   IPF specific types, macros, and definitions for Debug Support Driver.
3 
4 Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution.  The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9 
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12 
13 **/
14 
15 #ifndef _PLDEBUG_SUPPORT_H_
16 #define _PLDEBUG_SUPPORT_H_
17 
18 #include <Uefi.h>
19 
20 #include <Protocol/DebugSupport.h>
21 #include <Protocol/LoadedImage.h>
22 
23 #include <Library/DebugLib.h>
24 #include <Library/UefiDriverEntryPoint.h>
25 #include <Library/BaseMemoryLib.h>
26 #include <Library/MemoryAllocationLib.h>
27 #include <Library/UefiBootServicesTableLib.h>
28 
29 #define DISABLE_INTERRUPTS  0UL
30 
31 #define EFI_ISA IsaIpf
32 
33 typedef struct {
34   UINT64  Low;
35   UINT64  High;
36 } BUNDLE;
37 
38 typedef
39 VOID
40 (*CALLBACK_FUNC) (
41   );
42 
43 /**
44   IPF specific DebugSupport driver initialization.
45 
46   Must be public because it's referenced from DebugSupport.c
47 
48   @retval  EFI_SUCCESS     Always.
49 
50 **/
51 EFI_STATUS
52 PlInitializeDebugSupportDriver (
53   VOID
54   );
55 
56 /**
57   Unload handler that is called during UnloadImage() - deallocates pool memory
58   used by the driver.
59 
60   Must be public because it's referenced from DebugSuport.c
61 
62   @param  ImageHandle    The firmware allocated handle for the EFI image.
63 
64   @retval EFI_SUCCESS    Always.
65 
66 **/
67 EFI_STATUS
68 EFIAPI
69 PlUnloadDebugSupportDriver (
70   IN EFI_HANDLE                   ImageHandle
71   );
72 
73 /**
74   C callable function to obtain the current value of IVA.
75 
76   @return Current value of IVA.
77 
78 **/
79 VOID  *
80 GetIva (
81   VOID
82   );
83 
84 /**
85   C callable function that HookStub will be copied from it's loaded location into the IVT when
86   an IVT entry is hooked.
87 
88 **/
89 VOID
90 HookStub (
91   VOID
92   );
93 
94 /**
95   C callable function to chain an interrupt handler.
96 
97 **/
98 VOID
99 ChainHandler (
100   VOID
101   );
102 
103 /**
104   C callable function to unchain an interrupt handler.
105 
106 **/
107 VOID
108 UnchainHandler (
109   VOID
110   );
111 
112 /**
113   C callable function to enable/disable interrupts.
114 
115   @param  NewInterruptState   New Interrupt State.
116 
117   @return Previous state of psr.ic.
118 
119 **/
120 UINT64
121 ProgramInterruptFlags (
122   IN UINT64                       NewInterruptState
123   );
124 
125 /**
126   Flushes instruction cache for specified number of bytes.
127 
128   @param  StartAddress     Cache Start Address.
129   @param  SizeInBytes      Cache Size.
130 
131 **/
132 VOID
133 InstructionCacheFlush (
134   IN VOID    *StartAddress,
135   IN UINTN   SizeInBytes
136   );
137 
138 /**
139   Returns the maximum value that may be used for the ProcessorIndex parameter in
140   RegisterPeriodicCallback() and RegisterExceptionCallback().
141 
142   Hard coded to support only 1 processor for now.
143 
144   @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
145   @param  MaxProcessorIndex     Pointer to a caller-allocated UINTN in which the maximum supported
146                                 processor index is returned. Always 0 returned.
147 
148   @retval EFI_SUCCESS           Always returned with **MaxProcessorIndex set to 0.
149 
150 **/
151 EFI_STATUS
152 EFIAPI
153 GetMaximumProcessorIndex (
154   IN EFI_DEBUG_SUPPORT_PROTOCOL   *This,
155   OUT UINTN                       *MaxProcessorIndex
156   );
157 
158 /**
159   Registers a function to be called back periodically in interrupt context.
160 
161   @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
162   @param  ProcessorIndex        Specifies which processor the callback function applies to.
163   @param  PeriodicCallback      A pointer to a function of type PERIODIC_CALLBACK that is the main
164                                 periodic entry point of the debug agent.
165 
166   @retval EFI_SUCCESS           The function completed successfully.
167   @retval EFI_ALREADY_STARTED   Non-NULL PeriodicCallback parameter when a callback
168                                 function was previously registered.
169   @retval EFI_OUT_OF_RESOURCES  System has insufficient memory resources to register new callback
170                                 function.
171 **/
172 EFI_STATUS
173 EFIAPI
174 RegisterPeriodicCallback (
175   IN EFI_DEBUG_SUPPORT_PROTOCOL   *This,
176   IN UINTN                        ProcessorIndex,
177   IN EFI_PERIODIC_CALLBACK        PeriodicCallback
178   );
179 
180 /**
181   Registers a function to be called when a given processor exception occurs.
182 
183   This code executes in boot services context.
184 
185   @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
186   @param  ProcessorIndex        Specifies which processor the callback function applies to.
187   @param  ExceptionCallback     A pointer to a function of type EXCEPTION_CALLBACK that is called
188                                 when the processor exception specified by ExceptionType occurs.
189   @param  ExceptionType         Specifies which processor exception to hook.
190 
191   @retval EFI_SUCCESS           The function completed successfully.
192   @retval EFI_ALREADY_STARTED   Non-NULL PeriodicCallback parameter when a callback
193                                 function was previously registered.
194   @retval EFI_OUT_OF_RESOURCES  System has insufficient memory resources to register new callback
195                                 function.
196 **/
197 EFI_STATUS
198 EFIAPI
199 RegisterExceptionCallback (
200   IN EFI_DEBUG_SUPPORT_PROTOCOL   *This,
201   IN UINTN                        ProcessorIndex,
202   IN EFI_EXCEPTION_CALLBACK       ExceptionCallback,
203   IN EFI_EXCEPTION_TYPE           ExceptionType
204   );
205 
206 /**
207   Invalidates processor instruction cache for a memory range. Subsequent execution in this range
208   causes a fresh memory fetch to retrieve code to be executed.
209 
210   @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
211   @param  ProcessorIndex        Specifies which processor's instruction cache is to be invalidated.
212   @param  Start                 Specifies the physical base of the memory range to be invalidated.
213   @param  Length                Specifies the minimum number of bytes in the processor's instruction
214                                 cache to invalidate.
215 
216   @retval EFI_SUCCESS           Always returned.
217 
218 **/
219 EFI_STATUS
220 EFIAPI
221 InvalidateInstructionCache (
222   IN EFI_DEBUG_SUPPORT_PROTOCOL   *This,
223   IN UINTN                        ProcessorIndex,
224   IN VOID                         *Start,
225   IN UINTN                        Length
226   );
227 
228 /**
229   C routine that is called for all registered exceptions.  This is the main
230   exception dispatcher.
231 
232   Must be public because it's referenced from AsmFuncs.s.
233 
234   @param  ExceptionType        Specifies which processor exception.
235   @param  Context              System Context.
236 **/
237 VOID
238 CommonHandler (
239   IN EFI_EXCEPTION_TYPE ExceptionType,
240   IN EFI_SYSTEM_CONTEXT Context
241   );
242 
243 /**
244   This is the worker function that uninstalls and removes all handlers.
245 
246   @param  ExceptionType     Specifies which processor exception.
247   @param  NewBundles        New Boundles.
248   @param  NewCallback       A pointer to the new function to be registered.
249 
250   @retval EFI_ALEADY_STARTED Ivt already hooked.
251   @retval EFI_SUCCESS        Successfully uninstalled.
252 
253 **/
254 EFI_STATUS
255 ManageIvtEntryTable (
256   IN  EFI_EXCEPTION_TYPE    ExceptionType,
257   IN  BUNDLE                NewBundles[4],
258   IN  CALLBACK_FUNC         NewCallback
259   );
260 
261 /**
262   Saves original IVT contents and inserts a few new bundles which are fixed up
263   to store the ExceptionType and then call the common handler.
264 
265   @param  ExceptionType      Specifies which processor exception.
266   @param  NewBundles         New Boundles.
267   @param  NewCallback        A pointer to the new function to be hooked.
268 
269 **/
270 VOID
271 HookEntry (
272   IN  EFI_EXCEPTION_TYPE    ExceptionType,
273   IN  BUNDLE                NewBundles[4],
274   IN  CALLBACK_FUNC         NewCallback
275   );
276 
277 /**
278   Restores original IVT contents when unregistering a callback function.
279 
280   @param  ExceptionType     Specifies which processor exception.
281 
282 **/
283 VOID
284 UnhookEntry (
285   IN  EFI_EXCEPTION_TYPE    ExceptionType
286   );
287 
288 /**
289   Sets up cache flush and calls assembly function to chain external interrupt.
290 
291   Records new callback in IvtEntryTable.
292 
293   @param  NewCallback     A pointer to the interrupt handle.
294 
295 **/
296 VOID
297 ChainExternalInterrupt (
298   IN  CALLBACK_FUNC         NewCallback
299   );
300 
301 /**
302   Sets up cache flush and calls assembly function to restore external interrupt.
303   Removes registered callback from IvtEntryTable.
304 
305 **/
306 VOID
307 UnchainExternalInterrupt (
308   VOID
309   );
310 
311 /**
312   Given an integer number, return the physical address of the entry point in the IFT.
313 
314   @param  HandlerIndex       Index of the Handler
315   @param  EntryPoint         IFT Entrypoint
316 
317 **/
318 VOID
319 GetHandlerEntryPoint (
320   UINTN                     HandlerIndex,
321   VOID                      **EntryPoint
322   );
323 
324 #endif
325