Path: blob/main/sys/contrib/edk2/Include/Protocol/DebugSupport.h
96339 views
/** @file1DebugSupport protocol and supporting definitions as defined in the UEFI2.42specification.34The DebugSupport protocol is used by source level debuggers to abstract the5processor and handle context save and restore operations.67Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>8Portions copyright (c) 2011 - 2013, ARM Ltd. All rights reserved.<BR>9Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights reserved.<BR>1011SPDX-License-Identifier: BSD-2-Clause-Patent1213**/1415#ifndef __DEBUG_SUPPORT_H__16#define __DEBUG_SUPPORT_H__1718#include <IndustryStandard/PeImage.h>1920typedef struct _EFI_DEBUG_SUPPORT_PROTOCOL EFI_DEBUG_SUPPORT_PROTOCOL;2122///23/// Debug Support protocol {2755590C-6F3C-42FA-9EA4-A3BA543CDA25}.24///25#define EFI_DEBUG_SUPPORT_PROTOCOL_GUID \26{ \270x2755590C, 0x6F3C, 0x42FA, {0x9E, 0xA4, 0xA3, 0xBA, 0x54, 0x3C, 0xDA, 0x25 } \28}2930///31/// Processor exception to be hooked.32/// All exception types for IA32, X64, Itanium and EBC processors are defined.33///34typedef INTN EFI_EXCEPTION_TYPE;3536///37/// IA-32 processor exception types.38///39#define EXCEPT_IA32_DIVIDE_ERROR 040#define EXCEPT_IA32_DEBUG 141#define EXCEPT_IA32_NMI 242#define EXCEPT_IA32_BREAKPOINT 343#define EXCEPT_IA32_OVERFLOW 444#define EXCEPT_IA32_BOUND 545#define EXCEPT_IA32_INVALID_OPCODE 646#define EXCEPT_IA32_DOUBLE_FAULT 847#define EXCEPT_IA32_INVALID_TSS 1048#define EXCEPT_IA32_SEG_NOT_PRESENT 1149#define EXCEPT_IA32_STACK_FAULT 1250#define EXCEPT_IA32_GP_FAULT 1351#define EXCEPT_IA32_PAGE_FAULT 1452#define EXCEPT_IA32_FP_ERROR 1653#define EXCEPT_IA32_ALIGNMENT_CHECK 1754#define EXCEPT_IA32_MACHINE_CHECK 1855#define EXCEPT_IA32_SIMD 195657///58/// FXSAVE_STATE.59/// FP / MMX / XMM registers (see fxrstor instruction definition).60///61typedef struct {62UINT16 Fcw;63UINT16 Fsw;64UINT16 Ftw;65UINT16 Opcode;66UINT32 Eip;67UINT16 Cs;68UINT16 Reserved1;69UINT32 DataOffset;70UINT16 Ds;71UINT8 Reserved2[10];72UINT8 St0Mm0[10], Reserved3[6];73UINT8 St1Mm1[10], Reserved4[6];74UINT8 St2Mm2[10], Reserved5[6];75UINT8 St3Mm3[10], Reserved6[6];76UINT8 St4Mm4[10], Reserved7[6];77UINT8 St5Mm5[10], Reserved8[6];78UINT8 St6Mm6[10], Reserved9[6];79UINT8 St7Mm7[10], Reserved10[6];80UINT8 Xmm0[16];81UINT8 Xmm1[16];82UINT8 Xmm2[16];83UINT8 Xmm3[16];84UINT8 Xmm4[16];85UINT8 Xmm5[16];86UINT8 Xmm6[16];87UINT8 Xmm7[16];88UINT8 Reserved11[14 * 16];89} EFI_FX_SAVE_STATE_IA32;9091///92/// IA-32 processor context definition.93///94typedef struct {95UINT32 ExceptionData;96EFI_FX_SAVE_STATE_IA32 FxSaveState;97UINT32 Dr0;98UINT32 Dr1;99UINT32 Dr2;100UINT32 Dr3;101UINT32 Dr6;102UINT32 Dr7;103UINT32 Cr0;104UINT32 Cr1; /* Reserved */105UINT32 Cr2;106UINT32 Cr3;107UINT32 Cr4;108UINT32 Eflags;109UINT32 Ldtr;110UINT32 Tr;111UINT32 Gdtr[2];112UINT32 Idtr[2];113UINT32 Eip;114UINT32 Gs;115UINT32 Fs;116UINT32 Es;117UINT32 Ds;118UINT32 Cs;119UINT32 Ss;120UINT32 Edi;121UINT32 Esi;122UINT32 Ebp;123UINT32 Esp;124UINT32 Ebx;125UINT32 Edx;126UINT32 Ecx;127UINT32 Eax;128} EFI_SYSTEM_CONTEXT_IA32;129130///131/// x64 processor exception types.132///133#define EXCEPT_X64_DIVIDE_ERROR 0134#define EXCEPT_X64_DEBUG 1135#define EXCEPT_X64_NMI 2136#define EXCEPT_X64_BREAKPOINT 3137#define EXCEPT_X64_OVERFLOW 4138#define EXCEPT_X64_BOUND 5139#define EXCEPT_X64_INVALID_OPCODE 6140#define EXCEPT_X64_DOUBLE_FAULT 8141#define EXCEPT_X64_INVALID_TSS 10142#define EXCEPT_X64_SEG_NOT_PRESENT 11143#define EXCEPT_X64_STACK_FAULT 12144#define EXCEPT_X64_GP_FAULT 13145#define EXCEPT_X64_PAGE_FAULT 14146#define EXCEPT_X64_FP_ERROR 16147#define EXCEPT_X64_ALIGNMENT_CHECK 17148#define EXCEPT_X64_MACHINE_CHECK 18149#define EXCEPT_X64_SIMD 19150151///152/// FXSAVE_STATE.153/// FP / MMX / XMM registers (see fxrstor instruction definition).154///155typedef struct {156UINT16 Fcw;157UINT16 Fsw;158UINT16 Ftw;159UINT16 Opcode;160UINT64 Rip;161UINT64 DataOffset;162UINT8 Reserved1[8];163UINT8 St0Mm0[10], Reserved2[6];164UINT8 St1Mm1[10], Reserved3[6];165UINT8 St2Mm2[10], Reserved4[6];166UINT8 St3Mm3[10], Reserved5[6];167UINT8 St4Mm4[10], Reserved6[6];168UINT8 St5Mm5[10], Reserved7[6];169UINT8 St6Mm6[10], Reserved8[6];170UINT8 St7Mm7[10], Reserved9[6];171UINT8 Xmm0[16];172UINT8 Xmm1[16];173UINT8 Xmm2[16];174UINT8 Xmm3[16];175UINT8 Xmm4[16];176UINT8 Xmm5[16];177UINT8 Xmm6[16];178UINT8 Xmm7[16];179//180// NOTE: UEFI 2.0 spec definition as follows.181//182UINT8 Reserved11[14 * 16];183} EFI_FX_SAVE_STATE_X64;184185///186/// x64 processor context definition.187///188typedef struct {189UINT64 ExceptionData;190EFI_FX_SAVE_STATE_X64 FxSaveState;191UINT64 Dr0;192UINT64 Dr1;193UINT64 Dr2;194UINT64 Dr3;195UINT64 Dr6;196UINT64 Dr7;197UINT64 Cr0;198UINT64 Cr1; /* Reserved */199UINT64 Cr2;200UINT64 Cr3;201UINT64 Cr4;202UINT64 Cr8;203UINT64 Rflags;204UINT64 Ldtr;205UINT64 Tr;206UINT64 Gdtr[2];207UINT64 Idtr[2];208UINT64 Rip;209UINT64 Gs;210UINT64 Fs;211UINT64 Es;212UINT64 Ds;213UINT64 Cs;214UINT64 Ss;215UINT64 Rdi;216UINT64 Rsi;217UINT64 Rbp;218UINT64 Rsp;219UINT64 Rbx;220UINT64 Rdx;221UINT64 Rcx;222UINT64 Rax;223UINT64 R8;224UINT64 R9;225UINT64 R10;226UINT64 R11;227UINT64 R12;228UINT64 R13;229UINT64 R14;230UINT64 R15;231} EFI_SYSTEM_CONTEXT_X64;232233///234/// Itanium Processor Family Exception types.235///236#define EXCEPT_IPF_VHTP_TRANSLATION 0237#define EXCEPT_IPF_INSTRUCTION_TLB 1238#define EXCEPT_IPF_DATA_TLB 2239#define EXCEPT_IPF_ALT_INSTRUCTION_TLB 3240#define EXCEPT_IPF_ALT_DATA_TLB 4241#define EXCEPT_IPF_DATA_NESTED_TLB 5242#define EXCEPT_IPF_INSTRUCTION_KEY_MISSED 6243#define EXCEPT_IPF_DATA_KEY_MISSED 7244#define EXCEPT_IPF_DIRTY_BIT 8245#define EXCEPT_IPF_INSTRUCTION_ACCESS_BIT 9246#define EXCEPT_IPF_DATA_ACCESS_BIT 10247#define EXCEPT_IPF_BREAKPOINT 11248#define EXCEPT_IPF_EXTERNAL_INTERRUPT 12249//250// 13 - 19 reserved251//252#define EXCEPT_IPF_PAGE_NOT_PRESENT 20253#define EXCEPT_IPF_KEY_PERMISSION 21254#define EXCEPT_IPF_INSTRUCTION_ACCESS_RIGHTS 22255#define EXCEPT_IPF_DATA_ACCESS_RIGHTS 23256#define EXCEPT_IPF_GENERAL_EXCEPTION 24257#define EXCEPT_IPF_DISABLED_FP_REGISTER 25258#define EXCEPT_IPF_NAT_CONSUMPTION 26259#define EXCEPT_IPF_SPECULATION 27260//261// 28 reserved262//263#define EXCEPT_IPF_DEBUG 29264#define EXCEPT_IPF_UNALIGNED_REFERENCE 30265#define EXCEPT_IPF_UNSUPPORTED_DATA_REFERENCE 31266#define EXCEPT_IPF_FP_FAULT 32267#define EXCEPT_IPF_FP_TRAP 33268#define EXCEPT_IPF_LOWER_PRIVILEGE_TRANSFER_TRAP 34269#define EXCEPT_IPF_TAKEN_BRANCH 35270#define EXCEPT_IPF_SINGLE_STEP 36271//272// 37 - 44 reserved273//274#define EXCEPT_IPF_IA32_EXCEPTION 45275#define EXCEPT_IPF_IA32_INTERCEPT 46276#define EXCEPT_IPF_IA32_INTERRUPT 47277278///279/// IPF processor context definition.280///281typedef struct {282//283// The first reserved field is necessary to preserve alignment for the correct284// bits in UNAT and to insure F2 is 16 byte aligned.285//286UINT64 Reserved;287UINT64 R1;288UINT64 R2;289UINT64 R3;290UINT64 R4;291UINT64 R5;292UINT64 R6;293UINT64 R7;294UINT64 R8;295UINT64 R9;296UINT64 R10;297UINT64 R11;298UINT64 R12;299UINT64 R13;300UINT64 R14;301UINT64 R15;302UINT64 R16;303UINT64 R17;304UINT64 R18;305UINT64 R19;306UINT64 R20;307UINT64 R21;308UINT64 R22;309UINT64 R23;310UINT64 R24;311UINT64 R25;312UINT64 R26;313UINT64 R27;314UINT64 R28;315UINT64 R29;316UINT64 R30;317UINT64 R31;318319UINT64 F2[2];320UINT64 F3[2];321UINT64 F4[2];322UINT64 F5[2];323UINT64 F6[2];324UINT64 F7[2];325UINT64 F8[2];326UINT64 F9[2];327UINT64 F10[2];328UINT64 F11[2];329UINT64 F12[2];330UINT64 F13[2];331UINT64 F14[2];332UINT64 F15[2];333UINT64 F16[2];334UINT64 F17[2];335UINT64 F18[2];336UINT64 F19[2];337UINT64 F20[2];338UINT64 F21[2];339UINT64 F22[2];340UINT64 F23[2];341UINT64 F24[2];342UINT64 F25[2];343UINT64 F26[2];344UINT64 F27[2];345UINT64 F28[2];346UINT64 F29[2];347UINT64 F30[2];348UINT64 F31[2];349350UINT64 Pr;351352UINT64 B0;353UINT64 B1;354UINT64 B2;355UINT64 B3;356UINT64 B4;357UINT64 B5;358UINT64 B6;359UINT64 B7;360361//362// application registers363//364UINT64 ArRsc;365UINT64 ArBsp;366UINT64 ArBspstore;367UINT64 ArRnat;368369UINT64 ArFcr;370371UINT64 ArEflag;372UINT64 ArCsd;373UINT64 ArSsd;374UINT64 ArCflg;375UINT64 ArFsr;376UINT64 ArFir;377UINT64 ArFdr;378379UINT64 ArCcv;380381UINT64 ArUnat;382383UINT64 ArFpsr;384385UINT64 ArPfs;386UINT64 ArLc;387UINT64 ArEc;388389//390// control registers391//392UINT64 CrDcr;393UINT64 CrItm;394UINT64 CrIva;395UINT64 CrPta;396UINT64 CrIpsr;397UINT64 CrIsr;398UINT64 CrIip;399UINT64 CrIfa;400UINT64 CrItir;401UINT64 CrIipa;402UINT64 CrIfs;403UINT64 CrIim;404UINT64 CrIha;405406//407// debug registers408//409UINT64 Dbr0;410UINT64 Dbr1;411UINT64 Dbr2;412UINT64 Dbr3;413UINT64 Dbr4;414UINT64 Dbr5;415UINT64 Dbr6;416UINT64 Dbr7;417418UINT64 Ibr0;419UINT64 Ibr1;420UINT64 Ibr2;421UINT64 Ibr3;422UINT64 Ibr4;423UINT64 Ibr5;424UINT64 Ibr6;425UINT64 Ibr7;426427//428// virtual registers - nat bits for R1-R31429//430UINT64 IntNat;431} EFI_SYSTEM_CONTEXT_IPF;432433///434/// EBC processor exception types.435///436#define EXCEPT_EBC_UNDEFINED 0437#define EXCEPT_EBC_DIVIDE_ERROR 1438#define EXCEPT_EBC_DEBUG 2439#define EXCEPT_EBC_BREAKPOINT 3440#define EXCEPT_EBC_OVERFLOW 4441#define EXCEPT_EBC_INVALID_OPCODE 5 ///< Opcode out of range.442#define EXCEPT_EBC_STACK_FAULT 6443#define EXCEPT_EBC_ALIGNMENT_CHECK 7444#define EXCEPT_EBC_INSTRUCTION_ENCODING 8 ///< Malformed instruction.445#define EXCEPT_EBC_BAD_BREAK 9 ///< BREAK 0 or undefined BREAK.446#define EXCEPT_EBC_STEP 10 ///< To support debug stepping.447///448/// For coding convenience, define the maximum valid EBC exception.449///450#define MAX_EBC_EXCEPTION EXCEPT_EBC_STEP451452///453/// EBC processor context definition.454///455typedef struct {456UINT64 R0;457UINT64 R1;458UINT64 R2;459UINT64 R3;460UINT64 R4;461UINT64 R5;462UINT64 R6;463UINT64 R7;464UINT64 Flags;465UINT64 ControlFlags;466UINT64 Ip;467} EFI_SYSTEM_CONTEXT_EBC;468469///470/// ARM processor exception types.471///472#define EXCEPT_ARM_RESET 0473#define EXCEPT_ARM_UNDEFINED_INSTRUCTION 1474#define EXCEPT_ARM_SOFTWARE_INTERRUPT 2475#define EXCEPT_ARM_PREFETCH_ABORT 3476#define EXCEPT_ARM_DATA_ABORT 4477#define EXCEPT_ARM_RESERVED 5478#define EXCEPT_ARM_IRQ 6479#define EXCEPT_ARM_FIQ 7480481///482/// For coding convenience, define the maximum valid ARM exception.483///484#define MAX_ARM_EXCEPTION EXCEPT_ARM_FIQ485486///487/// ARM processor context definition.488///489typedef struct {490UINT32 R0;491UINT32 R1;492UINT32 R2;493UINT32 R3;494UINT32 R4;495UINT32 R5;496UINT32 R6;497UINT32 R7;498UINT32 R8;499UINT32 R9;500UINT32 R10;501UINT32 R11;502UINT32 R12;503UINT32 SP;504UINT32 LR;505UINT32 PC;506UINT32 CPSR;507UINT32 DFSR;508UINT32 DFAR;509UINT32 IFSR;510UINT32 IFAR;511} EFI_SYSTEM_CONTEXT_ARM;512513///514/// AARCH64 processor exception types.515///516#define EXCEPT_AARCH64_SYNCHRONOUS_EXCEPTIONS 0517#define EXCEPT_AARCH64_IRQ 1518#define EXCEPT_AARCH64_FIQ 2519#define EXCEPT_AARCH64_SERROR 3520521///522/// For coding convenience, define the maximum valid ARM exception.523///524#define MAX_AARCH64_EXCEPTION EXCEPT_AARCH64_SERROR525526typedef struct {527// General Purpose Registers528UINT64 X0;529UINT64 X1;530UINT64 X2;531UINT64 X3;532UINT64 X4;533UINT64 X5;534UINT64 X6;535UINT64 X7;536UINT64 X8;537UINT64 X9;538UINT64 X10;539UINT64 X11;540UINT64 X12;541UINT64 X13;542UINT64 X14;543UINT64 X15;544UINT64 X16;545UINT64 X17;546UINT64 X18;547UINT64 X19;548UINT64 X20;549UINT64 X21;550UINT64 X22;551UINT64 X23;552UINT64 X24;553UINT64 X25;554UINT64 X26;555UINT64 X27;556UINT64 X28;557UINT64 FP; // x29 - Frame pointer558UINT64 LR; // x30 - Link Register559UINT64 SP; // x31 - Stack pointer560561// FP/SIMD Registers562UINT64 V0[2];563UINT64 V1[2];564UINT64 V2[2];565UINT64 V3[2];566UINT64 V4[2];567UINT64 V5[2];568UINT64 V6[2];569UINT64 V7[2];570UINT64 V8[2];571UINT64 V9[2];572UINT64 V10[2];573UINT64 V11[2];574UINT64 V12[2];575UINT64 V13[2];576UINT64 V14[2];577UINT64 V15[2];578UINT64 V16[2];579UINT64 V17[2];580UINT64 V18[2];581UINT64 V19[2];582UINT64 V20[2];583UINT64 V21[2];584UINT64 V22[2];585UINT64 V23[2];586UINT64 V24[2];587UINT64 V25[2];588UINT64 V26[2];589UINT64 V27[2];590UINT64 V28[2];591UINT64 V29[2];592UINT64 V30[2];593UINT64 V31[2];594595UINT64 ELR; // Exception Link Register596UINT64 SPSR; // Saved Processor Status Register597UINT64 FPSR; // Floating Point Status Register598UINT64 ESR; // Exception syndrome register599UINT64 FAR; // Fault Address Register600} EFI_SYSTEM_CONTEXT_AARCH64;601602///603/// RISC-V processor exception types.604///605#define EXCEPT_RISCV_INST_MISALIGNED 0606#define EXCEPT_RISCV_INST_ACCESS_FAULT 1607#define EXCEPT_RISCV_ILLEGAL_INST 2608#define EXCEPT_RISCV_BREAKPOINT 3609#define EXCEPT_RISCV_LOAD_ADDRESS_MISALIGNED 4610#define EXCEPT_RISCV_LOAD_ACCESS_FAULT 5611#define EXCEPT_RISCV_STORE_AMO_ADDRESS_MISALIGNED 6612#define EXCEPT_RISCV_STORE_AMO_ACCESS_FAULT 7613#define EXCEPT_RISCV_ENV_CALL_FROM_UMODE 8614#define EXCEPT_RISCV_ENV_CALL_FROM_SMODE 9615#define EXCEPT_RISCV_ENV_CALL_FROM_VS_MODE 10616#define EXCEPT_RISCV_ENV_CALL_FROM_MMODE 11617#define EXCEPT_RISCV_INST_ACCESS_PAGE_FAULT 12618#define EXCEPT_RISCV_LOAD_ACCESS_PAGE_FAULT 13619#define EXCEPT_RISCV_14 14620#define EXCEPT_RISCV_STORE_ACCESS_PAGE_FAULT 15621#define EXCEPT_RISCV_16 16622#define EXCEPT_RISCV_17 17623#define EXCEPT_RISCV_18 18624#define EXCEPT_RISCV_19 19625#define EXCEPT_RISCV_INST_GUEST_PAGE_FAULT 20626#define EXCEPT_RISCV_LOAD_GUEST_PAGE_FAULT 21627#define EXCEPT_RISCV_VIRTUAL_INSTRUCTION 22628#define EXCEPT_RISCV_STORE_GUEST_PAGE_FAULT 23629#define EXCEPT_RISCV_MAX_EXCEPTIONS (EXCEPT_RISCV_STORE_GUEST_PAGE_FAULT)630631///632/// RISC-V processor exception types for interrupts.633///634#define EXCEPT_RISCV_IS_IRQ(x) ((x & 0x8000000000000000UL) != 0)635#define EXCEPT_RISCV_IRQ_INDEX(x) (x & 0x7FFFFFFFFFFFFFFFUL)636#define EXCEPT_RISCV_IRQ_0 0x8000000000000000UL637#define EXCEPT_RISCV_IRQ_SOFT_FROM_SMODE 0x8000000000000001UL638#define EXCEPT_RISCV_IRQ_SOFT_FROM_VSMODE 0x8000000000000002UL639#define EXCEPT_RISCV_IRQ_SOFT_FROM_MMODE 0x8000000000000003UL640#define EXCEPT_RISCV_IRQ_4 0x8000000000000004UL641#define EXCEPT_RISCV_IRQ_TIMER_FROM_SMODE 0x8000000000000005UL642#define EXCEPT_RISCV_MAX_IRQS (EXCEPT_RISCV_IRQ_INDEX(EXCEPT_RISCV_IRQ_TIMER_FROM_SMODE))643644typedef struct {645UINT64 X0;646UINT64 X1;647UINT64 X2;648UINT64 X3;649UINT64 X4;650UINT64 X5;651UINT64 X6;652UINT64 X7;653UINT64 X8;654UINT64 X9;655UINT64 X10;656UINT64 X11;657UINT64 X12;658UINT64 X13;659UINT64 X14;660UINT64 X15;661UINT64 X16;662UINT64 X17;663UINT64 X18;664UINT64 X19;665UINT64 X20;666UINT64 X21;667UINT64 X22;668UINT64 X23;669UINT64 X24;670UINT64 X25;671UINT64 X26;672UINT64 X27;673UINT64 X28;674UINT64 X29;675UINT64 X30;676UINT64 X31;677UINT64 SEPC;678UINT32 SSTATUS;679UINT32 STVAL;680} EFI_SYSTEM_CONTEXT_RISCV64;681682///683/// LoongArch processor exception types.684///685/// The exception types is located in the CSR ESTAT686/// register offset 16 bits, width 6 bits.687///688/// If you want to register an exception hook, you can689/// shfit the number left by 16 bits, and the exception690/// handler will know the types.691///692/// For example:693/// mCpu->CpuRegisterInterruptHandler (694/// mCpu,695/// (EXCEPT_LOONGARCH_PPI << CSR_ESTAT_EXC_SHIFT),696/// PpiExceptionHandler697/// );698///699#define EXCEPT_LOONGARCH_INT 0700#define EXCEPT_LOONGARCH_PIL 1701#define EXCEPT_LOONGARCH_PIS 2702#define EXCEPT_LOONGARCH_PIF 3703#define EXCEPT_LOONGARCH_PME 4704#define EXCEPT_LOONGARCH_PNR 5705#define EXCEPT_LOONGARCH_PNX 6706#define EXCEPT_LOONGARCH_PPI 7707#define EXCEPT_LOONGARCH_ADE 8708#define EXCEPT_LOONGARCH_ALE 9709#define EXCEPT_LOONGARCH_BCE 10710#define EXCEPT_LOONGARCH_SYS 11711#define EXCEPT_LOONGARCH_BRK 12712#define EXCEPT_LOONGARCH_INE 13713#define EXCEPT_LOONGARCH_IPE 14714#define EXCEPT_LOONGARCH_FPD 15715#define EXCEPT_LOONGARCH_SXD 16716#define EXCEPT_LOONGARCH_ASXD 17717#define EXCEPT_LOONGARCH_FPE 18718#define EXCEPT_LOONGARCH_WPE 19719#define EXCEPT_LOONGARCH_BTD 20720#define EXCEPT_LOONGARCH_BTE 21721#define EXCEPT_LOONGARCH_GSPR 22722#define EXCEPT_LOONGARCH_HVC 23723#define EXCEPT_LOONGARCH_GCXC 24724725///726/// For coding convenience, define the maximum valid727/// LoongArch exception.728///729#define MAX_LOONGARCH_EXCEPTION 64730731///732/// LoongArch processor Interrupt types.733///734#define EXCEPT_LOONGARCH_INT_SIP0 0735#define EXCEPT_LOONGARCH_INT_SIP1 1736#define EXCEPT_LOONGARCH_INT_IP0 2737#define EXCEPT_LOONGARCH_INT_IP1 3738#define EXCEPT_LOONGARCH_INT_IP2 4739#define EXCEPT_LOONGARCH_INT_IP3 5740#define EXCEPT_LOONGARCH_INT_IP4 6741#define EXCEPT_LOONGARCH_INT_IP5 7742#define EXCEPT_LOONGARCH_INT_IP6 8743#define EXCEPT_LOONGARCH_INT_IP7 9744#define EXCEPT_LOONGARCH_INT_PMC 10745#define EXCEPT_LOONGARCH_INT_TIMER 11746#define EXCEPT_LOONGARCH_INT_IPI 12747748///749/// For coding convenience, define the maximum valid750/// LoongArch interrupt.751///752#define MAX_LOONGARCH_INTERRUPT 16753754typedef struct {755UINT64 R0;756UINT64 R1;757UINT64 R2;758UINT64 R3;759UINT64 R4;760UINT64 R5;761UINT64 R6;762UINT64 R7;763UINT64 R8;764UINT64 R9;765UINT64 R10;766UINT64 R11;767UINT64 R12;768UINT64 R13;769UINT64 R14;770UINT64 R15;771UINT64 R16;772UINT64 R17;773UINT64 R18;774UINT64 R19;775UINT64 R20;776UINT64 R21;777UINT64 R22;778UINT64 R23;779UINT64 R24;780UINT64 R25;781UINT64 R26;782UINT64 R27;783UINT64 R28;784UINT64 R29;785UINT64 R30;786UINT64 R31;787788UINT64 CRMD; // CuRrent MoDe information789UINT64 PRMD; // PRe-exception MoDe information790UINT64 EUEN; // Extended component Unit ENable791UINT64 MISC; // MISCellaneous controller792UINT64 ECFG; // Exception ConFiGuration793UINT64 ESTAT; // Exception STATus794UINT64 ERA; // Exception Return Address795UINT64 BADV; // BAD Virtual address796UINT64 BADI; // BAD Instruction797} EFI_SYSTEM_CONTEXT_LOONGARCH64;798799///800/// Universal EFI_SYSTEM_CONTEXT definition.801///802typedef union {803EFI_SYSTEM_CONTEXT_EBC *SystemContextEbc;804EFI_SYSTEM_CONTEXT_IA32 *SystemContextIa32;805EFI_SYSTEM_CONTEXT_X64 *SystemContextX64;806EFI_SYSTEM_CONTEXT_IPF *SystemContextIpf;807EFI_SYSTEM_CONTEXT_ARM *SystemContextArm;808EFI_SYSTEM_CONTEXT_AARCH64 *SystemContextAArch64;809EFI_SYSTEM_CONTEXT_RISCV64 *SystemContextRiscV64;810EFI_SYSTEM_CONTEXT_LOONGARCH64 *SystemContextLoongArch64;811} EFI_SYSTEM_CONTEXT;812813//814// DebugSupport callback function prototypes815//816817/**818Registers and enables an exception callback function for the specified exception.819820@param ExceptionType Exception types in EBC, IA-32, x64, or IPF.821@param SystemContext Exception content.822823**/824typedef825VOID826(EFIAPI *EFI_EXCEPTION_CALLBACK)(827IN EFI_EXCEPTION_TYPE ExceptionType,828IN OUT EFI_SYSTEM_CONTEXT SystemContext829);830831/**832Registers and enables the on-target debug agent's periodic entry point.833834@param SystemContext Exception content.835836**/837typedef838VOID839(EFIAPI *EFI_PERIODIC_CALLBACK)(840IN OUT EFI_SYSTEM_CONTEXT SystemContext841);842843///844/// Machine type definition845///846typedef enum {847IsaIa32 = IMAGE_FILE_MACHINE_I386, ///< 0x014C848IsaX64 = IMAGE_FILE_MACHINE_X64, ///< 0x8664849IsaIpf = IMAGE_FILE_MACHINE_IA64, ///< 0x0200850IsaEbc = IMAGE_FILE_MACHINE_EBC, ///< 0x0EBC851IsaArm = IMAGE_FILE_MACHINE_ARMTHUMB_MIXED, ///< 0x01c2852IsaAArch64 = IMAGE_FILE_MACHINE_ARM64 ///< 0xAA64853} EFI_INSTRUCTION_SET_ARCHITECTURE;854855//856// DebugSupport member function definitions857//858859/**860Returns the maximum value that may be used for the ProcessorIndex parameter in861RegisterPeriodicCallback() and RegisterExceptionCallback().862863@param This A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.864@param MaxProcessorIndex Pointer to a caller-allocated UINTN in which the maximum supported865processor index is returned.866867@retval EFI_SUCCESS The function completed successfully.868869**/870typedef871EFI_STATUS872(EFIAPI *EFI_GET_MAXIMUM_PROCESSOR_INDEX)(873IN EFI_DEBUG_SUPPORT_PROTOCOL *This,874OUT UINTN *MaxProcessorIndex875);876877/**878Registers a function to be called back periodically in interrupt context.879880@param This A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.881@param ProcessorIndex Specifies which processor the callback function applies to.882@param PeriodicCallback A pointer to a function of type PERIODIC_CALLBACK that is the main883periodic entry point of the debug agent.884885@retval EFI_SUCCESS The function completed successfully.886@retval EFI_ALREADY_STARTED Non-NULL PeriodicCallback parameter when a callback887function was previously registered.888@retval EFI_OUT_OF_RESOURCES System has insufficient memory resources to register new callback889function.890891**/892typedef893EFI_STATUS894(EFIAPI *EFI_REGISTER_PERIODIC_CALLBACK)(895IN EFI_DEBUG_SUPPORT_PROTOCOL *This,896IN UINTN ProcessorIndex,897IN EFI_PERIODIC_CALLBACK PeriodicCallback898);899900/**901Registers a function to be called when a given processor exception occurs.902903@param This A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.904@param ProcessorIndex Specifies which processor the callback function applies to.905@param ExceptionCallback A pointer to a function of type EXCEPTION_CALLBACK that is called906when the processor exception specified by ExceptionType occurs.907@param ExceptionType Specifies which processor exception to hook.908909@retval EFI_SUCCESS The function completed successfully.910@retval EFI_ALREADY_STARTED Non-NULL PeriodicCallback parameter when a callback911function was previously registered.912@retval EFI_OUT_OF_RESOURCES System has insufficient memory resources to register new callback913function.914915**/916typedef917EFI_STATUS918(EFIAPI *EFI_REGISTER_EXCEPTION_CALLBACK)(919IN EFI_DEBUG_SUPPORT_PROTOCOL *This,920IN UINTN ProcessorIndex,921IN EFI_EXCEPTION_CALLBACK ExceptionCallback,922IN EFI_EXCEPTION_TYPE ExceptionType923);924925/**926Invalidates processor instruction cache for a memory range. Subsequent execution in this range927causes a fresh memory fetch to retrieve code to be executed.928929@param This A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.930@param ProcessorIndex Specifies which processor's instruction cache is to be invalidated.931@param Start Specifies the physical base of the memory range to be invalidated.932@param Length Specifies the minimum number of bytes in the processor's instruction933cache to invalidate.934935@retval EFI_SUCCESS The function completed successfully.936937**/938typedef939EFI_STATUS940(EFIAPI *EFI_INVALIDATE_INSTRUCTION_CACHE)(941IN EFI_DEBUG_SUPPORT_PROTOCOL *This,942IN UINTN ProcessorIndex,943IN VOID *Start,944IN UINT64 Length945);946947///948/// This protocol provides the services to allow the debug agent to register949/// callback functions that are called either periodically or when specific950/// processor exceptions occur.951///952struct _EFI_DEBUG_SUPPORT_PROTOCOL {953///954/// Declares the processor architecture for this instance of the EFI Debug Support protocol.955///956EFI_INSTRUCTION_SET_ARCHITECTURE Isa;957EFI_GET_MAXIMUM_PROCESSOR_INDEX GetMaximumProcessorIndex;958EFI_REGISTER_PERIODIC_CALLBACK RegisterPeriodicCallback;959EFI_REGISTER_EXCEPTION_CALLBACK RegisterExceptionCallback;960EFI_INVALIDATE_INSTRUCTION_CACHE InvalidateInstructionCache;961};962963extern EFI_GUID gEfiDebugSupportProtocolGuid;964965#endif966967968