1cc0f5f38SLawrence Tang #ifndef CPER_SECTION_IPF_H
2cc0f5f38SLawrence Tang #define CPER_SECTION_IPF_H
3cc0f5f38SLawrence Tang 
45202bbb4SLawrence Tang #include <json.h>
5cc0f5f38SLawrence Tang #include "../edk/Cper.h"
6cc0f5f38SLawrence Tang 
7*f8fc7052SJohn Chung #define IPF_MOD_ERROR_VALID_BITFIELD_NAMES                                     \
8*f8fc7052SJohn Chung 	(const char *[])                                                       \
9*f8fc7052SJohn Chung 	{                                                                      \
10*f8fc7052SJohn Chung 		"checkInfoValid", "requestorIdentifierValid",                  \
11*f8fc7052SJohn Chung 			"responderIdentifierValid", "targetIdentifierValid",   \
12*f8fc7052SJohn Chung 			"preciseIPValid"                                       \
13*f8fc7052SJohn Chung 	}
14*f8fc7052SJohn Chung #define IPF_PSI_STATIC_INFO_VALID_BITFIELD_NAMES                               \
15*f8fc7052SJohn Chung 	(const char *[])                                                       \
16*f8fc7052SJohn Chung 	{                                                                      \
17*f8fc7052SJohn Chung 		"minstateValid", "brValid", "crValid", "arValid", "rrValid",   \
18*f8fc7052SJohn Chung 			"frValid"                                              \
19*f8fc7052SJohn Chung 	}
20e18aaee9SLawrence Tang 
21cc0f5f38SLawrence Tang ///
22cc0f5f38SLawrence Tang /// IPF Error Record Section
23cc0f5f38SLawrence Tang /// Defined as according to B.2.3 of the ItaniumTM Processor Family System Abstraction Layer (SAL) Specification.
24cc0f5f38SLawrence Tang ///
25cc0f5f38SLawrence Tang typedef struct {
26cc0f5f38SLawrence Tang 	UINT64 ProcErrorMapValid : 1;
27cc0f5f38SLawrence Tang 	UINT64 ProcStateParameterValid : 1;
28cc0f5f38SLawrence Tang 	UINT64 ProcCrLidValid : 1;
29cc0f5f38SLawrence Tang 	UINT64 PsiStaticStructValid : 1;
30cc0f5f38SLawrence Tang 	UINT64 CacheCheckNum : 4;
31cc0f5f38SLawrence Tang 	UINT64 TlbCheckNum : 4;
32cc0f5f38SLawrence Tang 	UINT64 BusCheckNum : 4;
33cc0f5f38SLawrence Tang 	UINT64 RegFileCheckNum : 4;
34cc0f5f38SLawrence Tang 	UINT64 MsCheckNum : 4;
35cc0f5f38SLawrence Tang 	UINT64 CpuIdInfoValid : 1;
36cc0f5f38SLawrence Tang 	UINT64 Reserved : 39;
37cc0f5f38SLawrence Tang } EPI_IPF_ERROR_VALID_BITS;
38cc0f5f38SLawrence Tang 
39cc0f5f38SLawrence Tang typedef struct {
40cc0f5f38SLawrence Tang 	EPI_IPF_ERROR_VALID_BITS ValidBits;
41cc0f5f38SLawrence Tang 	UINT64 ProcErrorMap;
42cc0f5f38SLawrence Tang 	UINT64 ProcStateParameter;
43cc0f5f38SLawrence Tang 	UINT64 ProcCrLid;
44cc0f5f38SLawrence Tang } EFI_IPF_ERROR_INFO_HEADER;
45cc0f5f38SLawrence Tang 
46cc0f5f38SLawrence Tang typedef struct {
47cc0f5f38SLawrence Tang 	UINT64 ValidBits;
48cc0f5f38SLawrence Tang 	UINT64 ModCheckInfo;
49cc0f5f38SLawrence Tang 	UINT64 ModTargetId;
506c461e90SLawrence Tang 	UINT64 ModRequestorId; //NOTE: The Intel Itanium specification contains a typo which makes the order
516c461e90SLawrence Tang 	UINT64 ModResponderId; // of these two fields undefined. This is a best guess and could be wrong.
52cc0f5f38SLawrence Tang 	UINT64 ModPreciseIp;
53cc0f5f38SLawrence Tang } EFI_IPF_MOD_ERROR_INFO;
54cc0f5f38SLawrence Tang 
55cc0f5f38SLawrence Tang typedef struct {
56cc0f5f38SLawrence Tang 	UINT8 CpuIdInfo[40];
57cc0f5f38SLawrence Tang 	UINT8 Reserved1[8];
58e18aaee9SLawrence Tang } EFI_IPF_CPU_INFO;
59e18aaee9SLawrence Tang 
60e18aaee9SLawrence Tang typedef struct {
61cc0f5f38SLawrence Tang 	UINT64 ValidBits;
62cc0f5f38SLawrence Tang 	UINT8 MinimalSaveStateInfo[1024];
63e18aaee9SLawrence Tang 	UINT64 Brs[8];
64e18aaee9SLawrence Tang 	UINT64 Crs[128];
65e18aaee9SLawrence Tang 	UINT64 Ars[128];
66e18aaee9SLawrence Tang 	UINT64 Rrs[8];
67e18aaee9SLawrence Tang 	UINT64 Frs[256];
68e18aaee9SLawrence Tang } EFI_IPF_PSI_STATIC;
69cc0f5f38SLawrence Tang 
70*f8fc7052SJohn Chung json_object *cper_section_ipf_to_ir(void *section);
71cc0f5f38SLawrence Tang 
72cc0f5f38SLawrence Tang #endif
73