| // note from the spec: |
| // When the context record field is larger than the register being stored in it, the upper bits of the |
| // context record field are unused and ignored |
| /// Universal EFI_SYSTEM_CONTEXT definition |
| /// This is passed to debug callbacks |
| #[repr(C)] |
| #[allow(missing_debug_implementations)] |
| pub union SystemContext { |
| ebc: *mut SystemContextEBC, |
| riscv_32: *mut SystemContextRiscV32, |
| riscv_64: *mut SystemContextRiscV64, |
| riscv_128: *mut SystemContextRiscV128, |
| ia32: *mut SystemContextIA32, |
| x64: *mut SystemContextX64, |
| ipf: *mut SystemContextIPF, |
| arm: *mut SystemContextARM, |
| aarch64: *mut SystemContextAARCH64, |
| } |
| |
| /// System context for virtual EBC processors |
| #[repr(C)] |
| #[derive(Debug, Clone, Copy)] |
| pub struct SystemContextEBC { |
| r0: u64, |
| r1: u64, |
| r2: u64, |
| r3: u64, |
| r4: u64, |
| r5: u64, |
| r6: u64, |
| r7: u64, |
| flags: u64, |
| control_flags: u64, |
| ip: u64, |
| } |
| |
| #[repr(C)] |
| #[derive(Debug, Clone, Copy)] |
| pub struct SystemContextRiscV32 { |
| // Integer registers |
| zero: u32, |
| ra: u32, |
| sp: u32, |
| gp: u32, |
| tp: u32, |
| t0: u32, |
| t1: u32, |
| t2: u32, |
| s0fp: u32, |
| s1: u32, |
| a0: u32, |
| a1: u32, |
| a2: u32, |
| a3: u32, |
| a4: u32, |
| a5: u32, |
| a6: u32, |
| a7: u32, |
| s2: u32, |
| s3: u32, |
| s4: u32, |
| s5: u32, |
| s6: u32, |
| s7: u32, |
| s8: u32, |
| s9: u32, |
| s10: u32, |
| s11: u32, |
| t3: u32, |
| t4: u32, |
| t5: u32, |
| t6: u32, |
| // Float registers for F, D, and Q Standard Extensions |
| ft0: u128, |
| ft1: u128, |
| ft2: u128, |
| ft3: u128, |
| ft4: u128, |
| ft5: u128, |
| ft6: u128, |
| ft7: u128, |
| fs0: u128, |
| fs1: u128, |
| fa0: u128, |
| fa1: u128, |
| fa2: u128, |
| fa3: u128, |
| fa4: u128, |
| fa5: u128, |
| fa6: u128, |
| fa7: u128, |
| fs2: u128, |
| fs3: u128, |
| fs4: u128, |
| fs5: u128, |
| fs6: u128, |
| fs7: u128, |
| fs8: u128, |
| fs9: u128, |
| fs10: u128, |
| fs11: u128, |
| ft8: u128, |
| ft9: u128, |
| ft10: u128, |
| ft11: u128, |
| } |
| |
| #[repr(C)] |
| #[derive(Debug, Clone, Copy)] |
| pub struct SystemContextRiscV64 { |
| // Integer registers |
| zero: u64, |
| ra: u64, |
| sp: u64, |
| gp: u64, |
| tp: u64, |
| t0: u64, |
| t1: u64, |
| t2: u64, |
| s0fp: u64, |
| s1: u64, |
| a0: u64, |
| a1: u64, |
| a2: u64, |
| a3: u64, |
| a4: u64, |
| a5: u64, |
| a6: u64, |
| a7: u64, |
| s2: u64, |
| s3: u64, |
| s4: u64, |
| s5: u64, |
| s6: u64, |
| s7: u64, |
| s8: u64, |
| s9: u64, |
| s10: u64, |
| s11: u64, |
| t3: u64, |
| t4: u64, |
| t5: u64, |
| t6: u64, |
| // Floating registers for F, D, and Q Standard Extensions |
| ft0: u128, |
| ft1: u128, |
| ft2: u128, |
| ft3: u128, |
| ft4: u128, |
| ft5: u128, |
| ft6: u128, |
| ft7: u128, |
| fs0: u128, |
| fs1: u128, |
| fa0: u128, |
| fa1: u128, |
| fa2: u128, |
| fa3: u128, |
| fa4: u128, |
| fa5: u128, |
| fa6: u128, |
| fa7: u128, |
| fs2: u128, |
| fs3: u128, |
| fs4: u128, |
| fs5: u128, |
| fs6: u128, |
| fs7: u128, |
| fs8: u128, |
| fs9: u128, |
| fs10: u128, |
| fs11: u128, |
| ft8: u128, |
| ft9: u128, |
| ft10: u128, |
| ft11: u128, |
| } |
| |
| #[repr(C)] |
| #[derive(Debug, Clone, Copy)] |
| pub struct SystemContextRiscV128 { |
| // Integer registers |
| zero: u128, |
| ra: u128, |
| sp: u128, |
| gp: u128, |
| tp: u128, |
| t0: u128, |
| t1: u128, |
| t2: u128, |
| s0fp: u128, |
| s1: u128, |
| a0: u128, |
| a1: u128, |
| a2: u128, |
| a3: u128, |
| a4: u128, |
| a5: u128, |
| a6: u128, |
| a7: u128, |
| s2: u128, |
| s3: u128, |
| s4: u128, |
| s5: u128, |
| s6: u128, |
| s7: u128, |
| s8: u128, |
| s9: u128, |
| s10: u128, |
| s11: u128, |
| t3: u128, |
| t4: u128, |
| t5: u128, |
| t6: u128, |
| // Floating registers for F, D, and Q Standard Extensions |
| ft0: u128, |
| ft1: u128, |
| ft2: u128, |
| ft3: u128, |
| ft4: u128, |
| ft5: u128, |
| ft6: u128, |
| ft7: u128, |
| fs0: u128, |
| fs1: u128, |
| fa0: u128, |
| fa1: u128, |
| fa2: u128, |
| fa3: u128, |
| fa4: u128, |
| fa5: u128, |
| fa6: u128, |
| fa7: u128, |
| fs2: u128, |
| fs3: u128, |
| fs4: u128, |
| fs5: u128, |
| fs6: u128, |
| fs7: u128, |
| fs8: u128, |
| fs9: u128, |
| fs10: u128, |
| fs11: u128, |
| ft8: u128, |
| ft9: u128, |
| ft10: u128, |
| ft11: u128, |
| } |
| |
| /// System context for IA-32 processors (x86) |
| #[repr(C)] |
| #[derive(Debug, Clone, Copy)] |
| pub struct SystemContextIA32 { |
| exception_data: u32, // additional data pushed on the stack by some types of exceptions |
| fx_save_state: FxSaveStateIA32, |
| dr0: u32, |
| dr1: u32, |
| dr2: u32, |
| dr3: u32, |
| dr6: u32, |
| dr7: u32, |
| cr0: u32, |
| cr1: u32, // Noted as "Reserved" in the UEFI Specification |
| cr2: u32, |
| cr3: u32, |
| cr4: u32, |
| eflags: u32, |
| ldtr: u32, |
| tr: u32, |
| gdtr: [u32; 2], |
| idtr: [u32; 2], |
| eip: u32, |
| gs: u32, |
| fs: u32, |
| es: u32, |
| ds: u32, |
| cs: u32, |
| ss: u32, |
| edi: u32, |
| esi: u32, |
| ebp: u32, |
| esp: u32, |
| ebx: u32, |
| edx: u32, |
| ecx: u32, |
| eax: u32, |
| } |
| |
| /// FP / MMX / XMM registers for IA-32 |
| #[repr(C)] |
| #[derive(Debug, Clone, Copy)] |
| pub struct FxSaveStateIA32 { |
| fcw: u16, |
| fsw: u16, |
| ftw: u16, |
| opcode: u16, |
| eip: u32, |
| cs: u16, |
| reserved_1: u16, |
| data_offset: u32, |
| ds: u16, |
| reserved_2: [u8; 10], |
| st0mm0: [u8; 10], |
| reserved_3: [u8; 6], |
| st1mm1: [u8; 10], |
| reserved_4: [u8; 6], |
| st2mm2: [u8; 10], |
| reserved_5: [u8; 6], |
| st3mm3: [u8; 10], |
| reserved_6: [u8; 6], |
| st4mm4: [u8; 10], |
| reserved_7: [u8; 6], |
| st5mm5: [u8; 10], |
| reserved_8: [u8; 6], |
| st6mm6: [u8; 10], |
| reserved_9: [u8; 6], |
| st7mm7: [u8; 10], |
| reserved_10: [u8; 6], |
| xmm0: [u8; 16], |
| xmm1: [u8; 16], |
| xmm2: [u8; 16], |
| xmm3: [u8; 16], |
| xmm4: [u8; 16], |
| xmm5: [u8; 16], |
| xmm6: [u8; 16], |
| xmm7: [u8; 16], |
| reserved_11: [u8; 14 * 16], |
| } |
| |
| /// System context for x64 processors |
| #[repr(C)] |
| #[derive(Debug, Clone, Copy)] |
| pub struct SystemContextX64 { |
| exception_data: u64, // additional data pushed on the stack by some types of exceptions |
| fx_save_state: FxSaveStateX64, |
| dr0: u64, |
| dr1: u64, |
| dr2: u64, |
| dr3: u64, |
| dr6: u64, |
| dr7: u64, |
| cr0: u64, |
| cr1: u64, // Noted as "Reserved" in the UEFI Specification |
| cr2: u64, |
| cr3: u64, |
| cr4: u64, |
| cr8: u64, |
| rflags: u64, |
| ldtr: u64, |
| tr: u64, |
| gdtr: [u64; 2], |
| idtr: [u64; 2], |
| rip: u64, |
| gs: u64, |
| fs: u64, |
| es: u64, |
| ds: u64, |
| cs: u64, |
| ss: u64, |
| rdi: u64, |
| rsi: u64, |
| rbp: u64, |
| rsp: u64, |
| rbx: u64, |
| rdx: u64, |
| rcx: u64, |
| rax: u64, |
| r8: u64, |
| r9: u64, |
| r10: u64, |
| r11: u64, |
| r12: u64, |
| r13: u64, |
| r14: u64, |
| r15: u64, |
| } |
| |
| /// FP / MMX / XMM registers for X64 |
| #[repr(C)] |
| #[derive(Debug, Clone, Copy)] |
| pub struct FxSaveStateX64 { |
| fcw: u16, |
| fsw: u16, |
| ftw: u16, |
| opcode: u16, |
| rip: u64, |
| data_offset: u64, |
| reserved_1: [u8; 8], |
| st0mm0: [u8; 10], |
| reserved_2: [u8; 6], |
| st1mm1: [u8; 10], |
| reserved_3: [u8; 6], |
| st2mm2: [u8; 10], |
| reserved_4: [u8; 6], |
| st3mm3: [u8; 10], |
| reserved_5: [u8; 6], |
| st4mm4: [u8; 10], |
| reserved_6: [u8; 6], |
| st5mm5: [u8; 10], |
| reserved_7: [u8; 6], |
| st6mm6: [u8; 10], |
| reserved_8: [u8; 6], |
| st7mm7: [u8; 10], |
| reserved_9: [u8; 6], |
| xmm0: [u8; 16], |
| xmm1: [u8; 16], |
| xmm2: [u8; 16], |
| xmm3: [u8; 16], |
| xmm4: [u8; 16], |
| xmm5: [u8; 16], |
| xmm6: [u8; 16], |
| xmm7: [u8; 16], |
| reserved_11: [u8; 14 * 16], // spec goes right from `Reserved9` to `Reserved11` |
| } |
| |
| #[repr(C)] |
| #[derive(Debug, Clone, Copy)] |
| pub struct SystemContextIPF { |
| reserved: u64, |
| r1: u64, |
| r2: u64, |
| r3: u64, |
| r4: u64, |
| r5: u64, |
| r6: u64, |
| r7: u64, |
| r8: u64, |
| r9: u64, |
| r10: u64, |
| r11: u64, |
| r12: u64, |
| r13: u64, |
| r14: u64, |
| r15: u64, |
| r16: u64, |
| r17: u64, |
| r18: u64, |
| r19: u64, |
| r20: u64, |
| r21: u64, |
| r22: u64, |
| r23: u64, |
| r24: u64, |
| r25: u64, |
| r26: u64, |
| r27: u64, |
| r28: u64, |
| r29: u64, |
| r30: u64, |
| r31: u64, |
| f2: [u64; 2], |
| f3: [u64; 2], |
| f4: [u64; 2], |
| f5: [u64; 2], |
| f6: [u64; 2], |
| f7: [u64; 2], |
| f8: [u64; 2], |
| f9: [u64; 2], |
| f10: [u64; 2], |
| f11: [u64; 2], |
| f12: [u64; 2], |
| f13: [u64; 2], |
| f14: [u64; 2], |
| f15: [u64; 2], |
| f16: [u64; 2], |
| f17: [u64; 2], |
| f18: [u64; 2], |
| f19: [u64; 2], |
| f20: [u64; 2], |
| f21: [u64; 2], |
| f22: [u64; 2], |
| f23: [u64; 2], |
| f24: [u64; 2], |
| f25: [u64; 2], |
| f26: [u64; 2], |
| f27: [u64; 2], |
| f28: [u64; 2], |
| f29: [u64; 2], |
| f30: [u64; 2], |
| f31: [u64; 2], |
| pr: u64, |
| b0: u64, |
| b1: u64, |
| b2: u64, |
| b3: u64, |
| b4: u64, |
| b5: u64, |
| b6: u64, |
| b7: u64, |
| // application registers |
| ar_rsc: u64, |
| ar_bsp: u64, |
| ar_bspstore: u64, |
| ar_rnat: u64, |
| ar_fcr: u64, |
| ar_eflag: u64, |
| ar_csd: u64, |
| ar_ssd: u64, |
| ar_cflg: u64, |
| ar_fsr: u64, |
| ar_fir: u64, |
| ar_fdr: u64, |
| ar_ccv: u64, |
| ar_unat: u64, |
| ar_fpsr: u64, |
| ar_pfs: u64, |
| ar_lc: u64, |
| ar_ec: u64, |
| // control registers |
| cr_dcr: u64, |
| cr_itm: u64, |
| cr_iva: u64, |
| cr_pta: u64, |
| cr_ipsr: u64, |
| cr_isr: u64, |
| cr_iip: u64, |
| cr_ifa: u64, |
| cr_itir: u64, |
| cr_iipa: u64, |
| cr_ifs: u64, |
| cr_iim: u64, |
| cr_iha: u64, |
| // debug registers |
| dbr0: u64, |
| dbr1: u64, |
| dbr2: u64, |
| dbr3: u64, |
| dbr4: u64, |
| dbr5: u64, |
| dbr6: u64, |
| dbr7: u64, |
| ibr0: u64, |
| ibr1: u64, |
| ibr2: u64, |
| ibr3: u64, |
| ibr4: u64, |
| ibr5: u64, |
| ibr6: u64, |
| ibr7: u64, |
| // virtual Registers |
| int_nat: u64, // nat bits for r1-r31 |
| } |
| |
| /// System context for ARM processors |
| #[repr(C)] |
| #[derive(Debug, Clone, Copy)] |
| pub struct SystemContextARM { |
| r0: u32, |
| r1: u32, |
| r2: u32, |
| r3: u32, |
| r4: u32, |
| r5: u32, |
| r6: u32, |
| r7: u32, |
| r8: u32, |
| r9: u32, |
| r10: u32, |
| r11: u32, |
| r12: u32, |
| sp: u32, |
| lr: u32, |
| pc: u32, |
| cpsr: u32, |
| dfsr: u32, |
| dfar: u32, |
| ifsr: u32, |
| } |
| |
| /// System context for AARCH64 processors |
| #[repr(C)] |
| #[derive(Debug, Clone, Copy)] |
| pub struct SystemContextAARCH64 { |
| // General Purpose Registers |
| x0: u64, |
| x1: u64, |
| x2: u64, |
| x3: u64, |
| x4: u64, |
| x5: u64, |
| x6: u64, |
| x7: u64, |
| x8: u64, |
| x9: u64, |
| x10: u64, |
| x11: u64, |
| x12: u64, |
| x13: u64, |
| x14: u64, |
| x15: u64, |
| x16: u64, |
| x17: u64, |
| x18: u64, |
| x19: u64, |
| x20: u64, |
| x21: u64, |
| x22: u64, |
| x23: u64, |
| x24: u64, |
| x25: u64, |
| x26: u64, |
| x27: u64, |
| x28: u64, |
| fp: u64, // x29 - Frame Pointer |
| lr: u64, // x30 - Link Register |
| sp: u64, // x31 - Stack Pointer |
| // FP/SIMD Registers |
| v0: [u64; 2], |
| v1: [u64; 2], |
| v2: [u64; 2], |
| v3: [u64; 2], |
| v4: [u64; 2], |
| v5: [u64; 2], |
| v6: [u64; 2], |
| v7: [u64; 2], |
| v8: [u64; 2], |
| v9: [u64; 2], |
| v10: [u64; 2], |
| v11: [u64; 2], |
| v12: [u64; 2], |
| v13: [u64; 2], |
| v14: [u64; 2], |
| v15: [u64; 2], |
| v16: [u64; 2], |
| v17: [u64; 2], |
| v18: [u64; 2], |
| v19: [u64; 2], |
| v20: [u64; 2], |
| v21: [u64; 2], |
| v22: [u64; 2], |
| v23: [u64; 2], |
| v24: [u64; 2], |
| v25: [u64; 2], |
| v26: [u64; 2], |
| v27: [u64; 2], |
| v28: [u64; 2], |
| v29: [u64; 2], |
| v30: [u64; 2], |
| v31: [u64; 2], |
| elr: u64, // Exception Link Register |
| spsr: u64, // Saved Processor Status Register |
| fpsr: u64, // Floating Point Status Register |
| esr: u64, // Exception Syndrome Register |
| far: u64, // Fault Address Register |
| } |