1 /** @file 2 Common header file for CPU Exception Handler Library. 3 4 Copyright (c) 2012 - 2016, 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 _CPU_EXCEPTION_COMMON_H_ 16 #define _CPU_EXCEPTION_COMMON_H_ 17 18 #include <Ppi/VectorHandoffInfo.h> 19 #include <Protocol/Cpu.h> 20 #include <Library/BaseLib.h> 21 #include <Library/SerialPortLib.h> 22 #include <Library/PrintLib.h> 23 #include <Library/LocalApicLib.h> 24 #include <Library/PeCoffGetEntryPointLib.h> 25 #include <Library/BaseMemoryLib.h> 26 #include <Library/SynchronizationLib.h> 27 28 #define CPU_EXCEPTION_NUM 32 29 #define CPU_INTERRUPT_NUM 256 30 #define HOOKAFTER_STUB_SIZE 16 31 32 #include "ArchInterruptDefs.h" 33 34 #define CPU_EXCEPTION_HANDLER_LIB_HOB_GUID \ 35 { \ 36 0xb21d9148, 0x9211, 0x4d8f, { 0xad, 0xd3, 0x66, 0xb1, 0x89, 0xc9, 0x2c, 0x83 } \ 37 } 38 39 // 40 // Record exception handler information 41 // 42 typedef struct { 43 UINTN ExceptionStart; 44 UINTN ExceptionStubHeaderSize; 45 UINTN HookAfterStubHeaderStart; 46 } EXCEPTION_HANDLER_TEMPLATE_MAP; 47 48 typedef struct { 49 UINTN IdtEntryCount; 50 SPIN_LOCK DisplayMessageSpinLock; 51 RESERVED_VECTORS_DATA *ReservedVectors; 52 EFI_CPU_INTERRUPT_HANDLER *ExternalInterruptHandler; 53 } EXCEPTION_HANDLER_DATA; 54 55 extern CONST UINT32 mErrorCodeFlag; 56 extern CONST UINTN mImageAlignSize; 57 extern CONST UINTN mDoFarReturnFlag; 58 59 /** 60 Return address map of exception handler template so that C code can generate 61 exception tables. 62 63 @param AddressMap Pointer to a buffer where the address map is returned. 64 **/ 65 VOID 66 EFIAPI 67 AsmGetTemplateAddressMap ( 68 OUT EXCEPTION_HANDLER_TEMPLATE_MAP *AddressMap 69 ); 70 71 /** 72 Return address map of exception handler template so that C code can generate 73 exception tables. 74 75 @param IdtEntry Pointer to IDT entry to be updated. 76 @param InterruptHandler IDT handler value. 77 78 **/ 79 VOID 80 ArchUpdateIdtEntry ( 81 IN IA32_IDT_GATE_DESCRIPTOR *IdtEntry, 82 IN UINTN InterruptHandler 83 ); 84 85 /** 86 Read IDT handler value from IDT entry. 87 88 @param IdtEntry Pointer to IDT entry to be read. 89 90 **/ 91 UINTN 92 ArchGetIdtHandler ( 93 IN IA32_IDT_GATE_DESCRIPTOR *IdtEntry 94 ); 95 96 /** 97 Prints a message to the serial port. 98 99 @param Format Format string for the message to print. 100 @param ... Variable argument list whose contents are accessed 101 based on the format string specified by Format. 102 103 **/ 104 VOID 105 EFIAPI 106 InternalPrintMessage ( 107 IN CONST CHAR8 *Format, 108 ... 109 ); 110 111 /** 112 Find and display image base address and return image base and its entry point. 113 114 @param CurrentEip Current instruction pointer. 115 @param EntryPoint Return module entry point if module header is found. 116 117 @return !0 Image base address. 118 @return 0 Image header cannot be found. 119 **/ 120 UINTN 121 FindModuleImageBase ( 122 IN UINTN CurrentEip, 123 OUT UINTN *EntryPoint 124 ); 125 126 /** 127 Display CPU information. 128 129 @param ExceptionType Exception type. 130 @param SystemContext Pointer to EFI_SYSTEM_CONTEXT. 131 **/ 132 VOID 133 DumpCpuContent ( 134 IN EFI_EXCEPTION_TYPE ExceptionType, 135 IN EFI_SYSTEM_CONTEXT SystemContext 136 ); 137 138 /** 139 Internal worker function to initialize exception handler. 140 141 @param[in] VectorInfo Pointer to reserved vector list. 142 @param[in, out] ExceptionHandlerData Pointer to exception handler data. 143 144 @retval EFI_SUCCESS CPU Exception Entries have been successfully initialized 145 with default exception handlers. 146 @retval EFI_INVALID_PARAMETER VectorInfo includes the invalid content if VectorInfo is not NULL. 147 @retval EFI_UNSUPPORTED This function is not supported. 148 149 **/ 150 EFI_STATUS 151 InitializeCpuExceptionHandlersWorker ( 152 IN EFI_VECTOR_HANDOFF_INFO *VectorInfo OPTIONAL, 153 IN OUT EXCEPTION_HANDLER_DATA *ExceptionHandlerData 154 ); 155 156 /** 157 Registers a function to be called from the processor interrupt handler. 158 159 @param[in] InterruptType Defines which interrupt or exception to hook. 160 @param[in] InterruptHandler A pointer to a function of type EFI_CPU_INTERRUPT_HANDLER that is called 161 when a processor interrupt occurs. If this parameter is NULL, then the handler 162 will be uninstalled 163 @param[in] ExceptionHandlerData Pointer to exception handler data. 164 165 @retval EFI_SUCCESS The handler for the processor interrupt was successfully installed or uninstalled. 166 @retval EFI_ALREADY_STARTED InterruptHandler is not NULL, and a handler for InterruptType was 167 previously installed. 168 @retval EFI_INVALID_PARAMETER InterruptHandler is NULL, and a handler for InterruptType was not 169 previously installed. 170 @retval EFI_UNSUPPORTED The interrupt specified by InterruptType is not supported, 171 or this function is not supported. 172 **/ 173 EFI_STATUS 174 RegisterCpuInterruptHandlerWorker ( 175 IN EFI_EXCEPTION_TYPE InterruptType, 176 IN EFI_CPU_INTERRUPT_HANDLER InterruptHandler, 177 IN EXCEPTION_HANDLER_DATA *ExceptionHandlerData 178 ); 179 180 /** 181 Internal worker function to update IDT entries accordling to vector attributes. 182 183 @param[in] IdtTable Pointer to IDT table. 184 @param[in] TemplateMap Pointer to a buffer where the address map is 185 returned. 186 @param[in] ExceptionHandlerData Pointer to exception handler data. 187 188 **/ 189 VOID 190 UpdateIdtTable ( 191 IN IA32_IDT_GATE_DESCRIPTOR *IdtTable, 192 IN EXCEPTION_HANDLER_TEMPLATE_MAP *TemplateMap, 193 IN EXCEPTION_HANDLER_DATA *ExceptionHandlerData 194 ); 195 196 /** 197 Save CPU exception context when handling EFI_VECTOR_HANDOFF_HOOK_AFTER case. 198 199 @param[in] ExceptionType Exception type. 200 @param[in] SystemContext Pointer to EFI_SYSTEM_CONTEXT. 201 @param[in] ExceptionHandlerData Pointer to exception handler data. 202 **/ 203 VOID 204 ArchSaveExceptionContext ( 205 IN UINTN ExceptionType, 206 IN EFI_SYSTEM_CONTEXT SystemContext, 207 IN EXCEPTION_HANDLER_DATA *ExceptionHandlerData 208 ); 209 210 /** 211 Restore CPU exception context when handling EFI_VECTOR_HANDOFF_HOOK_AFTER case. 212 213 @param[in] ExceptionType Exception type. 214 @param[in] SystemContext Pointer to EFI_SYSTEM_CONTEXT. 215 @param[in] ExceptionHandlerData Pointer to exception handler data. 216 **/ 217 VOID 218 ArchRestoreExceptionContext ( 219 IN UINTN ExceptionType, 220 IN EFI_SYSTEM_CONTEXT SystemContext, 221 IN EXCEPTION_HANDLER_DATA *ExceptionHandlerData 222 ); 223 224 /** 225 Fix up the vector number and function address in the vector code. 226 227 @param[in] NewVectorAddr New vector handler address. 228 @param[in] VectorNum Index of vector. 229 @param[in] OldVectorAddr Old vector handler address. 230 231 **/ 232 VOID 233 EFIAPI 234 AsmVectorNumFixup ( 235 IN VOID *NewVectorAddr, 236 IN UINT8 VectorNum, 237 IN VOID *OldVectorAddr 238 ); 239 240 /** 241 Read and save reserved vector information 242 243 @param[in] VectorInfo Pointer to reserved vector list. 244 @param[out] ReservedVector Pointer to reserved vector data buffer. 245 @param[in] VectorCount Vector number to be updated. 246 247 @return EFI_SUCCESS Read and save vector info successfully. 248 @retval EFI_INVALID_PARAMETER VectorInfo includes the invalid content if VectorInfo is not NULL. 249 250 **/ 251 EFI_STATUS 252 ReadAndVerifyVectorInfo ( 253 IN EFI_VECTOR_HANDOFF_INFO *VectorInfo, 254 OUT RESERVED_VECTORS_DATA *ReservedVector, 255 IN UINTN VectorCount 256 ); 257 258 /** 259 Get ASCII format string exception name by exception type. 260 261 @param ExceptionType Exception type. 262 263 @return ASCII format string exception name. 264 **/ 265 CONST CHAR8 * 266 GetExceptionNameStr ( 267 IN EFI_EXCEPTION_TYPE ExceptionType 268 ); 269 270 /** 271 Internal worker function for common exception handler. 272 273 @param ExceptionType Exception type. 274 @param SystemContext Pointer to EFI_SYSTEM_CONTEXT. 275 @param ExceptionHandlerData Pointer to exception handler data. 276 **/ 277 VOID 278 CommonExceptionHandlerWorker ( 279 IN EFI_EXCEPTION_TYPE ExceptionType, 280 IN EFI_SYSTEM_CONTEXT SystemContext, 281 IN EXCEPTION_HANDLER_DATA *ExceptionHandlerData 282 ); 283 284 #endif 285 286