1*f439973dSWarner Losh /** @file 2*f439973dSWarner Losh DebugSupport protocol and supporting definitions as defined in the UEFI2.4 3*f439973dSWarner Losh specification. 4*f439973dSWarner Losh 5*f439973dSWarner Losh The DebugSupport protocol is used by source level debuggers to abstract the 6*f439973dSWarner Losh processor and handle context save and restore operations. 7*f439973dSWarner Losh 8*f439973dSWarner Losh Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR> 9*f439973dSWarner Losh Portions copyright (c) 2011 - 2013, ARM Ltd. All rights reserved.<BR> 10*f439973dSWarner Losh Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR> 11*f439973dSWarner Losh 12*f439973dSWarner Losh SPDX-License-Identifier: BSD-2-Clause-Patent 13*f439973dSWarner Losh 14*f439973dSWarner Losh **/ 15*f439973dSWarner Losh 16*f439973dSWarner Losh #ifndef __DEBUG_SUPPORT_H__ 17*f439973dSWarner Losh #define __DEBUG_SUPPORT_H__ 18*f439973dSWarner Losh 19*f439973dSWarner Losh #include <IndustryStandard/PeImage.h> 20*f439973dSWarner Losh 21*f439973dSWarner Losh typedef struct _EFI_DEBUG_SUPPORT_PROTOCOL EFI_DEBUG_SUPPORT_PROTOCOL; 22*f439973dSWarner Losh 23*f439973dSWarner Losh /// 24*f439973dSWarner Losh /// Debug Support protocol {2755590C-6F3C-42FA-9EA4-A3BA543CDA25}. 25*f439973dSWarner Losh /// 26*f439973dSWarner Losh #define EFI_DEBUG_SUPPORT_PROTOCOL_GUID \ 27*f439973dSWarner Losh { \ 28*f439973dSWarner Losh 0x2755590C, 0x6F3C, 0x42FA, {0x9E, 0xA4, 0xA3, 0xBA, 0x54, 0x3C, 0xDA, 0x25 } \ 29*f439973dSWarner Losh } 30*f439973dSWarner Losh 31*f439973dSWarner Losh /// 32*f439973dSWarner Losh /// Processor exception to be hooked. 33*f439973dSWarner Losh /// All exception types for IA32, X64, Itanium and EBC processors are defined. 34*f439973dSWarner Losh /// 35*f439973dSWarner Losh typedef INTN EFI_EXCEPTION_TYPE; 36*f439973dSWarner Losh 37*f439973dSWarner Losh /// 38*f439973dSWarner Losh /// IA-32 processor exception types. 39*f439973dSWarner Losh /// 40*f439973dSWarner Losh #define EXCEPT_IA32_DIVIDE_ERROR 0 41*f439973dSWarner Losh #define EXCEPT_IA32_DEBUG 1 42*f439973dSWarner Losh #define EXCEPT_IA32_NMI 2 43*f439973dSWarner Losh #define EXCEPT_IA32_BREAKPOINT 3 44*f439973dSWarner Losh #define EXCEPT_IA32_OVERFLOW 4 45*f439973dSWarner Losh #define EXCEPT_IA32_BOUND 5 46*f439973dSWarner Losh #define EXCEPT_IA32_INVALID_OPCODE 6 47*f439973dSWarner Losh #define EXCEPT_IA32_DOUBLE_FAULT 8 48*f439973dSWarner Losh #define EXCEPT_IA32_INVALID_TSS 10 49*f439973dSWarner Losh #define EXCEPT_IA32_SEG_NOT_PRESENT 11 50*f439973dSWarner Losh #define EXCEPT_IA32_STACK_FAULT 12 51*f439973dSWarner Losh #define EXCEPT_IA32_GP_FAULT 13 52*f439973dSWarner Losh #define EXCEPT_IA32_PAGE_FAULT 14 53*f439973dSWarner Losh #define EXCEPT_IA32_FP_ERROR 16 54*f439973dSWarner Losh #define EXCEPT_IA32_ALIGNMENT_CHECK 17 55*f439973dSWarner Losh #define EXCEPT_IA32_MACHINE_CHECK 18 56*f439973dSWarner Losh #define EXCEPT_IA32_SIMD 19 57*f439973dSWarner Losh 58*f439973dSWarner Losh /// 59*f439973dSWarner Losh /// FXSAVE_STATE. 60*f439973dSWarner Losh /// FP / MMX / XMM registers (see fxrstor instruction definition). 61*f439973dSWarner Losh /// 62*f439973dSWarner Losh typedef struct { 63*f439973dSWarner Losh UINT16 Fcw; 64*f439973dSWarner Losh UINT16 Fsw; 65*f439973dSWarner Losh UINT16 Ftw; 66*f439973dSWarner Losh UINT16 Opcode; 67*f439973dSWarner Losh UINT32 Eip; 68*f439973dSWarner Losh UINT16 Cs; 69*f439973dSWarner Losh UINT16 Reserved1; 70*f439973dSWarner Losh UINT32 DataOffset; 71*f439973dSWarner Losh UINT16 Ds; 72*f439973dSWarner Losh UINT8 Reserved2[10]; 73*f439973dSWarner Losh UINT8 St0Mm0[10], Reserved3[6]; 74*f439973dSWarner Losh UINT8 St1Mm1[10], Reserved4[6]; 75*f439973dSWarner Losh UINT8 St2Mm2[10], Reserved5[6]; 76*f439973dSWarner Losh UINT8 St3Mm3[10], Reserved6[6]; 77*f439973dSWarner Losh UINT8 St4Mm4[10], Reserved7[6]; 78*f439973dSWarner Losh UINT8 St5Mm5[10], Reserved8[6]; 79*f439973dSWarner Losh UINT8 St6Mm6[10], Reserved9[6]; 80*f439973dSWarner Losh UINT8 St7Mm7[10], Reserved10[6]; 81*f439973dSWarner Losh UINT8 Xmm0[16]; 82*f439973dSWarner Losh UINT8 Xmm1[16]; 83*f439973dSWarner Losh UINT8 Xmm2[16]; 84*f439973dSWarner Losh UINT8 Xmm3[16]; 85*f439973dSWarner Losh UINT8 Xmm4[16]; 86*f439973dSWarner Losh UINT8 Xmm5[16]; 87*f439973dSWarner Losh UINT8 Xmm6[16]; 88*f439973dSWarner Losh UINT8 Xmm7[16]; 89*f439973dSWarner Losh UINT8 Reserved11[14 * 16]; 90*f439973dSWarner Losh } EFI_FX_SAVE_STATE_IA32; 91*f439973dSWarner Losh 92*f439973dSWarner Losh /// 93*f439973dSWarner Losh /// IA-32 processor context definition. 94*f439973dSWarner Losh /// 95*f439973dSWarner Losh typedef struct { 96*f439973dSWarner Losh UINT32 ExceptionData; 97*f439973dSWarner Losh EFI_FX_SAVE_STATE_IA32 FxSaveState; 98*f439973dSWarner Losh UINT32 Dr0; 99*f439973dSWarner Losh UINT32 Dr1; 100*f439973dSWarner Losh UINT32 Dr2; 101*f439973dSWarner Losh UINT32 Dr3; 102*f439973dSWarner Losh UINT32 Dr6; 103*f439973dSWarner Losh UINT32 Dr7; 104*f439973dSWarner Losh UINT32 Cr0; 105*f439973dSWarner Losh UINT32 Cr1; /* Reserved */ 106*f439973dSWarner Losh UINT32 Cr2; 107*f439973dSWarner Losh UINT32 Cr3; 108*f439973dSWarner Losh UINT32 Cr4; 109*f439973dSWarner Losh UINT32 Eflags; 110*f439973dSWarner Losh UINT32 Ldtr; 111*f439973dSWarner Losh UINT32 Tr; 112*f439973dSWarner Losh UINT32 Gdtr[2]; 113*f439973dSWarner Losh UINT32 Idtr[2]; 114*f439973dSWarner Losh UINT32 Eip; 115*f439973dSWarner Losh UINT32 Gs; 116*f439973dSWarner Losh UINT32 Fs; 117*f439973dSWarner Losh UINT32 Es; 118*f439973dSWarner Losh UINT32 Ds; 119*f439973dSWarner Losh UINT32 Cs; 120*f439973dSWarner Losh UINT32 Ss; 121*f439973dSWarner Losh UINT32 Edi; 122*f439973dSWarner Losh UINT32 Esi; 123*f439973dSWarner Losh UINT32 Ebp; 124*f439973dSWarner Losh UINT32 Esp; 125*f439973dSWarner Losh UINT32 Ebx; 126*f439973dSWarner Losh UINT32 Edx; 127*f439973dSWarner Losh UINT32 Ecx; 128*f439973dSWarner Losh UINT32 Eax; 129*f439973dSWarner Losh } EFI_SYSTEM_CONTEXT_IA32; 130*f439973dSWarner Losh 131*f439973dSWarner Losh /// 132*f439973dSWarner Losh /// x64 processor exception types. 133*f439973dSWarner Losh /// 134*f439973dSWarner Losh #define EXCEPT_X64_DIVIDE_ERROR 0 135*f439973dSWarner Losh #define EXCEPT_X64_DEBUG 1 136*f439973dSWarner Losh #define EXCEPT_X64_NMI 2 137*f439973dSWarner Losh #define EXCEPT_X64_BREAKPOINT 3 138*f439973dSWarner Losh #define EXCEPT_X64_OVERFLOW 4 139*f439973dSWarner Losh #define EXCEPT_X64_BOUND 5 140*f439973dSWarner Losh #define EXCEPT_X64_INVALID_OPCODE 6 141*f439973dSWarner Losh #define EXCEPT_X64_DOUBLE_FAULT 8 142*f439973dSWarner Losh #define EXCEPT_X64_INVALID_TSS 10 143*f439973dSWarner Losh #define EXCEPT_X64_SEG_NOT_PRESENT 11 144*f439973dSWarner Losh #define EXCEPT_X64_STACK_FAULT 12 145*f439973dSWarner Losh #define EXCEPT_X64_GP_FAULT 13 146*f439973dSWarner Losh #define EXCEPT_X64_PAGE_FAULT 14 147*f439973dSWarner Losh #define EXCEPT_X64_FP_ERROR 16 148*f439973dSWarner Losh #define EXCEPT_X64_ALIGNMENT_CHECK 17 149*f439973dSWarner Losh #define EXCEPT_X64_MACHINE_CHECK 18 150*f439973dSWarner Losh #define EXCEPT_X64_SIMD 19 151*f439973dSWarner Losh 152*f439973dSWarner Losh /// 153*f439973dSWarner Losh /// FXSAVE_STATE. 154*f439973dSWarner Losh /// FP / MMX / XMM registers (see fxrstor instruction definition). 155*f439973dSWarner Losh /// 156*f439973dSWarner Losh typedef struct { 157*f439973dSWarner Losh UINT16 Fcw; 158*f439973dSWarner Losh UINT16 Fsw; 159*f439973dSWarner Losh UINT16 Ftw; 160*f439973dSWarner Losh UINT16 Opcode; 161*f439973dSWarner Losh UINT64 Rip; 162*f439973dSWarner Losh UINT64 DataOffset; 163*f439973dSWarner Losh UINT8 Reserved1[8]; 164*f439973dSWarner Losh UINT8 St0Mm0[10], Reserved2[6]; 165*f439973dSWarner Losh UINT8 St1Mm1[10], Reserved3[6]; 166*f439973dSWarner Losh UINT8 St2Mm2[10], Reserved4[6]; 167*f439973dSWarner Losh UINT8 St3Mm3[10], Reserved5[6]; 168*f439973dSWarner Losh UINT8 St4Mm4[10], Reserved6[6]; 169*f439973dSWarner Losh UINT8 St5Mm5[10], Reserved7[6]; 170*f439973dSWarner Losh UINT8 St6Mm6[10], Reserved8[6]; 171*f439973dSWarner Losh UINT8 St7Mm7[10], Reserved9[6]; 172*f439973dSWarner Losh UINT8 Xmm0[16]; 173*f439973dSWarner Losh UINT8 Xmm1[16]; 174*f439973dSWarner Losh UINT8 Xmm2[16]; 175*f439973dSWarner Losh UINT8 Xmm3[16]; 176*f439973dSWarner Losh UINT8 Xmm4[16]; 177*f439973dSWarner Losh UINT8 Xmm5[16]; 178*f439973dSWarner Losh UINT8 Xmm6[16]; 179*f439973dSWarner Losh UINT8 Xmm7[16]; 180*f439973dSWarner Losh // 181*f439973dSWarner Losh // NOTE: UEFI 2.0 spec definition as follows. 182*f439973dSWarner Losh // 183*f439973dSWarner Losh UINT8 Reserved11[14 * 16]; 184*f439973dSWarner Losh } EFI_FX_SAVE_STATE_X64; 185*f439973dSWarner Losh 186*f439973dSWarner Losh /// 187*f439973dSWarner Losh /// x64 processor context definition. 188*f439973dSWarner Losh /// 189*f439973dSWarner Losh typedef struct { 190*f439973dSWarner Losh UINT64 ExceptionData; 191*f439973dSWarner Losh EFI_FX_SAVE_STATE_X64 FxSaveState; 192*f439973dSWarner Losh UINT64 Dr0; 193*f439973dSWarner Losh UINT64 Dr1; 194*f439973dSWarner Losh UINT64 Dr2; 195*f439973dSWarner Losh UINT64 Dr3; 196*f439973dSWarner Losh UINT64 Dr6; 197*f439973dSWarner Losh UINT64 Dr7; 198*f439973dSWarner Losh UINT64 Cr0; 199*f439973dSWarner Losh UINT64 Cr1; /* Reserved */ 200*f439973dSWarner Losh UINT64 Cr2; 201*f439973dSWarner Losh UINT64 Cr3; 202*f439973dSWarner Losh UINT64 Cr4; 203*f439973dSWarner Losh UINT64 Cr8; 204*f439973dSWarner Losh UINT64 Rflags; 205*f439973dSWarner Losh UINT64 Ldtr; 206*f439973dSWarner Losh UINT64 Tr; 207*f439973dSWarner Losh UINT64 Gdtr[2]; 208*f439973dSWarner Losh UINT64 Idtr[2]; 209*f439973dSWarner Losh UINT64 Rip; 210*f439973dSWarner Losh UINT64 Gs; 211*f439973dSWarner Losh UINT64 Fs; 212*f439973dSWarner Losh UINT64 Es; 213*f439973dSWarner Losh UINT64 Ds; 214*f439973dSWarner Losh UINT64 Cs; 215*f439973dSWarner Losh UINT64 Ss; 216*f439973dSWarner Losh UINT64 Rdi; 217*f439973dSWarner Losh UINT64 Rsi; 218*f439973dSWarner Losh UINT64 Rbp; 219*f439973dSWarner Losh UINT64 Rsp; 220*f439973dSWarner Losh UINT64 Rbx; 221*f439973dSWarner Losh UINT64 Rdx; 222*f439973dSWarner Losh UINT64 Rcx; 223*f439973dSWarner Losh UINT64 Rax; 224*f439973dSWarner Losh UINT64 R8; 225*f439973dSWarner Losh UINT64 R9; 226*f439973dSWarner Losh UINT64 R10; 227*f439973dSWarner Losh UINT64 R11; 228*f439973dSWarner Losh UINT64 R12; 229*f439973dSWarner Losh UINT64 R13; 230*f439973dSWarner Losh UINT64 R14; 231*f439973dSWarner Losh UINT64 R15; 232*f439973dSWarner Losh } EFI_SYSTEM_CONTEXT_X64; 233*f439973dSWarner Losh 234*f439973dSWarner Losh /// 235*f439973dSWarner Losh /// Itanium Processor Family Exception types. 236*f439973dSWarner Losh /// 237*f439973dSWarner Losh #define EXCEPT_IPF_VHTP_TRANSLATION 0 238*f439973dSWarner Losh #define EXCEPT_IPF_INSTRUCTION_TLB 1 239*f439973dSWarner Losh #define EXCEPT_IPF_DATA_TLB 2 240*f439973dSWarner Losh #define EXCEPT_IPF_ALT_INSTRUCTION_TLB 3 241*f439973dSWarner Losh #define EXCEPT_IPF_ALT_DATA_TLB 4 242*f439973dSWarner Losh #define EXCEPT_IPF_DATA_NESTED_TLB 5 243*f439973dSWarner Losh #define EXCEPT_IPF_INSTRUCTION_KEY_MISSED 6 244*f439973dSWarner Losh #define EXCEPT_IPF_DATA_KEY_MISSED 7 245*f439973dSWarner Losh #define EXCEPT_IPF_DIRTY_BIT 8 246*f439973dSWarner Losh #define EXCEPT_IPF_INSTRUCTION_ACCESS_BIT 9 247*f439973dSWarner Losh #define EXCEPT_IPF_DATA_ACCESS_BIT 10 248*f439973dSWarner Losh #define EXCEPT_IPF_BREAKPOINT 11 249*f439973dSWarner Losh #define EXCEPT_IPF_EXTERNAL_INTERRUPT 12 250*f439973dSWarner Losh // 251*f439973dSWarner Losh // 13 - 19 reserved 252*f439973dSWarner Losh // 253*f439973dSWarner Losh #define EXCEPT_IPF_PAGE_NOT_PRESENT 20 254*f439973dSWarner Losh #define EXCEPT_IPF_KEY_PERMISSION 21 255*f439973dSWarner Losh #define EXCEPT_IPF_INSTRUCTION_ACCESS_RIGHTS 22 256*f439973dSWarner Losh #define EXCEPT_IPF_DATA_ACCESS_RIGHTS 23 257*f439973dSWarner Losh #define EXCEPT_IPF_GENERAL_EXCEPTION 24 258*f439973dSWarner Losh #define EXCEPT_IPF_DISABLED_FP_REGISTER 25 259*f439973dSWarner Losh #define EXCEPT_IPF_NAT_CONSUMPTION 26 260*f439973dSWarner Losh #define EXCEPT_IPF_SPECULATION 27 261*f439973dSWarner Losh // 262*f439973dSWarner Losh // 28 reserved 263*f439973dSWarner Losh // 264*f439973dSWarner Losh #define EXCEPT_IPF_DEBUG 29 265*f439973dSWarner Losh #define EXCEPT_IPF_UNALIGNED_REFERENCE 30 266*f439973dSWarner Losh #define EXCEPT_IPF_UNSUPPORTED_DATA_REFERENCE 31 267*f439973dSWarner Losh #define EXCEPT_IPF_FP_FAULT 32 268*f439973dSWarner Losh #define EXCEPT_IPF_FP_TRAP 33 269*f439973dSWarner Losh #define EXCEPT_IPF_LOWER_PRIVILEGE_TRANSFER_TRAP 34 270*f439973dSWarner Losh #define EXCEPT_IPF_TAKEN_BRANCH 35 271*f439973dSWarner Losh #define EXCEPT_IPF_SINGLE_STEP 36 272*f439973dSWarner Losh // 273*f439973dSWarner Losh // 37 - 44 reserved 274*f439973dSWarner Losh // 275*f439973dSWarner Losh #define EXCEPT_IPF_IA32_EXCEPTION 45 276*f439973dSWarner Losh #define EXCEPT_IPF_IA32_INTERCEPT 46 277*f439973dSWarner Losh #define EXCEPT_IPF_IA32_INTERRUPT 47 278*f439973dSWarner Losh 279*f439973dSWarner Losh /// 280*f439973dSWarner Losh /// IPF processor context definition. 281*f439973dSWarner Losh /// 282*f439973dSWarner Losh typedef struct { 283*f439973dSWarner Losh // 284*f439973dSWarner Losh // The first reserved field is necessary to preserve alignment for the correct 285*f439973dSWarner Losh // bits in UNAT and to insure F2 is 16 byte aligned. 286*f439973dSWarner Losh // 287*f439973dSWarner Losh UINT64 Reserved; 288*f439973dSWarner Losh UINT64 R1; 289*f439973dSWarner Losh UINT64 R2; 290*f439973dSWarner Losh UINT64 R3; 291*f439973dSWarner Losh UINT64 R4; 292*f439973dSWarner Losh UINT64 R5; 293*f439973dSWarner Losh UINT64 R6; 294*f439973dSWarner Losh UINT64 R7; 295*f439973dSWarner Losh UINT64 R8; 296*f439973dSWarner Losh UINT64 R9; 297*f439973dSWarner Losh UINT64 R10; 298*f439973dSWarner Losh UINT64 R11; 299*f439973dSWarner Losh UINT64 R12; 300*f439973dSWarner Losh UINT64 R13; 301*f439973dSWarner Losh UINT64 R14; 302*f439973dSWarner Losh UINT64 R15; 303*f439973dSWarner Losh UINT64 R16; 304*f439973dSWarner Losh UINT64 R17; 305*f439973dSWarner Losh UINT64 R18; 306*f439973dSWarner Losh UINT64 R19; 307*f439973dSWarner Losh UINT64 R20; 308*f439973dSWarner Losh UINT64 R21; 309*f439973dSWarner Losh UINT64 R22; 310*f439973dSWarner Losh UINT64 R23; 311*f439973dSWarner Losh UINT64 R24; 312*f439973dSWarner Losh UINT64 R25; 313*f439973dSWarner Losh UINT64 R26; 314*f439973dSWarner Losh UINT64 R27; 315*f439973dSWarner Losh UINT64 R28; 316*f439973dSWarner Losh UINT64 R29; 317*f439973dSWarner Losh UINT64 R30; 318*f439973dSWarner Losh UINT64 R31; 319*f439973dSWarner Losh 320*f439973dSWarner Losh UINT64 F2[2]; 321*f439973dSWarner Losh UINT64 F3[2]; 322*f439973dSWarner Losh UINT64 F4[2]; 323*f439973dSWarner Losh UINT64 F5[2]; 324*f439973dSWarner Losh UINT64 F6[2]; 325*f439973dSWarner Losh UINT64 F7[2]; 326*f439973dSWarner Losh UINT64 F8[2]; 327*f439973dSWarner Losh UINT64 F9[2]; 328*f439973dSWarner Losh UINT64 F10[2]; 329*f439973dSWarner Losh UINT64 F11[2]; 330*f439973dSWarner Losh UINT64 F12[2]; 331*f439973dSWarner Losh UINT64 F13[2]; 332*f439973dSWarner Losh UINT64 F14[2]; 333*f439973dSWarner Losh UINT64 F15[2]; 334*f439973dSWarner Losh UINT64 F16[2]; 335*f439973dSWarner Losh UINT64 F17[2]; 336*f439973dSWarner Losh UINT64 F18[2]; 337*f439973dSWarner Losh UINT64 F19[2]; 338*f439973dSWarner Losh UINT64 F20[2]; 339*f439973dSWarner Losh UINT64 F21[2]; 340*f439973dSWarner Losh UINT64 F22[2]; 341*f439973dSWarner Losh UINT64 F23[2]; 342*f439973dSWarner Losh UINT64 F24[2]; 343*f439973dSWarner Losh UINT64 F25[2]; 344*f439973dSWarner Losh UINT64 F26[2]; 345*f439973dSWarner Losh UINT64 F27[2]; 346*f439973dSWarner Losh UINT64 F28[2]; 347*f439973dSWarner Losh UINT64 F29[2]; 348*f439973dSWarner Losh UINT64 F30[2]; 349*f439973dSWarner Losh UINT64 F31[2]; 350*f439973dSWarner Losh 351*f439973dSWarner Losh UINT64 Pr; 352*f439973dSWarner Losh 353*f439973dSWarner Losh UINT64 B0; 354*f439973dSWarner Losh UINT64 B1; 355*f439973dSWarner Losh UINT64 B2; 356*f439973dSWarner Losh UINT64 B3; 357*f439973dSWarner Losh UINT64 B4; 358*f439973dSWarner Losh UINT64 B5; 359*f439973dSWarner Losh UINT64 B6; 360*f439973dSWarner Losh UINT64 B7; 361*f439973dSWarner Losh 362*f439973dSWarner Losh // 363*f439973dSWarner Losh // application registers 364*f439973dSWarner Losh // 365*f439973dSWarner Losh UINT64 ArRsc; 366*f439973dSWarner Losh UINT64 ArBsp; 367*f439973dSWarner Losh UINT64 ArBspstore; 368*f439973dSWarner Losh UINT64 ArRnat; 369*f439973dSWarner Losh 370*f439973dSWarner Losh UINT64 ArFcr; 371*f439973dSWarner Losh 372*f439973dSWarner Losh UINT64 ArEflag; 373*f439973dSWarner Losh UINT64 ArCsd; 374*f439973dSWarner Losh UINT64 ArSsd; 375*f439973dSWarner Losh UINT64 ArCflg; 376*f439973dSWarner Losh UINT64 ArFsr; 377*f439973dSWarner Losh UINT64 ArFir; 378*f439973dSWarner Losh UINT64 ArFdr; 379*f439973dSWarner Losh 380*f439973dSWarner Losh UINT64 ArCcv; 381*f439973dSWarner Losh 382*f439973dSWarner Losh UINT64 ArUnat; 383*f439973dSWarner Losh 384*f439973dSWarner Losh UINT64 ArFpsr; 385*f439973dSWarner Losh 386*f439973dSWarner Losh UINT64 ArPfs; 387*f439973dSWarner Losh UINT64 ArLc; 388*f439973dSWarner Losh UINT64 ArEc; 389*f439973dSWarner Losh 390*f439973dSWarner Losh // 391*f439973dSWarner Losh // control registers 392*f439973dSWarner Losh // 393*f439973dSWarner Losh UINT64 CrDcr; 394*f439973dSWarner Losh UINT64 CrItm; 395*f439973dSWarner Losh UINT64 CrIva; 396*f439973dSWarner Losh UINT64 CrPta; 397*f439973dSWarner Losh UINT64 CrIpsr; 398*f439973dSWarner Losh UINT64 CrIsr; 399*f439973dSWarner Losh UINT64 CrIip; 400*f439973dSWarner Losh UINT64 CrIfa; 401*f439973dSWarner Losh UINT64 CrItir; 402*f439973dSWarner Losh UINT64 CrIipa; 403*f439973dSWarner Losh UINT64 CrIfs; 404*f439973dSWarner Losh UINT64 CrIim; 405*f439973dSWarner Losh UINT64 CrIha; 406*f439973dSWarner Losh 407*f439973dSWarner Losh // 408*f439973dSWarner Losh // debug registers 409*f439973dSWarner Losh // 410*f439973dSWarner Losh UINT64 Dbr0; 411*f439973dSWarner Losh UINT64 Dbr1; 412*f439973dSWarner Losh UINT64 Dbr2; 413*f439973dSWarner Losh UINT64 Dbr3; 414*f439973dSWarner Losh UINT64 Dbr4; 415*f439973dSWarner Losh UINT64 Dbr5; 416*f439973dSWarner Losh UINT64 Dbr6; 417*f439973dSWarner Losh UINT64 Dbr7; 418*f439973dSWarner Losh 419*f439973dSWarner Losh UINT64 Ibr0; 420*f439973dSWarner Losh UINT64 Ibr1; 421*f439973dSWarner Losh UINT64 Ibr2; 422*f439973dSWarner Losh UINT64 Ibr3; 423*f439973dSWarner Losh UINT64 Ibr4; 424*f439973dSWarner Losh UINT64 Ibr5; 425*f439973dSWarner Losh UINT64 Ibr6; 426*f439973dSWarner Losh UINT64 Ibr7; 427*f439973dSWarner Losh 428*f439973dSWarner Losh // 429*f439973dSWarner Losh // virtual registers - nat bits for R1-R31 430*f439973dSWarner Losh // 431*f439973dSWarner Losh UINT64 IntNat; 432*f439973dSWarner Losh } EFI_SYSTEM_CONTEXT_IPF; 433*f439973dSWarner Losh 434*f439973dSWarner Losh /// 435*f439973dSWarner Losh /// EBC processor exception types. 436*f439973dSWarner Losh /// 437*f439973dSWarner Losh #define EXCEPT_EBC_UNDEFINED 0 438*f439973dSWarner Losh #define EXCEPT_EBC_DIVIDE_ERROR 1 439*f439973dSWarner Losh #define EXCEPT_EBC_DEBUG 2 440*f439973dSWarner Losh #define EXCEPT_EBC_BREAKPOINT 3 441*f439973dSWarner Losh #define EXCEPT_EBC_OVERFLOW 4 442*f439973dSWarner Losh #define EXCEPT_EBC_INVALID_OPCODE 5 ///< Opcode out of range. 443*f439973dSWarner Losh #define EXCEPT_EBC_STACK_FAULT 6 444*f439973dSWarner Losh #define EXCEPT_EBC_ALIGNMENT_CHECK 7 445*f439973dSWarner Losh #define EXCEPT_EBC_INSTRUCTION_ENCODING 8 ///< Malformed instruction. 446*f439973dSWarner Losh #define EXCEPT_EBC_BAD_BREAK 9 ///< BREAK 0 or undefined BREAK. 447*f439973dSWarner Losh #define EXCEPT_EBC_STEP 10 ///< To support debug stepping. 448*f439973dSWarner Losh /// 449*f439973dSWarner Losh /// For coding convenience, define the maximum valid EBC exception. 450*f439973dSWarner Losh /// 451*f439973dSWarner Losh #define MAX_EBC_EXCEPTION EXCEPT_EBC_STEP 452*f439973dSWarner Losh 453*f439973dSWarner Losh /// 454*f439973dSWarner Losh /// EBC processor context definition. 455*f439973dSWarner Losh /// 456*f439973dSWarner Losh typedef struct { 457*f439973dSWarner Losh UINT64 R0; 458*f439973dSWarner Losh UINT64 R1; 459*f439973dSWarner Losh UINT64 R2; 460*f439973dSWarner Losh UINT64 R3; 461*f439973dSWarner Losh UINT64 R4; 462*f439973dSWarner Losh UINT64 R5; 463*f439973dSWarner Losh UINT64 R6; 464*f439973dSWarner Losh UINT64 R7; 465*f439973dSWarner Losh UINT64 Flags; 466*f439973dSWarner Losh UINT64 ControlFlags; 467*f439973dSWarner Losh UINT64 Ip; 468*f439973dSWarner Losh } EFI_SYSTEM_CONTEXT_EBC; 469*f439973dSWarner Losh 470*f439973dSWarner Losh /// 471*f439973dSWarner Losh /// ARM processor exception types. 472*f439973dSWarner Losh /// 473*f439973dSWarner Losh #define EXCEPT_ARM_RESET 0 474*f439973dSWarner Losh #define EXCEPT_ARM_UNDEFINED_INSTRUCTION 1 475*f439973dSWarner Losh #define EXCEPT_ARM_SOFTWARE_INTERRUPT 2 476*f439973dSWarner Losh #define EXCEPT_ARM_PREFETCH_ABORT 3 477*f439973dSWarner Losh #define EXCEPT_ARM_DATA_ABORT 4 478*f439973dSWarner Losh #define EXCEPT_ARM_RESERVED 5 479*f439973dSWarner Losh #define EXCEPT_ARM_IRQ 6 480*f439973dSWarner Losh #define EXCEPT_ARM_FIQ 7 481*f439973dSWarner Losh 482*f439973dSWarner Losh /// 483*f439973dSWarner Losh /// For coding convenience, define the maximum valid ARM exception. 484*f439973dSWarner Losh /// 485*f439973dSWarner Losh #define MAX_ARM_EXCEPTION EXCEPT_ARM_FIQ 486*f439973dSWarner Losh 487*f439973dSWarner Losh /// 488*f439973dSWarner Losh /// ARM processor context definition. 489*f439973dSWarner Losh /// 490*f439973dSWarner Losh typedef struct { 491*f439973dSWarner Losh UINT32 R0; 492*f439973dSWarner Losh UINT32 R1; 493*f439973dSWarner Losh UINT32 R2; 494*f439973dSWarner Losh UINT32 R3; 495*f439973dSWarner Losh UINT32 R4; 496*f439973dSWarner Losh UINT32 R5; 497*f439973dSWarner Losh UINT32 R6; 498*f439973dSWarner Losh UINT32 R7; 499*f439973dSWarner Losh UINT32 R8; 500*f439973dSWarner Losh UINT32 R9; 501*f439973dSWarner Losh UINT32 R10; 502*f439973dSWarner Losh UINT32 R11; 503*f439973dSWarner Losh UINT32 R12; 504*f439973dSWarner Losh UINT32 SP; 505*f439973dSWarner Losh UINT32 LR; 506*f439973dSWarner Losh UINT32 PC; 507*f439973dSWarner Losh UINT32 CPSR; 508*f439973dSWarner Losh UINT32 DFSR; 509*f439973dSWarner Losh UINT32 DFAR; 510*f439973dSWarner Losh UINT32 IFSR; 511*f439973dSWarner Losh UINT32 IFAR; 512*f439973dSWarner Losh } EFI_SYSTEM_CONTEXT_ARM; 513*f439973dSWarner Losh 514*f439973dSWarner Losh /// 515*f439973dSWarner Losh /// AARCH64 processor exception types. 516*f439973dSWarner Losh /// 517*f439973dSWarner Losh #define EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS 0 518*f439973dSWarner Losh #define EXCEPT_AARCH64_IRQ 1 519*f439973dSWarner Losh #define EXCEPT_AARCH64_FIQ 2 520*f439973dSWarner Losh #define EXCEPT_AARCH64_SERROR 3 521*f439973dSWarner Losh 522*f439973dSWarner Losh /// 523*f439973dSWarner Losh /// For coding convenience, define the maximum valid ARM exception. 524*f439973dSWarner Losh /// 525*f439973dSWarner Losh #define MAX_AARCH64_EXCEPTION EXCEPT_AARCH64_SERROR 526*f439973dSWarner Losh 527*f439973dSWarner Losh typedef struct { 528*f439973dSWarner Losh // General Purpose Registers 529*f439973dSWarner Losh UINT64 X0; 530*f439973dSWarner Losh UINT64 X1; 531*f439973dSWarner Losh UINT64 X2; 532*f439973dSWarner Losh UINT64 X3; 533*f439973dSWarner Losh UINT64 X4; 534*f439973dSWarner Losh UINT64 X5; 535*f439973dSWarner Losh UINT64 X6; 536*f439973dSWarner Losh UINT64 X7; 537*f439973dSWarner Losh UINT64 X8; 538*f439973dSWarner Losh UINT64 X9; 539*f439973dSWarner Losh UINT64 X10; 540*f439973dSWarner Losh UINT64 X11; 541*f439973dSWarner Losh UINT64 X12; 542*f439973dSWarner Losh UINT64 X13; 543*f439973dSWarner Losh UINT64 X14; 544*f439973dSWarner Losh UINT64 X15; 545*f439973dSWarner Losh UINT64 X16; 546*f439973dSWarner Losh UINT64 X17; 547*f439973dSWarner Losh UINT64 X18; 548*f439973dSWarner Losh UINT64 X19; 549*f439973dSWarner Losh UINT64 X20; 550*f439973dSWarner Losh UINT64 X21; 551*f439973dSWarner Losh UINT64 X22; 552*f439973dSWarner Losh UINT64 X23; 553*f439973dSWarner Losh UINT64 X24; 554*f439973dSWarner Losh UINT64 X25; 555*f439973dSWarner Losh UINT64 X26; 556*f439973dSWarner Losh UINT64 X27; 557*f439973dSWarner Losh UINT64 X28; 558*f439973dSWarner Losh UINT64 FP; // x29 - Frame pointer 559*f439973dSWarner Losh UINT64 LR; // x30 - Link Register 560*f439973dSWarner Losh UINT64 SP; // x31 - Stack pointer 561*f439973dSWarner Losh 562*f439973dSWarner Losh // FP/SIMD Registers 563*f439973dSWarner Losh UINT64 V0[2]; 564*f439973dSWarner Losh UINT64 V1[2]; 565*f439973dSWarner Losh UINT64 V2[2]; 566*f439973dSWarner Losh UINT64 V3[2]; 567*f439973dSWarner Losh UINT64 V4[2]; 568*f439973dSWarner Losh UINT64 V5[2]; 569*f439973dSWarner Losh UINT64 V6[2]; 570*f439973dSWarner Losh UINT64 V7[2]; 571*f439973dSWarner Losh UINT64 V8[2]; 572*f439973dSWarner Losh UINT64 V9[2]; 573*f439973dSWarner Losh UINT64 V10[2]; 574*f439973dSWarner Losh UINT64 V11[2]; 575*f439973dSWarner Losh UINT64 V12[2]; 576*f439973dSWarner Losh UINT64 V13[2]; 577*f439973dSWarner Losh UINT64 V14[2]; 578*f439973dSWarner Losh UINT64 V15[2]; 579*f439973dSWarner Losh UINT64 V16[2]; 580*f439973dSWarner Losh UINT64 V17[2]; 581*f439973dSWarner Losh UINT64 V18[2]; 582*f439973dSWarner Losh UINT64 V19[2]; 583*f439973dSWarner Losh UINT64 V20[2]; 584*f439973dSWarner Losh UINT64 V21[2]; 585*f439973dSWarner Losh UINT64 V22[2]; 586*f439973dSWarner Losh UINT64 V23[2]; 587*f439973dSWarner Losh UINT64 V24[2]; 588*f439973dSWarner Losh UINT64 V25[2]; 589*f439973dSWarner Losh UINT64 V26[2]; 590*f439973dSWarner Losh UINT64 V27[2]; 591*f439973dSWarner Losh UINT64 V28[2]; 592*f439973dSWarner Losh UINT64 V29[2]; 593*f439973dSWarner Losh UINT64 V30[2]; 594*f439973dSWarner Losh UINT64 V31[2]; 595*f439973dSWarner Losh 596*f439973dSWarner Losh UINT64 ELR; // Exception Link Register 597*f439973dSWarner Losh UINT64 SPSR; // Saved Processor Status Register 598*f439973dSWarner Losh UINT64 FPSR; // Floating Point Status Register 599*f439973dSWarner Losh UINT64 ESR; // Exception syndrome register 600*f439973dSWarner Losh UINT64 FAR; // Fault Address Register 601*f439973dSWarner Losh } EFI_SYSTEM_CONTEXT_AARCH64; 602*f439973dSWarner Losh 603*f439973dSWarner Losh /// 604*f439973dSWarner Losh /// RISC-V processor exception types. 605*f439973dSWarner Losh /// 606*f439973dSWarner Losh #define EXCEPT_RISCV_INST_MISALIGNED 0 607*f439973dSWarner Losh #define EXCEPT_RISCV_INST_ACCESS_FAULT 1 608*f439973dSWarner Losh #define EXCEPT_RISCV_ILLEGAL_INST 2 609*f439973dSWarner Losh #define EXCEPT_RISCV_BREAKPOINT 3 610*f439973dSWarner Losh #define EXCEPT_RISCV_LOAD_ADDRESS_MISALIGNED 4 611*f439973dSWarner Losh #define EXCEPT_RISCV_LOAD_ACCESS_FAULT 5 612*f439973dSWarner Losh #define EXCEPT_RISCV_STORE_AMO_ADDRESS_MISALIGNED 6 613*f439973dSWarner Losh #define EXCEPT_RISCV_STORE_AMO_ACCESS_FAULT 7 614*f439973dSWarner Losh #define EXCEPT_RISCV_ENV_CALL_FROM_UMODE 8 615*f439973dSWarner Losh #define EXCEPT_RISCV_ENV_CALL_FROM_SMODE 9 616*f439973dSWarner Losh #define EXCEPT_RISCV_ENV_CALL_FROM_VS_MODE 10 617*f439973dSWarner Losh #define EXCEPT_RISCV_ENV_CALL_FROM_MMODE 11 618*f439973dSWarner Losh #define EXCEPT_RISCV_INST_ACCESS_PAGE_FAULT 12 619*f439973dSWarner Losh #define EXCEPT_RISCV_LOAD_ACCESS_PAGE_FAULT 13 620*f439973dSWarner Losh #define EXCEPT_RISCV_14 14 621*f439973dSWarner Losh #define EXCEPT_RISCV_STORE_ACCESS_PAGE_FAULT 15 622*f439973dSWarner Losh #define EXCEPT_RISCV_16 16 623*f439973dSWarner Losh #define EXCEPT_RISCV_17 17 624*f439973dSWarner Losh #define EXCEPT_RISCV_18 18 625*f439973dSWarner Losh #define EXCEPT_RISCV_19 19 626*f439973dSWarner Losh #define EXCEPT_RISCV_INST_GUEST_PAGE_FAULT 20 627*f439973dSWarner Losh #define EXCEPT_RISCV_LOAD_GUEST_PAGE_FAULT 21 628*f439973dSWarner Losh #define EXCEPT_RISCV_VIRTUAL_INSTRUCTION 22 629*f439973dSWarner Losh #define EXCEPT_RISCV_STORE_GUEST_PAGE_FAULT 23 630*f439973dSWarner Losh #define EXCEPT_RISCV_MAX_EXCEPTIONS (EXCEPT_RISCV_STORE_GUEST_PAGE_FAULT) 631*f439973dSWarner Losh 632*f439973dSWarner Losh /// 633*f439973dSWarner Losh /// RISC-V processor exception types for interrupts. 634*f439973dSWarner Losh /// 635*f439973dSWarner Losh #define EXCEPT_RISCV_IS_IRQ(x) ((x & 0x8000000000000000UL) != 0) 636*f439973dSWarner Losh #define EXCEPT_RISCV_IRQ_INDEX(x) (x & 0x7FFFFFFFFFFFFFFFUL) 637*f439973dSWarner Losh #define EXCEPT_RISCV_IRQ_0 0x8000000000000000UL 638*f439973dSWarner Losh #define EXCEPT_RISCV_IRQ_SOFT_FROM_SMODE 0x8000000000000001UL 639*f439973dSWarner Losh #define EXCEPT_RISCV_IRQ_SOFT_FROM_VSMODE 0x8000000000000002UL 640*f439973dSWarner Losh #define EXCEPT_RISCV_IRQ_SOFT_FROM_MMODE 0x8000000000000003UL 641*f439973dSWarner Losh #define EXCEPT_RISCV_IRQ_4 0x8000000000000004UL 642*f439973dSWarner Losh #define EXCEPT_RISCV_IRQ_TIMER_FROM_SMODE 0x8000000000000005UL 643*f439973dSWarner Losh #define EXCEPT_RISCV_MAX_IRQS (EXCEPT_RISCV_IRQ_INDEX(EXCEPT_RISCV_IRQ_TIMER_FROM_SMODE)) 644*f439973dSWarner Losh 645*f439973dSWarner Losh typedef struct { 646*f439973dSWarner Losh UINT64 X0; 647*f439973dSWarner Losh UINT64 X1; 648*f439973dSWarner Losh UINT64 X2; 649*f439973dSWarner Losh UINT64 X3; 650*f439973dSWarner Losh UINT64 X4; 651*f439973dSWarner Losh UINT64 X5; 652*f439973dSWarner Losh UINT64 X6; 653*f439973dSWarner Losh UINT64 X7; 654*f439973dSWarner Losh UINT64 X8; 655*f439973dSWarner Losh UINT64 X9; 656*f439973dSWarner Losh UINT64 X10; 657*f439973dSWarner Losh UINT64 X11; 658*f439973dSWarner Losh UINT64 X12; 659*f439973dSWarner Losh UINT64 X13; 660*f439973dSWarner Losh UINT64 X14; 661*f439973dSWarner Losh UINT64 X15; 662*f439973dSWarner Losh UINT64 X16; 663*f439973dSWarner Losh UINT64 X17; 664*f439973dSWarner Losh UINT64 X18; 665*f439973dSWarner Losh UINT64 X19; 666*f439973dSWarner Losh UINT64 X20; 667*f439973dSWarner Losh UINT64 X21; 668*f439973dSWarner Losh UINT64 X22; 669*f439973dSWarner Losh UINT64 X23; 670*f439973dSWarner Losh UINT64 X24; 671*f439973dSWarner Losh UINT64 X25; 672*f439973dSWarner Losh UINT64 X26; 673*f439973dSWarner Losh UINT64 X27; 674*f439973dSWarner Losh UINT64 X28; 675*f439973dSWarner Losh UINT64 X29; 676*f439973dSWarner Losh UINT64 X30; 677*f439973dSWarner Losh UINT64 X31; 678*f439973dSWarner Losh UINT64 SEPC; 679*f439973dSWarner Losh UINT32 SSTATUS; 680*f439973dSWarner Losh UINT32 STVAL; 681*f439973dSWarner Losh } EFI_SYSTEM_CONTEXT_RISCV64; 682*f439973dSWarner Losh 683*f439973dSWarner Losh /// 684*f439973dSWarner Losh /// LoongArch processor exception types. 685*f439973dSWarner Losh /// 686*f439973dSWarner Losh /// The exception types is located in the CSR ESTAT 687*f439973dSWarner Losh /// register offset 16 bits, width 6 bits. 688*f439973dSWarner Losh /// 689*f439973dSWarner Losh /// If you want to register an exception hook, you can 690*f439973dSWarner Losh /// shfit the number left by 16 bits, and the exception 691*f439973dSWarner Losh /// handler will know the types. 692*f439973dSWarner Losh /// 693*f439973dSWarner Losh /// For example: 694*f439973dSWarner Losh /// mCpu->CpuRegisterInterruptHandler ( 695*f439973dSWarner Losh /// mCpu, 696*f439973dSWarner Losh /// (EXCEPT_LOONGARCH_PPI << CSR_ESTAT_EXC_SHIFT), 697*f439973dSWarner Losh /// PpiExceptionHandler 698*f439973dSWarner Losh /// ); 699*f439973dSWarner Losh /// 700*f439973dSWarner Losh #define EXCEPT_LOONGARCH_INT 0 701*f439973dSWarner Losh #define EXCEPT_LOONGARCH_PIL 1 702*f439973dSWarner Losh #define EXCEPT_LOONGARCH_PIS 2 703*f439973dSWarner Losh #define EXCEPT_LOONGARCH_PIF 3 704*f439973dSWarner Losh #define EXCEPT_LOONGARCH_PME 4 705*f439973dSWarner Losh #define EXCEPT_LOONGARCH_PNR 5 706*f439973dSWarner Losh #define EXCEPT_LOONGARCH_PNX 6 707*f439973dSWarner Losh #define EXCEPT_LOONGARCH_PPI 7 708*f439973dSWarner Losh #define EXCEPT_LOONGARCH_ADE 8 709*f439973dSWarner Losh #define EXCEPT_LOONGARCH_ALE 9 710*f439973dSWarner Losh #define EXCEPT_LOONGARCH_BCE 10 711*f439973dSWarner Losh #define EXCEPT_LOONGARCH_SYS 11 712*f439973dSWarner Losh #define EXCEPT_LOONGARCH_BRK 12 713*f439973dSWarner Losh #define EXCEPT_LOONGARCH_INE 13 714*f439973dSWarner Losh #define EXCEPT_LOONGARCH_IPE 14 715*f439973dSWarner Losh #define EXCEPT_LOONGARCH_FPD 15 716*f439973dSWarner Losh #define EXCEPT_LOONGARCH_SXD 16 717*f439973dSWarner Losh #define EXCEPT_LOONGARCH_ASXD 17 718*f439973dSWarner Losh #define EXCEPT_LOONGARCH_FPE 18 719*f439973dSWarner Losh #define EXCEPT_LOONGARCH_WPE 19 720*f439973dSWarner Losh #define EXCEPT_LOONGARCH_BTD 20 721*f439973dSWarner Losh #define EXCEPT_LOONGARCH_BTE 21 722*f439973dSWarner Losh #define EXCEPT_LOONGARCH_GSPR 22 723*f439973dSWarner Losh #define EXCEPT_LOONGARCH_HVC 23 724*f439973dSWarner Losh #define EXCEPT_LOONGARCH_GCXC 24 725*f439973dSWarner Losh 726*f439973dSWarner Losh /// 727*f439973dSWarner Losh /// For coding convenience, define the maximum valid 728*f439973dSWarner Losh /// LoongArch exception. 729*f439973dSWarner Losh /// 730*f439973dSWarner Losh #define MAX_LOONGARCH_EXCEPTION 64 731*f439973dSWarner Losh 732*f439973dSWarner Losh /// 733*f439973dSWarner Losh /// LoongArch processor Interrupt types. 734*f439973dSWarner Losh /// 735*f439973dSWarner Losh #define EXCEPT_LOONGARCH_INT_SIP0 0 736*f439973dSWarner Losh #define EXCEPT_LOONGARCH_INT_SIP1 1 737*f439973dSWarner Losh #define EXCEPT_LOONGARCH_INT_IP0 2 738*f439973dSWarner Losh #define EXCEPT_LOONGARCH_INT_IP1 3 739*f439973dSWarner Losh #define EXCEPT_LOONGARCH_INT_IP2 4 740*f439973dSWarner Losh #define EXCEPT_LOONGARCH_INT_IP3 5 741*f439973dSWarner Losh #define EXCEPT_LOONGARCH_INT_IP4 6 742*f439973dSWarner Losh #define EXCEPT_LOONGARCH_INT_IP5 7 743*f439973dSWarner Losh #define EXCEPT_LOONGARCH_INT_IP6 8 744*f439973dSWarner Losh #define EXCEPT_LOONGARCH_INT_IP7 9 745*f439973dSWarner Losh #define EXCEPT_LOONGARCH_INT_PMC 10 746*f439973dSWarner Losh #define EXCEPT_LOONGARCH_INT_TIMER 11 747*f439973dSWarner Losh #define EXCEPT_LOONGARCH_INT_IPI 12 748*f439973dSWarner Losh 749*f439973dSWarner Losh /// 750*f439973dSWarner Losh /// For coding convenience, define the maximum valid 751*f439973dSWarner Losh /// LoongArch interrupt. 752*f439973dSWarner Losh /// 753*f439973dSWarner Losh #define MAX_LOONGARCH_INTERRUPT 16 754*f439973dSWarner Losh 755*f439973dSWarner Losh typedef struct { 756*f439973dSWarner Losh UINT64 R0; 757*f439973dSWarner Losh UINT64 R1; 758*f439973dSWarner Losh UINT64 R2; 759*f439973dSWarner Losh UINT64 R3; 760*f439973dSWarner Losh UINT64 R4; 761*f439973dSWarner Losh UINT64 R5; 762*f439973dSWarner Losh UINT64 R6; 763*f439973dSWarner Losh UINT64 R7; 764*f439973dSWarner Losh UINT64 R8; 765*f439973dSWarner Losh UINT64 R9; 766*f439973dSWarner Losh UINT64 R10; 767*f439973dSWarner Losh UINT64 R11; 768*f439973dSWarner Losh UINT64 R12; 769*f439973dSWarner Losh UINT64 R13; 770*f439973dSWarner Losh UINT64 R14; 771*f439973dSWarner Losh UINT64 R15; 772*f439973dSWarner Losh UINT64 R16; 773*f439973dSWarner Losh UINT64 R17; 774*f439973dSWarner Losh UINT64 R18; 775*f439973dSWarner Losh UINT64 R19; 776*f439973dSWarner Losh UINT64 R20; 777*f439973dSWarner Losh UINT64 R21; 778*f439973dSWarner Losh UINT64 R22; 779*f439973dSWarner Losh UINT64 R23; 780*f439973dSWarner Losh UINT64 R24; 781*f439973dSWarner Losh UINT64 R25; 782*f439973dSWarner Losh UINT64 R26; 783*f439973dSWarner Losh UINT64 R27; 784*f439973dSWarner Losh UINT64 R28; 785*f439973dSWarner Losh UINT64 R29; 786*f439973dSWarner Losh UINT64 R30; 787*f439973dSWarner Losh UINT64 R31; 788*f439973dSWarner Losh 789*f439973dSWarner Losh UINT64 CRMD; // CuRrent MoDe information 790*f439973dSWarner Losh UINT64 PRMD; // PRe-exception MoDe information 791*f439973dSWarner Losh UINT64 EUEN; // Extended component Unit ENable 792*f439973dSWarner Losh UINT64 MISC; // MISCellaneous controller 793*f439973dSWarner Losh UINT64 ECFG; // Exception ConFiGuration 794*f439973dSWarner Losh UINT64 ESTAT; // Exception STATus 795*f439973dSWarner Losh UINT64 ERA; // Exception Return Address 796*f439973dSWarner Losh UINT64 BADV; // BAD Virtual address 797*f439973dSWarner Losh UINT64 BADI; // BAD Instruction 798*f439973dSWarner Losh } EFI_SYSTEM_CONTEXT_LOONGARCH64; 799*f439973dSWarner Losh 800*f439973dSWarner Losh /// 801*f439973dSWarner Losh /// Universal EFI_SYSTEM_CONTEXT definition. 802*f439973dSWarner Losh /// 803*f439973dSWarner Losh typedef union { 804*f439973dSWarner Losh EFI_SYSTEM_CONTEXT_EBC *SystemContextEbc; 805*f439973dSWarner Losh EFI_SYSTEM_CONTEXT_IA32 *SystemContextIa32; 806*f439973dSWarner Losh EFI_SYSTEM_CONTEXT_X64 *SystemContextX64; 807*f439973dSWarner Losh EFI_SYSTEM_CONTEXT_IPF *SystemContextIpf; 808*f439973dSWarner Losh EFI_SYSTEM_CONTEXT_ARM *SystemContextArm; 809*f439973dSWarner Losh EFI_SYSTEM_CONTEXT_AARCH64 *SystemContextAArch64; 810*f439973dSWarner Losh EFI_SYSTEM_CONTEXT_RISCV64 *SystemContextRiscV64; 811*f439973dSWarner Losh EFI_SYSTEM_CONTEXT_LOONGARCH64 *SystemContextLoongArch64; 812*f439973dSWarner Losh } EFI_SYSTEM_CONTEXT; 813*f439973dSWarner Losh 814*f439973dSWarner Losh // 815*f439973dSWarner Losh // DebugSupport callback function prototypes 816*f439973dSWarner Losh // 817*f439973dSWarner Losh 818*f439973dSWarner Losh /** 819*f439973dSWarner Losh Registers and enables an exception callback function for the specified exception. 820*f439973dSWarner Losh 821*f439973dSWarner Losh @param ExceptionType Exception types in EBC, IA-32, x64, or IPF. 822*f439973dSWarner Losh @param SystemContext Exception content. 823*f439973dSWarner Losh 824*f439973dSWarner Losh **/ 825*f439973dSWarner Losh typedef 826*f439973dSWarner Losh VOID 827*f439973dSWarner Losh (EFIAPI *EFI_EXCEPTION_CALLBACK)( 828*f439973dSWarner Losh IN EFI_EXCEPTION_TYPE ExceptionType, 829*f439973dSWarner Losh IN OUT EFI_SYSTEM_CONTEXT SystemContext 830*f439973dSWarner Losh ); 831*f439973dSWarner Losh 832*f439973dSWarner Losh /** 833*f439973dSWarner Losh Registers and enables the on-target debug agent's periodic entry point. 834*f439973dSWarner Losh 835*f439973dSWarner Losh @param SystemContext Exception content. 836*f439973dSWarner Losh 837*f439973dSWarner Losh **/ 838*f439973dSWarner Losh typedef 839*f439973dSWarner Losh VOID 840*f439973dSWarner Losh (EFIAPI *EFI_PERIODIC_CALLBACK)( 841*f439973dSWarner Losh IN OUT EFI_SYSTEM_CONTEXT SystemContext 842*f439973dSWarner Losh ); 843*f439973dSWarner Losh 844*f439973dSWarner Losh /// 845*f439973dSWarner Losh /// Machine type definition 846*f439973dSWarner Losh /// 847*f439973dSWarner Losh typedef enum { 848*f439973dSWarner Losh IsaIa32 = IMAGE_FILE_MACHINE_I386, ///< 0x014C 849*f439973dSWarner Losh IsaX64 = IMAGE_FILE_MACHINE_X64, ///< 0x8664 850*f439973dSWarner Losh IsaIpf = IMAGE_FILE_MACHINE_IA64, ///< 0x0200 851*f439973dSWarner Losh IsaEbc = IMAGE_FILE_MACHINE_EBC, ///< 0x0EBC 852*f439973dSWarner Losh IsaArm = IMAGE_FILE_MACHINE_ARMTHUMB_MIXED, ///< 0x01c2 853*f439973dSWarner Losh IsaAArch64 = IMAGE_FILE_MACHINE_ARM64 ///< 0xAA64 854*f439973dSWarner Losh } EFI_INSTRUCTION_SET_ARCHITECTURE; 855*f439973dSWarner Losh 856*f439973dSWarner Losh // 857*f439973dSWarner Losh // DebugSupport member function definitions 858*f439973dSWarner Losh // 859*f439973dSWarner Losh 860*f439973dSWarner Losh /** 861*f439973dSWarner Losh Returns the maximum value that may be used for the ProcessorIndex parameter in 862*f439973dSWarner Losh RegisterPeriodicCallback() and RegisterExceptionCallback(). 863*f439973dSWarner Losh 864*f439973dSWarner Losh @param This A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance. 865*f439973dSWarner Losh @param MaxProcessorIndex Pointer to a caller-allocated UINTN in which the maximum supported 866*f439973dSWarner Losh processor index is returned. 867*f439973dSWarner Losh 868*f439973dSWarner Losh @retval EFI_SUCCESS The function completed successfully. 869*f439973dSWarner Losh 870*f439973dSWarner Losh **/ 871*f439973dSWarner Losh typedef 872*f439973dSWarner Losh EFI_STATUS 873*f439973dSWarner Losh (EFIAPI *EFI_GET_MAXIMUM_PROCESSOR_INDEX)( 874*f439973dSWarner Losh IN EFI_DEBUG_SUPPORT_PROTOCOL *This, 875*f439973dSWarner Losh OUT UINTN *MaxProcessorIndex 876*f439973dSWarner Losh ); 877*f439973dSWarner Losh 878*f439973dSWarner Losh /** 879*f439973dSWarner Losh Registers a function to be called back periodically in interrupt context. 880*f439973dSWarner Losh 881*f439973dSWarner Losh @param This A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance. 882*f439973dSWarner Losh @param ProcessorIndex Specifies which processor the callback function applies to. 883*f439973dSWarner Losh @param PeriodicCallback A pointer to a function of type PERIODIC_CALLBACK that is the main 884*f439973dSWarner Losh periodic entry point of the debug agent. 885*f439973dSWarner Losh 886*f439973dSWarner Losh @retval EFI_SUCCESS The function completed successfully. 887*f439973dSWarner Losh @retval EFI_ALREADY_STARTED Non-NULL PeriodicCallback parameter when a callback 888*f439973dSWarner Losh function was previously registered. 889*f439973dSWarner Losh @retval EFI_OUT_OF_RESOURCES System has insufficient memory resources to register new callback 890*f439973dSWarner Losh function. 891*f439973dSWarner Losh 892*f439973dSWarner Losh **/ 893*f439973dSWarner Losh typedef 894*f439973dSWarner Losh EFI_STATUS 895*f439973dSWarner Losh (EFIAPI *EFI_REGISTER_PERIODIC_CALLBACK)( 896*f439973dSWarner Losh IN EFI_DEBUG_SUPPORT_PROTOCOL *This, 897*f439973dSWarner Losh IN UINTN ProcessorIndex, 898*f439973dSWarner Losh IN EFI_PERIODIC_CALLBACK PeriodicCallback 899*f439973dSWarner Losh ); 900*f439973dSWarner Losh 901*f439973dSWarner Losh /** 902*f439973dSWarner Losh Registers a function to be called when a given processor exception occurs. 903*f439973dSWarner Losh 904*f439973dSWarner Losh @param This A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance. 905*f439973dSWarner Losh @param ProcessorIndex Specifies which processor the callback function applies to. 906*f439973dSWarner Losh @param ExceptionCallback A pointer to a function of type EXCEPTION_CALLBACK that is called 907*f439973dSWarner Losh when the processor exception specified by ExceptionType occurs. 908*f439973dSWarner Losh @param ExceptionType Specifies which processor exception to hook. 909*f439973dSWarner Losh 910*f439973dSWarner Losh @retval EFI_SUCCESS The function completed successfully. 911*f439973dSWarner Losh @retval EFI_ALREADY_STARTED Non-NULL PeriodicCallback parameter when a callback 912*f439973dSWarner Losh function was previously registered. 913*f439973dSWarner Losh @retval EFI_OUT_OF_RESOURCES System has insufficient memory resources to register new callback 914*f439973dSWarner Losh function. 915*f439973dSWarner Losh 916*f439973dSWarner Losh **/ 917*f439973dSWarner Losh typedef 918*f439973dSWarner Losh EFI_STATUS 919*f439973dSWarner Losh (EFIAPI *EFI_REGISTER_EXCEPTION_CALLBACK)( 920*f439973dSWarner Losh IN EFI_DEBUG_SUPPORT_PROTOCOL *This, 921*f439973dSWarner Losh IN UINTN ProcessorIndex, 922*f439973dSWarner Losh IN EFI_EXCEPTION_CALLBACK ExceptionCallback, 923*f439973dSWarner Losh IN EFI_EXCEPTION_TYPE ExceptionType 924*f439973dSWarner Losh ); 925*f439973dSWarner Losh 926*f439973dSWarner Losh /** 927*f439973dSWarner Losh Invalidates processor instruction cache for a memory range. Subsequent execution in this range 928*f439973dSWarner Losh causes a fresh memory fetch to retrieve code to be executed. 929*f439973dSWarner Losh 930*f439973dSWarner Losh @param This A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance. 931*f439973dSWarner Losh @param ProcessorIndex Specifies which processor's instruction cache is to be invalidated. 932*f439973dSWarner Losh @param Start Specifies the physical base of the memory range to be invalidated. 933*f439973dSWarner Losh @param Length Specifies the minimum number of bytes in the processor's instruction 934*f439973dSWarner Losh cache to invalidate. 935*f439973dSWarner Losh 936*f439973dSWarner Losh @retval EFI_SUCCESS The function completed successfully. 937*f439973dSWarner Losh 938*f439973dSWarner Losh **/ 939*f439973dSWarner Losh typedef 940*f439973dSWarner Losh EFI_STATUS 941*f439973dSWarner Losh (EFIAPI *EFI_INVALIDATE_INSTRUCTION_CACHE)( 942*f439973dSWarner Losh IN EFI_DEBUG_SUPPORT_PROTOCOL *This, 943*f439973dSWarner Losh IN UINTN ProcessorIndex, 944*f439973dSWarner Losh IN VOID *Start, 945*f439973dSWarner Losh IN UINT64 Length 946*f439973dSWarner Losh ); 947*f439973dSWarner Losh 948*f439973dSWarner Losh /// 949*f439973dSWarner Losh /// This protocol provides the services to allow the debug agent to register 950*f439973dSWarner Losh /// callback functions that are called either periodically or when specific 951*f439973dSWarner Losh /// processor exceptions occur. 952*f439973dSWarner Losh /// 953*f439973dSWarner Losh struct _EFI_DEBUG_SUPPORT_PROTOCOL { 954*f439973dSWarner Losh /// 955*f439973dSWarner Losh /// Declares the processor architecture for this instance of the EFI Debug Support protocol. 956*f439973dSWarner Losh /// 957*f439973dSWarner Losh EFI_INSTRUCTION_SET_ARCHITECTURE Isa; 958*f439973dSWarner Losh EFI_GET_MAXIMUM_PROCESSOR_INDEX GetMaximumProcessorIndex; 959*f439973dSWarner Losh EFI_REGISTER_PERIODIC_CALLBACK RegisterPeriodicCallback; 960*f439973dSWarner Losh EFI_REGISTER_EXCEPTION_CALLBACK RegisterExceptionCallback; 961*f439973dSWarner Losh EFI_INVALIDATE_INSTRUCTION_CACHE InvalidateInstructionCache; 962*f439973dSWarner Losh }; 963*f439973dSWarner Losh 964*f439973dSWarner Losh extern EFI_GUID gEfiDebugSupportProtocolGuid; 965*f439973dSWarner Losh 966*f439973dSWarner Losh #endif 967