1cc0f5f38SLawrence Tang #ifndef CPER_SECTION_IPF_H
2cc0f5f38SLawrence Tang #define CPER_SECTION_IPF_H
3cc0f5f38SLawrence Tang 
4cc0f5f38SLawrence Tang #include "json.h"
5cc0f5f38SLawrence Tang #include "../edk/Cper.h"
6cc0f5f38SLawrence Tang 
7*e18aaee9SLawrence Tang #define IPF_MOD_ERROR_VALID_BITFIELD_NAMES (const char*[]) {"checkInfoValid", "requestorIdentifierValid", \
8*e18aaee9SLawrence Tang     "responderIdentifierValid", "targetIdentifierValid", "preciseIPValid"}
9*e18aaee9SLawrence Tang #define IPF_PSI_STATIC_INFO_VALID_BITFIELD_NAMES (const char*[]) {"minstateValid", "brValid", "crValid", \
10*e18aaee9SLawrence Tang     "arValid", "rrValid", "frValid"}
11*e18aaee9SLawrence Tang 
12cc0f5f38SLawrence Tang ///
13cc0f5f38SLawrence Tang /// IPF Error Record Section
14cc0f5f38SLawrence Tang /// Defined as according to B.2.3 of the ItaniumTM Processor Family System Abstraction Layer (SAL) Specification.
15cc0f5f38SLawrence Tang ///
16cc0f5f38SLawrence Tang typedef struct {
17cc0f5f38SLawrence Tang     UINT64 ProcErrorMapValid : 1;
18cc0f5f38SLawrence Tang     UINT64 ProcStateParameterValid : 1;
19cc0f5f38SLawrence Tang     UINT64 ProcCrLidValid : 1;
20cc0f5f38SLawrence Tang     UINT64 PsiStaticStructValid : 1;
21cc0f5f38SLawrence Tang     UINT64 CacheCheckNum : 4;
22cc0f5f38SLawrence Tang     UINT64 TlbCheckNum : 4;
23cc0f5f38SLawrence Tang     UINT64 BusCheckNum : 4;
24cc0f5f38SLawrence Tang     UINT64 RegFileCheckNum : 4;
25cc0f5f38SLawrence Tang     UINT64 MsCheckNum : 4;
26cc0f5f38SLawrence Tang     UINT64 CpuIdInfoValid : 1;
27cc0f5f38SLawrence Tang     UINT64 Reserved : 39;
28cc0f5f38SLawrence Tang } EPI_IPF_ERROR_VALID_BITS;
29cc0f5f38SLawrence Tang 
30cc0f5f38SLawrence Tang typedef struct {
31cc0f5f38SLawrence Tang     EPI_IPF_ERROR_VALID_BITS ValidBits;
32cc0f5f38SLawrence Tang     UINT64 ProcErrorMap;
33cc0f5f38SLawrence Tang     UINT64 ProcStateParameter;
34cc0f5f38SLawrence Tang     UINT64 ProcCrLid;
35cc0f5f38SLawrence Tang } EFI_IPF_ERROR_INFO_HEADER;
36cc0f5f38SLawrence Tang 
37cc0f5f38SLawrence Tang typedef struct {
38cc0f5f38SLawrence Tang     UINT64 ValidBits;
39cc0f5f38SLawrence Tang     UINT64 ModCheckInfo;
40cc0f5f38SLawrence Tang     UINT64 ModTargetId;
41*e18aaee9SLawrence Tang     UINT64 ModRequestorId; //todo: Which way around are these? Spec has a typo
42cc0f5f38SLawrence Tang     UINT64 ModResponderId;
43cc0f5f38SLawrence Tang     UINT64 ModPreciseIp;
44cc0f5f38SLawrence Tang } EFI_IPF_MOD_ERROR_INFO;
45cc0f5f38SLawrence Tang 
46cc0f5f38SLawrence Tang typedef struct {
47cc0f5f38SLawrence Tang     UINT8 CpuIdInfo[40];
48cc0f5f38SLawrence Tang     UINT8 Reserved1[8];
49*e18aaee9SLawrence Tang } EFI_IPF_CPU_INFO;
50*e18aaee9SLawrence Tang 
51*e18aaee9SLawrence Tang typedef struct {
52cc0f5f38SLawrence Tang     UINT64 ValidBits;
53cc0f5f38SLawrence Tang     UINT8 MinimalSaveStateInfo[1024];
54*e18aaee9SLawrence Tang     UINT64 Brs[8];
55*e18aaee9SLawrence Tang     UINT64 Crs[128];
56*e18aaee9SLawrence Tang     UINT64 Ars[128];
57*e18aaee9SLawrence Tang     UINT64 Rrs[8];
58*e18aaee9SLawrence Tang     UINT64 Frs[256];
59*e18aaee9SLawrence Tang } EFI_IPF_PSI_STATIC;
60cc0f5f38SLawrence Tang 
61cc0f5f38SLawrence Tang json_object* cper_section_ipf_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor);
62cc0f5f38SLawrence Tang 
63cc0f5f38SLawrence Tang #endif