176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** @file
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  DebugSupport protocol and supporting definitions as defined in the UEFI2.0
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  specification.
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  The DebugSupport protocol is used by source level debuggers to abstract the
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  processor and handle context save and restore operations.
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  Copyright (c) 2006 - 2008, Intel Corporation
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  All rights reserved. This program and the accompanying materials
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  are licensed and made available under the terms and conditions of the BSD License
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  which accompanies this distribution.  The full text of the license may be found at
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  http://opensource.org/licenses/bsd-license.php
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman**/
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef __DEBUG_SUPPORT_H__
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define __DEBUG_SUPPORT_H__
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <gpxe/efi/ProcessorBind.h>
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <gpxe/efi/IndustryStandard/PeImage.h>
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct _EFI_DEBUG_SUPPORT_PROTOCOL EFI_DEBUG_SUPPORT_PROTOCOL;
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// Debug Support protocol {2755590C-6F3C-42FA-9EA4-A3BA543CDA25}
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EFI_DEBUG_SUPPORT_PROTOCOL_GUID \
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  { \
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman    0x2755590C, 0x6F3C, 0x42FA, {0x9E, 0xA4, 0xA3, 0xBA, 0x54, 0x3C, 0xDA, 0x25 } \
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  }
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// Debug Support definitions
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef INTN  EFI_EXCEPTION_TYPE;
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//  IA-32 processor exception types
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IA32_DIVIDE_ERROR    0
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IA32_DEBUG           1
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IA32_NMI             2
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IA32_BREAKPOINT      3
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IA32_OVERFLOW        4
4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IA32_BOUND           5
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IA32_INVALID_OPCODE  6
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IA32_DOUBLE_FAULT    8
5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IA32_INVALID_TSS     10
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IA32_SEG_NOT_PRESENT 11
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IA32_STACK_FAULT     12
5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IA32_GP_FAULT        13
5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IA32_PAGE_FAULT      14
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IA32_FP_ERROR        16
5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IA32_ALIGNMENT_CHECK 17
5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IA32_MACHINE_CHECK   18
5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IA32_SIMD            19
6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///
6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///  IA-32 processor context definition
6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///
6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///
6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// FXSAVE_STATE
6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// FP / MMX / XMM registers (see fxrstor instruction definition)
6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///
6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct {
6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT16  Fcw;
7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT16  Fsw;
7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT16  Ftw;
7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT16  Opcode;
7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32  Eip;
7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT16  Cs;
7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT16  Reserved1;
7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32  DataOffset;
7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT16  Ds;
7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   Reserved2[10];
7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   St0Mm0[10], Reserved3[6];
8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   St1Mm1[10], Reserved4[6];
8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   St2Mm2[10], Reserved5[6];
8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   St3Mm3[10], Reserved6[6];
8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   St4Mm4[10], Reserved7[6];
8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   St5Mm5[10], Reserved8[6];
8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   St6Mm6[10], Reserved9[6];
8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   St7Mm7[10], Reserved10[6];
8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   Xmm0[16];
8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   Xmm1[16];
8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   Xmm2[16];
9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   Xmm3[16];
9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   Xmm4[16];
9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   Xmm5[16];
9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   Xmm6[16];
9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   Xmm7[16];
9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   Reserved11[14 * 16];
9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} EFI_FX_SAVE_STATE_IA32;
9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct {
9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 ExceptionData;
10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  EFI_FX_SAVE_STATE_IA32 FxSaveState;
10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Dr0;
10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Dr1;
10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Dr2;
10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Dr3;
10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Dr6;
10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Dr7;
10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Cr0;
10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Cr1;  /* Reserved */
10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Cr2;
11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Cr3;
11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Cr4;
11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Eflags;
11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Ldtr;
11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Tr;
11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Gdtr[2];
11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Idtr[2];
11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Eip;
11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Gs;
11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Fs;
12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Es;
12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Ds;
12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Cs;
12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Ss;
12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Edi;
12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Esi;
12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Ebp;
12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Esp;
12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Ebx;
12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Edx;
13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Ecx;
13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT32                 Eax;
13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} EFI_SYSTEM_CONTEXT_IA32;
13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//  X64 processor exception types
13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_X64_DIVIDE_ERROR    0
13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_X64_DEBUG           1
13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_X64_NMI             2
14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_X64_BREAKPOINT      3
14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_X64_OVERFLOW        4
14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_X64_BOUND           5
14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_X64_INVALID_OPCODE  6
14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_X64_DOUBLE_FAULT    8
14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_X64_INVALID_TSS     10
14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_X64_SEG_NOT_PRESENT 11
14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_X64_STACK_FAULT     12
14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_X64_GP_FAULT        13
14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_X64_PAGE_FAULT      14
15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_X64_FP_ERROR        16
15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_X64_ALIGNMENT_CHECK 17
15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_X64_MACHINE_CHECK   18
15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_X64_SIMD            19
15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///
15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///  X64 processor context definition
15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///
15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// FXSAVE_STATE
15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// FP / MMX / XMM registers (see fxrstor instruction definition)
16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///
16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct {
16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT16  Fcw;
16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT16  Fsw;
16476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT16  Ftw;
16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT16  Opcode;
16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  Rip;
16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  DataOffset;
16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   Reserved1[8];
16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   St0Mm0[10], Reserved2[6];
17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   St1Mm1[10], Reserved3[6];
17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   St2Mm2[10], Reserved4[6];
17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   St3Mm3[10], Reserved5[6];
17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   St4Mm4[10], Reserved6[6];
17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   St5Mm5[10], Reserved7[6];
17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   St6Mm6[10], Reserved8[6];
17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   St7Mm7[10], Reserved9[6];
17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   Xmm0[16];
17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   Xmm1[16];
17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   Xmm2[16];
18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   Xmm3[16];
18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   Xmm4[16];
18276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   Xmm5[16];
18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   Xmm6[16];
18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   Xmm7[16];
18576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  //
18676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  // NOTE: UEFI 2.0 spec definition as follows.
18776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  //
18876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT8   Reserved11[14 * 16];
18976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} EFI_FX_SAVE_STATE_X64;
19076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
19176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct {
19276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                ExceptionData;
19376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  EFI_FX_SAVE_STATE_X64 FxSaveState;
19476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Dr0;
19576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Dr1;
19676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Dr2;
19776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Dr3;
19876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Dr6;
19976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Dr7;
20076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Cr0;
20176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Cr1;  /* Reserved */
20276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Cr2;
20376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Cr3;
20476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Cr4;
20576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Cr8;
20676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Rflags;
20776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Ldtr;
20876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Tr;
20976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Gdtr[2];
21076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Idtr[2];
21176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Rip;
21276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Gs;
21376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Fs;
21476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Es;
21576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Ds;
21676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Cs;
21776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Ss;
21876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Rdi;
21976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Rsi;
22076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Rbp;
22176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Rsp;
22276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Rbx;
22376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Rdx;
22476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Rcx;
22576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                Rax;
22676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                R8;
22776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                R9;
22876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                R10;
22976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                R11;
23076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                R12;
23176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                R13;
23276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                R14;
23376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64                R15;
23476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} EFI_SYSTEM_CONTEXT_X64;
23576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
23676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
23776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//  IPF processor exception types
23876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
23976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_VHTP_TRANSLATION       0
24076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_INSTRUCTION_TLB        1
24176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_DATA_TLB               2
24276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_ALT_INSTRUCTION_TLB    3
24376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_ALT_DATA_TLB           4
24476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_DATA_NESTED_TLB        5
24576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_INSTRUCTION_KEY_MISSED 6
24676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_DATA_KEY_MISSED        7
24776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_DIRTY_BIT              8
24876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_INSTRUCTION_ACCESS_BIT 9
24976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_DATA_ACCESS_BIT        10
25076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_BREAKPOINT             11
25176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_EXTERNAL_INTERRUPT     12
25276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
25376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 13 - 19 reserved
25476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
25576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_PAGE_NOT_PRESENT           20
25676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_KEY_PERMISSION             21
25776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_INSTRUCTION_ACCESS_RIGHTS  22
25876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_DATA_ACCESS_RIGHTS         23
25976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_GENERAL_EXCEPTION          24
26076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_DISABLED_FP_REGISTER       25
26176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_NAT_CONSUMPTION            26
26276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_SPECULATION                27
26376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
26476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 28 reserved
26576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
26676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_DEBUG                          29
26776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_UNALIGNED_REFERENCE            30
26876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_UNSUPPORTED_DATA_REFERENCE     31
26976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_FP_FAULT                       32
27076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_FP_TRAP                        33
27176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_LOWER_PRIVILEGE_TRANSFER_TRAP  34
27276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_TAKEN_BRANCH                   35
27376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_SINGLE_STEP                    36
27476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
27576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// 37 - 44 reserved
27676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
27776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_IA32_EXCEPTION 45
27876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_IA32_INTERCEPT 46
27976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_IPF_IA32_INTERRUPT 47
28076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
28176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///
28276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///  IPF processor context definition
28376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///
28476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct {
28576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  //
28676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  // The first reserved field is necessary to preserve alignment for the correct
28776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  // bits in UNAT and to insure F2 is 16 byte aligned..
28876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  //
28976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  Reserved;
29076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R1;
29176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R2;
29276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R3;
29376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R4;
29476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R5;
29576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R6;
29676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R7;
29776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R8;
29876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R9;
29976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R10;
30076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R11;
30176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R12;
30276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R13;
30376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R14;
30476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R15;
30576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R16;
30676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R17;
30776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R18;
30876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R19;
30976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R20;
31076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R21;
31176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R22;
31276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R23;
31376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R24;
31476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R25;
31576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R26;
31676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R27;
31776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R28;
31876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R29;
31976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R30;
32076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R31;
32176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
32276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F2[2];
32376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F3[2];
32476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F4[2];
32576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F5[2];
32676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F6[2];
32776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F7[2];
32876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F8[2];
32976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F9[2];
33076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F10[2];
33176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F11[2];
33276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F12[2];
33376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F13[2];
33476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F14[2];
33576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F15[2];
33676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F16[2];
33776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F17[2];
33876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F18[2];
33976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F19[2];
34076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F20[2];
34176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F21[2];
34276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F22[2];
34376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F23[2];
34476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F24[2];
34576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F25[2];
34676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F26[2];
34776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F27[2];
34876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F28[2];
34976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F29[2];
35076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F30[2];
35176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  F31[2];
35276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
35376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  Pr;
35476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
35576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  B0;
35676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  B1;
35776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  B2;
35876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  B3;
35976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  B4;
36076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  B5;
36176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  B6;
36276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  B7;
36376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
36476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  //
36576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  // application registers
36676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  //
36776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  ArRsc;
36876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  ArBsp;
36976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  ArBspstore;
37076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  ArRnat;
37176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
37276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  ArFcr;
37376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
37476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  ArEflag;
37576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  ArCsd;
37676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  ArSsd;
37776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  ArCflg;
37876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  ArFsr;
37976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  ArFir;
38076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  ArFdr;
38176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
38276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  ArCcv;
38376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
38476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  ArUnat;
38576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
38676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  ArFpsr;
38776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
38876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  ArPfs;
38976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  ArLc;
39076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  ArEc;
39176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
39276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  //
39376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  // control registers
39476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  //
39576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  CrDcr;
39676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  CrItm;
39776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  CrIva;
39876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  CrPta;
39976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  CrIpsr;
40076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  CrIsr;
40176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  CrIip;
40276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  CrIfa;
40376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  CrItir;
40476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  CrIipa;
40576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  CrIfs;
40676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  CrIim;
40776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  CrIha;
40876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
40976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  //
41076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  // debug registers
41176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  //
41276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  Dbr0;
41376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  Dbr1;
41476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  Dbr2;
41576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  Dbr3;
41676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  Dbr4;
41776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  Dbr5;
41876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  Dbr6;
41976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  Dbr7;
42076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
42176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  Ibr0;
42276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  Ibr1;
42376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  Ibr2;
42476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  Ibr3;
42576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  Ibr4;
42676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  Ibr5;
42776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  Ibr6;
42876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  Ibr7;
42976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
43076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  //
43176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  // virtual registers - nat bits for R1-R31
43276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  //
43376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  IntNat;
43476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
43576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} EFI_SYSTEM_CONTEXT_IPF;
43676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
43776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
43876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//  EBC processor exception types
43976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
44076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_EBC_UNDEFINED            0
44176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_EBC_DIVIDE_ERROR         1
44276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_EBC_DEBUG                2
44376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_EBC_BREAKPOINT           3
44476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_EBC_OVERFLOW             4
44576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_EBC_INVALID_OPCODE       5   // opcode out of range
44676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_EBC_STACK_FAULT          6
44776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_EBC_ALIGNMENT_CHECK      7
44876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_EBC_INSTRUCTION_ENCODING 8   // malformed instruction
44976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_EBC_BAD_BREAK            9   // BREAK 0 or undefined BREAK
45076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXCEPT_EBC_STEP                 10  // to support debug stepping
45176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///
45276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// For coding convenience, define the maximum valid EBC exception.
45376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///
45476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define MAX_EBC_EXCEPTION EXCEPT_EBC_STEP
45576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
45676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///
45776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///  EBC processor context definition
45876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///
45976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef struct {
46076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R0;
46176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R1;
46276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R2;
46376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R3;
46476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R4;
46576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R5;
46676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R6;
46776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  R7;
46876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  Flags;
46976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  ControlFlags;
47076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  UINT64  Ip;
47176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} EFI_SYSTEM_CONTEXT_EBC;
47276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
47376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///
47476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// Universal EFI_SYSTEM_CONTEXT definition
47576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///
47676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef union {
47776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  EFI_SYSTEM_CONTEXT_EBC  *SystemContextEbc;
47876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  EFI_SYSTEM_CONTEXT_IA32 *SystemContextIa32;
47976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  EFI_SYSTEM_CONTEXT_X64  *SystemContextX64;
48076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  EFI_SYSTEM_CONTEXT_IPF  *SystemContextIpf;
48176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} EFI_SYSTEM_CONTEXT;
48276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
48376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
48476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// DebugSupport callback function prototypes
48576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
48676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
48776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
48876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  Registers and enables an exception callback function for the specified exception.
48976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
49076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  ExceptionType         Exception types in EBC, IA-32, X64, or IPF
49176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  SystemContext         Exception content.
49276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
49376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman**/
49476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef
49576d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanVOID
49676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman(*EFI_EXCEPTION_CALLBACK)(
49776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN     EFI_EXCEPTION_TYPE               ExceptionType,
49876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN OUT EFI_SYSTEM_CONTEXT               SystemContext
49976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  );
50076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
50176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
50276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  Registers and enables the on-target debug agent's periodic entry point.
50376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
50476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  SystemContext         Exception content.
50576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
50676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman**/
50776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef
50876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanVOID
50976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman(*EFI_PERIODIC_CALLBACK)(
51076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN OUT EFI_SYSTEM_CONTEXT               SystemContext
51176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  );
51276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
51376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///
51476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// Machine type definition
51576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///
51676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef enum {
51776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IsaIa32 = IMAGE_FILE_MACHINE_I386,  ///< 0x014C
51876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IsaX64  = IMAGE_FILE_MACHINE_X64,   ///< 0x8664
51976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IsaIpf  = IMAGE_FILE_MACHINE_IA64,  ///< 0x0200
52076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IsaEbc  = IMAGE_FILE_MACHINE_EBC    ///< 0x0EBC
52176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} EFI_INSTRUCTION_SET_ARCHITECTURE;
52276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
52376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
52476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
52576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman// DebugSupport member function definitions
52676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman//
52776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
52876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
52976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  Returns the maximum value that may be used for the ProcessorIndex parameter in
53076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  RegisterPeriodicCallback() and RegisterExceptionCallback().
53176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
53276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
53376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  MaxProcessorIndex     Pointer to a caller-allocated UINTN in which the maximum supported
53476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                                processor index is returned.
53576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
53676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_SUCCESS           The function completed successfully.
53776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
53876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman**/
53976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef
54076d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEFI_STATUS
54176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman(EFIAPI *EFI_GET_MAXIMUM_PROCESSOR_INDEX)(
54276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN EFI_DEBUG_SUPPORT_PROTOCOL          *This,
54376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  OUT UINTN                              *MaxProcessorIndex
54476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  );
54576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
54676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
54776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  Registers a function to be called back periodically in interrupt context.
54876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
54976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
55076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  ProcessorIndex        Specifies which processor the callback function applies to.
55176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  PeriodicCallback      A pointer to a function of type PERIODIC_CALLBACK that is the main
55276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                                periodic entry point of the debug agent.
55376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
55476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_SUCCESS           The function completed successfully.
55576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_ALREADY_STARTED   Non-NULL PeriodicCallback parameter when a callback
55676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                                function was previously registered.
55776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_OUT_OF_RESOURCES  System has insufficient memory resources to register new callback
55876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                                function.
55976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
56076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman**/
56176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef
56276d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEFI_STATUS
56376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman(EFIAPI *EFI_REGISTER_PERIODIC_CALLBACK)(
56476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN EFI_DEBUG_SUPPORT_PROTOCOL          *This,
56576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN UINTN                               ProcessorIndex,
56676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN EFI_PERIODIC_CALLBACK               PeriodicCallback
56776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  );
56876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
56976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
57076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  Registers a function to be called when a given processor exception occurs.
57176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
57276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
57376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  ProcessorIndex        Specifies which processor the callback function applies to.
57476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  PeriodicCallback      A pointer to a function of type EXCEPTION_CALLBACK that is called
57576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                                when the processor exception specified by ExceptionType occurs.
57676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  ExceptionType         Specifies which processor exception to hook.
57776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
57876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_SUCCESS           The function completed successfully.
57976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_ALREADY_STARTED   Non-NULL PeriodicCallback parameter when a callback
58076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                                function was previously registered.
58176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_OUT_OF_RESOURCES  System has insufficient memory resources to register new callback
58276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                                function.
58376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
58476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman**/
58576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef
58676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEFI_STATUS
58776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman(EFIAPI *EFI_REGISTER_EXCEPTION_CALLBACK)(
58876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN EFI_DEBUG_SUPPORT_PROTOCOL          *This,
58976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN UINTN                               ProcessorIndex,
59076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN EFI_EXCEPTION_CALLBACK              ExceptionCallback,
59176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN EFI_EXCEPTION_TYPE                  ExceptionType
59276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  );
59376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
59476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/**
59576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  Invalidates processor instruction cache for a memory range. Subsequent execution in this range
59676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  causes a fresh memory fetch to retrieve code to be executed.
59776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
59876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  This                  A pointer to the EFI_DEBUG_SUPPORT_PROTOCOL instance.
59976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  ProcessorIndex        Specifies which processor's instruction cache is to be invalidated.
60076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  Start                 Specifies the physical base of the memory range to be invalidated.
60176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @param  Length                Specifies the minimum number of bytes in the processor's instruction
60276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman                                cache to invalidate.
60376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
60476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  @retval EFI_SUCCESS           The function completed successfully.
60576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
60676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman**/
60776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef
60876d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanEFI_STATUS
60976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman(EFIAPI *EFI_INVALIDATE_INSTRUCTION_CACHE)(
61076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN EFI_DEBUG_SUPPORT_PROTOCOL          *This,
61176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN UINTN                               ProcessorIndex,
61276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN VOID                                *Start,
61376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  IN UINT64                              Length
61476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  );
61576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
61676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///
61776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// This protocol provides the services to allow the debug agent to register
61876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// callback functions that are called either periodically or when specific
61976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/// processor exceptions occur.
62076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman///
62176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct _EFI_DEBUG_SUPPORT_PROTOCOL {
62276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  ///
62376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  /// Declares the processor architecture for this instance of the EFI Debug Support protocol.
62476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  ///
62576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  EFI_INSTRUCTION_SET_ARCHITECTURE  Isa;
62676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  EFI_GET_MAXIMUM_PROCESSOR_INDEX   GetMaximumProcessorIndex;
62776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  EFI_REGISTER_PERIODIC_CALLBACK    RegisterPeriodicCallback;
62876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  EFI_REGISTER_EXCEPTION_CALLBACK   RegisterExceptionCallback;
62976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman  EFI_INVALIDATE_INSTRUCTION_CACHE  InvalidateInstructionCache;
63076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman};
63176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
63276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanextern EFI_GUID gEfiDebugSupportProtocolGuid;
63376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
63476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif
635