Fix errors in CPER write, remove PCIe AER support.
diff --git a/generator/sections/gen-section-pcie.c b/generator/sections/gen-section-pcie.c
index 5f67c09..d7b34ec 100644
--- a/generator/sections/gen-section-pcie.c
+++ b/generator/sections/gen-section-pcie.c
@@ -26,8 +26,15 @@
     *version &= 0xFFFF; //Version bytes 2-3
     UINT32* reserved = (UINT32*)(bytes + 20);
     *reserved = 0; //Reserved bytes 20-24
+    *(bytes + 37) &= ~0b111; //Device ID byte 13 bits 0-3
     *(bytes + 39) = 0; //Device ID byte 15
 
+    //Set expected values.
+    int minor = rand() % 128;
+    int major = rand() % 128;
+    *version = int_to_bcd(minor);
+    *version |= int_to_bcd(major) << 8;
+
     //Fix values that could be above range.
     UINT32* port_type = (UINT32*)(bytes + 8);
     *port_type = PCIE_PORT_TYPES[rand() % (sizeof(PCIE_PORT_TYPES) / sizeof(int))];
diff --git a/sections/cper-section-ccix-per.c b/sections/cper-section-ccix-per.c
index 1df7d1b..072c5d2 100644
--- a/sections/cper-section-ccix-per.c
+++ b/sections/cper-section-ccix-per.c
@@ -61,7 +61,7 @@
     section_cper->CcixPortId = (UINT8)json_object_get_int(json_object_object_get(section, "ccixPortID"));
     
     //Write header out to stream.
-    fwrite(&section_cper, sizeof(section_cper), 1, out);
+    fwrite(section_cper, sizeof(EFI_CCIX_PER_LOG_DATA), 1, out);
     fflush(out);
 
     //Write CCIX PER log itself to stream.
diff --git a/sections/cper-section-cxl-component.c b/sections/cper-section-cxl-component.c
index 681fdae..934a1cf 100644
--- a/sections/cper-section-cxl-component.c
+++ b/sections/cper-section-cxl-component.c
@@ -86,7 +86,7 @@
     section_cper->DeviceSerial = json_object_get_uint64(json_object_object_get(section, "deviceSerial"));
 
     //Write header out to stream.
-    fwrite(section_cper, sizeof(section_cper), 1, out);
+    fwrite(section_cper, sizeof(EFI_CXL_COMPONENT_EVENT_HEADER), 1, out);
     fflush(out);
 
     //CXL component event log, decoded from base64.
diff --git a/sections/cper-section-cxl-protocol.c b/sections/cper-section-cxl-protocol.c
index 4f1d932..f9b0550 100644
--- a/sections/cper-section-cxl-protocol.c
+++ b/sections/cper-section-cxl-protocol.c
@@ -163,7 +163,7 @@
     section_cper->CxlErrorLogLength = (UINT16)json_object_get_int(json_object_object_get(section, "errorLogLength"));
 
     //Write header to stream.
-    fwrite(section_cper, sizeof(section_cper), 1, out);
+    fwrite(section_cper, sizeof(EFI_CXL_PROTOCOL_ERROR_DATA), 1, out);
     fflush(out);
 
     //DVSEC out to stream.
diff --git a/sections/cper-section-dmar-generic.c b/sections/cper-section-dmar-generic.c
index 6d2460d..58e002c 100644
--- a/sections/cper-section-dmar-generic.c
+++ b/sections/cper-section-dmar-generic.c
@@ -71,7 +71,7 @@
     section_cper->DeviceAddr = json_object_get_uint64(json_object_object_get(section, "deviceAddress"));
 
     //Write to stream, free resources.
-    fwrite(&section_cper, sizeof(section_cper), 1, out);
+    fwrite(section_cper, sizeof(EFI_DMAR_GENERIC_ERROR_DATA), 1, out);
     fflush(out);
     free(section_cper);
 }
\ No newline at end of file
diff --git a/sections/cper-section-dmar-iommu.c b/sections/cper-section-dmar-iommu.c
index 0298df0..2861053 100644
--- a/sections/cper-section-dmar-iommu.c
+++ b/sections/cper-section-dmar-iommu.c
@@ -79,7 +79,7 @@
     section_cper->PteL6 = json_object_get_uint64(json_object_object_get(section, "pageTableEntry_Level6"));
 
     //Write to stream, free resources.
-    fwrite(&section_cper, sizeof(section_cper), 1, out);
+    fwrite(section_cper, sizeof(EFI_IOMMU_DMAR_ERROR_DATA), 1, out);
     fflush(out);
     free(section_cper);
 }
\ No newline at end of file
diff --git a/sections/cper-section-dmar-vtd.c b/sections/cper-section-dmar-vtd.c
index c15c5f4..b57d1ba 100644
--- a/sections/cper-section-dmar-vtd.c
+++ b/sections/cper-section-dmar-vtd.c
@@ -135,7 +135,7 @@
     section_cper->PteL6 = json_object_get_uint64(json_object_object_get(section, "pageTableEntry_Level6"));
 
     //Write to stream, free resources.
-    fwrite(&section_cper, sizeof(section_cper), 1, out);
+    fwrite(section_cper, sizeof(EFI_DIRECTED_IO_DMAR_ERROR_DATA), 1, out);
     fflush(out);
     free(section_cper);
 }
\ No newline at end of file
diff --git a/sections/cper-section-firmware.c b/sections/cper-section-firmware.c
index 02795dd..c7c91f5 100644
--- a/sections/cper-section-firmware.c
+++ b/sections/cper-section-firmware.c
@@ -49,7 +49,7 @@
         json_object_get_string(json_object_object_get(section, "recordIDGUID")));
 
     //Write to stream, free resources.
-    fwrite(&section_cper, sizeof(section_cper), 1, out);
+    fwrite(section_cper, sizeof(EFI_FIRMWARE_ERROR_DATA), 1, out);
     fflush(out);
     free(section_cper);
 }
\ No newline at end of file
diff --git a/sections/cper-section-memory.c b/sections/cper-section-memory.c
index 089a7bb..8cd7f0b 100644
--- a/sections/cper-section-memory.c
+++ b/sections/cper-section-memory.c
@@ -172,7 +172,7 @@
     section_cper->Extended |= json_object_get_int(json_object_object_get(extended, "chipIdentification")) << 5;
 
     //Miscellaneous value fields.
-    section_cper->ErrorType = readable_pair_to_integer(json_object_object_get(section, "memoryErrorType"));
+    section_cper->ErrorType = (UINT8)readable_pair_to_integer(json_object_object_get(section, "memoryErrorType"));
     section_cper->PhysicalAddress = json_object_get_uint64(json_object_object_get(section, "physicalAddress"));
     section_cper->PhysicalAddressMask = json_object_get_uint64(json_object_object_get(section, "physicalAddressMask"));
     section_cper->Node = (UINT16)json_object_get_uint64(json_object_object_get(section, "node"));
@@ -190,7 +190,7 @@
     section_cper->ModuleHandle = (UINT16)json_object_get_uint64(json_object_object_get(section, "moduleSmbiosHandle"));
 
     //Write to stream, free up resources.
-    fwrite(&section_cper, sizeof(section_cper), 1, out);
+    fwrite(section_cper, sizeof(EFI_PLATFORM_MEMORY_ERROR_DATA), 1, out);
     fflush(out);
     free(section_cper);
 }
@@ -244,7 +244,7 @@
     section_cper->ModuleHandle = (UINT32)json_object_get_uint64(json_object_object_get(section, "moduleSmbiosHandle"));
 
     //Write to stream, free up resources.
-    fwrite(&section_cper, sizeof(section_cper), 1, out);
+    fwrite(section_cper, sizeof(EFI_PLATFORM_MEMORY2_ERROR_DATA), 1, out);
     fflush(out);
     free(section_cper);
 }
\ No newline at end of file
diff --git a/sections/cper-section-pci-bus.c b/sections/cper-section-pci-bus.c
index d12a6fe..0b0c297 100644
--- a/sections/cper-section-pci-bus.c
+++ b/sections/cper-section-pci-bus.c
@@ -79,7 +79,7 @@
     section_cper->TargetId = json_object_get_uint64(json_object_object_get(section, "targetID"));
 
     //Write to stream, free resources.
-    fwrite(&section_cper, sizeof(section_cper), 1, out);
+    fwrite(section_cper, sizeof(EFI_PCI_PCIX_BUS_ERROR_DATA), 1, out);
     fflush(out);
     free(section_cper);
 }
\ No newline at end of file
diff --git a/sections/cper-section-pcie.c b/sections/cper-section-pcie.c
index 8c70734..d5a7729 100644
--- a/sections/cper-section-pcie.c
+++ b/sections/cper-section-pcie.c
@@ -80,38 +80,9 @@
 
     //AER information.
     json_object* aer_capability_ir = json_object_new_object();
-    EFI_PCIE_ADV_ERROR_EXT_CAPABILITY* aer_capability = (EFI_PCIE_ADV_ERROR_EXT_CAPABILITY*)pcie_error->AerInfo.PcieAer;
-    json_object_object_add(aer_capability_ir, "capabilityID", 
-        json_object_new_uint64(aer_capability->Header.PcieExtendedCapabilityId));
-    json_object_object_add(aer_capability_ir, "capabilityVersion", 
-        json_object_new_uint64(aer_capability->Header.CapabilityVersion));
-    json_object_object_add(aer_capability_ir, "uncorrectableErrorStatusRegister", 
-        json_object_new_uint64(aer_capability->UncorrectableErrorStatusReg));
-    json_object_object_add(aer_capability_ir, "uncorrectableErrorMaskRegister", 
-        json_object_new_uint64(aer_capability->UncorrectableErrorMaskReg));
-    json_object_object_add(aer_capability_ir, "uncorrectableErrorSeverityRegister", 
-        json_object_new_uint64(aer_capability->UncorrectableErrorSeverityReg));
-    json_object_object_add(aer_capability_ir, "correctableErrorStatusRegister", 
-        json_object_new_uint64(aer_capability->CorrectableErrorStatusReg));
-    json_object_object_add(aer_capability_ir, "correctableErrorMaskRegister", 
-        json_object_new_uint64(aer_capability->CorrectableErrorMaskReg));
-    json_object_object_add(aer_capability_ir, "aeccReg", json_object_new_uint64(aer_capability->AeccReg));
-
-    //Header log register (b64).
-    encoded = b64_encode((unsigned char*)aer_capability->HeaderLogReg, 16);
-    json_object_object_add(aer_capability_ir, "headerLogRegister", json_object_new_string(encoded));
+    encoded = b64_encode((unsigned char*)pcie_error->AerInfo.PcieAer, 96);
+    json_object_object_add(aer_capability_ir, "data", json_object_new_string(encoded));
     free(encoded);
-
-    //Remaining AER fields.
-    json_object_object_add(aer_capability_ir, "rootErrorCommand", 
-        json_object_new_uint64(aer_capability->RootErrorCommand));
-    json_object_object_add(aer_capability_ir, "rootErrorStatus", 
-        json_object_new_uint64(aer_capability->RootErrorStatus));
-    json_object_object_add(aer_capability_ir, "errorSourceIDRegister", 
-        json_object_new_uint64(aer_capability->ErrorSourceIdReg));
-    json_object_object_add(aer_capability_ir, "correctableErrorSourceIDRegister", 
-        json_object_new_uint64(aer_capability->CorrectableSourceIdReg));
-
     json_object_object_add(section_ir, "aerInfo", aer_capability_ir);
     return section_ir;
 }
@@ -127,9 +98,9 @@
 
     //Version.
     json_object* version = json_object_object_get(section, "version");
-    int minor = json_object_get_int(json_object_object_get(version, "minor"));
-    int major = json_object_get_int(json_object_object_get(version, "major"));
-    section_cper->Version = int_to_bcd(minor) + ((UINT16)(int_to_bcd(major)) << 8);
+    UINT32 minor = int_to_bcd(json_object_get_int(json_object_object_get(version, "minor")));
+    UINT32 major = int_to_bcd(json_object_get_int(json_object_object_get(version, "major")));
+    section_cper->Version = minor + (major << 8);
 
     //Command/status registers.
     json_object* command_status = json_object_object_get(section, "commandStatus");
@@ -146,7 +117,7 @@
         (UINT16)json_object_get_uint64(json_object_object_get(device_id, "deviceID"));
     section_cper->DevBridge.ClassCode[0] = class_id >> 16;
     section_cper->DevBridge.ClassCode[1] = (class_id >> 8) & 0xFF;
-    section_cper->DevBridge.ClassCode[1] = class_id & 0xFF;
+    section_cper->DevBridge.ClassCode[2] = class_id & 0xFF;
     section_cper->DevBridge.Function = 
         (UINT8)json_object_get_uint64(json_object_object_get(device_id, "functionNumber"));
     section_cper->DevBridge.Device = 
@@ -175,48 +146,17 @@
 
     //AER capability structure.
     json_object* aer_info = json_object_object_get(section, "aerInfo");
-    EFI_PCIE_ADV_ERROR_EXT_CAPABILITY* aer_capability = 
-        (EFI_PCIE_ADV_ERROR_EXT_CAPABILITY*)section_cper->AerInfo.PcieAer;
-    aer_capability->Header.PcieExtendedCapabilityId =
-        json_object_get_uint64(json_object_object_get(aer_info, "capabilityID"));
-    aer_capability->Header.CapabilityVersion =
-        json_object_get_uint64(json_object_object_get(aer_info, "capabilityVersion"));
-    aer_capability->UncorrectableErrorStatusReg =
-        (UINT32)json_object_get_uint64(json_object_object_get(aer_info, "uncorrectableErrorStatusRegister"));
-    aer_capability->UncorrectableErrorMaskReg =
-        (UINT32)json_object_get_uint64(json_object_object_get(aer_info, "uncorrectableErrorMaskRegister"));
-    aer_capability->UncorrectableErrorSeverityReg =
-        (UINT32)json_object_get_uint64(json_object_object_get(aer_info, "uncorrectableErrorSeverityRegister"));
-    aer_capability->CorrectableErrorStatusReg =
-        (UINT32)json_object_get_uint64(json_object_object_get(aer_info, "correctableErrorStatusRegister"));
-    aer_capability->CorrectableErrorMaskReg =
-        (UINT32)json_object_get_uint64(json_object_object_get(aer_info, "correctableErrorMaskRegister"));
-    aer_capability->AeccReg =
-        (UINT32)json_object_get_uint64(json_object_object_get(aer_info, "aeccReg"));
-
-    //AER header log register.
-    encoded = json_object_object_get(aer_info, "headerLogRegister");
+    encoded = json_object_object_get(aer_info, "data");
     decoded = b64_decode(json_object_get_string(encoded), json_object_get_string_len(encoded));
-    memcpy(aer_capability->HeaderLogReg, decoded, 16);
+    memcpy(section_cper->AerInfo.PcieAer, decoded, 96);
     free(decoded);
 
-    //Remaining AER fields.
-    aer_capability->RootErrorCommand =
-        (UINT32)json_object_get_uint64(json_object_object_get(aer_info, "rootErrorCommand"));
-    aer_capability->RootErrorStatus =
-        (UINT32)json_object_get_uint64(json_object_object_get(aer_info, "rootErrorStatus"));
-    aer_capability->ErrorSourceIdReg =
-        (UINT16)json_object_get_uint64(json_object_object_get(aer_info, "errorSourceIDRegister"));
-    aer_capability->CorrectableSourceIdReg =
-        (UINT16)json_object_get_uint64(json_object_object_get(aer_info, "correctableErrorSourceIDRegister"));
-
-
     //Miscellaneous value fields.
     section_cper->PortType = (UINT32)readable_pair_to_integer(json_object_object_get(section, "portType"));
     section_cper->SerialNo = json_object_get_uint64(json_object_object_get(section, "deviceSerialNumber"));
 
     //Write out to stream, free resources.
-    fwrite(&section_cper, sizeof(section_cper), 1, out);
+    fwrite(section_cper, sizeof(EFI_PCIE_ERROR_DATA), 1, out);
     fflush(out);
     free(section_cper);
 }
\ No newline at end of file
diff --git a/sections/cper-section-pcie.h b/sections/cper-section-pcie.h
index c264960..badf422 100644
--- a/sections/cper-section-pcie.h
+++ b/sections/cper-section-pcie.h
@@ -12,27 +12,6 @@
     "Root Port", "Upstream Switch Port", "Downstream Switch Port", "PCI Express to PCI/PCI-X Bridge", \
     "PCI/PCI-X Bridge to PCI Express Bridge", "Root Complex Integrated Endpoint Device", "Root Complex Event Collector"}
 
-typedef struct {
-    UINT64 PcieExtendedCapabilityId : 16;
-    UINT64 CapabilityVersion : 4;
-    UINT64 NextCapabilityOffset : 12; 
-} EFI_PCIE_ADV_ERROR_EXT_CAPABILITY_HEADER;
-
-typedef struct {
-    EFI_PCIE_ADV_ERROR_EXT_CAPABILITY_HEADER Header;
-    UINT32 UncorrectableErrorStatusReg;
-    UINT32 UncorrectableErrorMaskReg;
-    UINT32 UncorrectableErrorSeverityReg;
-    UINT32 CorrectableErrorStatusReg;
-    UINT32 CorrectableErrorMaskReg;
-    UINT32 AeccReg;
-    UINT8 HeaderLogReg[16];
-    UINT32 RootErrorCommand;
-    UINT32 RootErrorStatus;
-    UINT16 CorrectableSourceIdReg;
-    UINT16 ErrorSourceIdReg;
-} EFI_PCIE_ADV_ERROR_EXT_CAPABILITY;
-
 json_object* cper_section_pcie_to_ir(void* section, EFI_ERROR_SECTION_DESCRIPTOR* descriptor);
 void ir_section_pcie_to_cper(json_object* section, FILE* out);
 
diff --git a/specification/document/cper-json-specification.tex b/specification/document/cper-json-specification.tex
index 59ac7f6..5176e72 100644
--- a/specification/document/cper-json-specification.tex
+++ b/specification/document/cper-json-specification.tex
@@ -1519,7 +1519,8 @@
 \hline
 capabilityStructure.data & string & A base-64 formatted binary dump of the PCIe capability structure for this device. The structure could either be a PCIe 1.1 Capability Structure (36-byte, padded to 60 bytes) or a PCIe 2.0 Capability Structure (60-byte).\\
 \hline
-aerInfo & object & A PCIe AER Extended Capability structure, as defined in Subsection \ref{subsection:pcieaerecstructure}.\\
+% aerInfo & object & A PCIe AER Extended Capability structure, as defined in Subsection \ref{subsection:pcieaerecstructure}.\\
+aerInfo.data & string & A base64-formatted representation of a PCIe AER Extended Capability structure.\\
 \jsontableend{PCIe Error structure field table.}
 
 % PCIe error validation structure.
@@ -1569,37 +1570,37 @@
 slotNumber & uint64 & The slot number of the PCIe device.\\
 \jsontableend{PCIe Device ID structure field table.}
 
-% PCIe Advanced Error Reporting Extended Capability structure.
-\subsection{PCIe AER Extended Capability Structure}
-\label{subsection:pcieaerecstructure}
-This structure describes a PCIe Advanced Error Reporting Extended Capability structure, for use in a PCI Error section (\ref{table:pcieerrorsection}).
-\jsontable{table:pcieaerecstructure}
-capabilityID & uint64 & The capability ID for this AER structure.\\
-\hline
-capabilityVersion & uint64 & The capability structure version for this AER structure.\\
-\hline
-uncorrectableErrorStatusRegister & uint64 & The uncorrectable error status register value.\\
-\hline
-uncorrectableErrorMaskRegister & uint64 & The uncorrectable error mask register value.\\
-\hline
-uncorrectableErrorSeverityRegister & uint64 & The uncorrectable error severity register value.\\
-\hline
-correctableErrorStatusRegister & uint64 & The correctable error status register value.\\
-\hline
-correctableErrorMaskRegister & uint64 & The correctable error mask register value.\\
-\hline
-aeccReg & uint64 & The AECC register value.\\
-\hline
-headerLogRegister & string & A base64-encoded binary dump of the header log register.\\
-\hline
-rootErrorCommand & uint64 & The root error command.\\
-\hline
-rootErrorStatus & uint64 & The root error status.\\
-\hline
-errorSourceIDRegister & uint64 & The error source ID register.\\
-\hline
-correctableErrorSourceIDRegister & uint64 & The correctable error source ID register.\\
-\jsontableend{PCIe AER Extended Capability structure field table.}
+% % PCIe Advanced Error Reporting Extended Capability structure.
+% \subsection{PCIe AER Extended Capability Structure}
+% \label{subsection:pcieaerecstructure}
+% This structure describes a PCIe Advanced Error Reporting Extended Capability structure, for use in a PCI Error section (\ref{table:pcieerrorsection}).
+% \jsontable{table:pcieaerecstructure}
+% capabilityID & uint64 & The capability ID for this AER structure.\\
+% \hline
+% capabilityVersion & uint64 & The capability structure version for this AER structure.\\
+% \hline
+% uncorrectableErrorStatusRegister & uint64 & The uncorrectable error status register value.\\
+% \hline
+% uncorrectableErrorMaskRegister & uint64 & The uncorrectable error mask register value.\\
+% \hline
+% uncorrectableErrorSeverityRegister & uint64 & The uncorrectable error severity register value.\\
+% \hline
+% correctableErrorStatusRegister & uint64 & The correctable error status register value.\\
+% \hline
+% correctableErrorMaskRegister & uint64 & The correctable error mask register value.\\
+% \hline
+% aeccReg & uint64 & The AECC register value.\\
+% \hline
+% headerLogRegister & string & A base64-encoded binary dump of the header log register.\\
+% \hline
+% rootErrorCommand & uint64 & The root error command.\\
+% \hline
+% rootErrorStatus & uint64 & The root error status.\\
+% \hline
+% errorSourceIDRegister & uint64 & The error source ID register.\\
+% \hline
+% correctableErrorSourceIDRegister & uint64 & The correctable error source ID register.\\
+% \jsontableend{PCIe AER Extended Capability structure field table.}
 
 % PCI/PCI-X Bus error section.
 \section{PCI/PCI-X Bus Error Section}
diff --git a/specification/json/sections/cper-pcie.json b/specification/json/sections/cper-pcie.json
index 05e6dad..021d590 100644
--- a/specification/json/sections/cper-pcie.json
+++ b/specification/json/sections/cper-pcie.json
@@ -122,46 +122,10 @@
         },
         "aerInfo": {
             "type": "object",
-            "required": ["capabilityID", "capabilityVersion", "uncorrectableErrorStatusRegister", "uncorrectableErrorMaskRegister", "uncorrectableErrorSeverityRegister", "correctableErrorStatusRegister", "correctableErrorMaskRegister", "aeccReg", "headerLogRegister", "rootErrorCommand", "rootErrorStatus", "errorSourceIDRegister", "correctableErrorSourceIDRegister"],
+            "required": ["data"],
             "properties": {
-                "capabilityID": {
-                    "type": "integer"
-                },
-                "capabilityVersion": {
-                    "type": "integer"
-                },
-                "uncorrectableErrorStatusRegister": {
-                    "type": "integer"
-                },
-                "uncorrectableErrorMaskRegister": {
-                    "type": "integer"
-                },
-                "uncorrectableErrorSeverityRegister": {
-                    "type": "integer"
-                },
-                "correctableErrorStatusRegister": {
-                    "type": "integer"
-                },
-                "correctableErrorMaskRegister": {
-                    "type": "integer"
-                },
-                "aeccReg": {
-                    "type": "integer"
-                },
-                "headerLogRegister": {
+                "data": {
                     "type": "string"
-                },
-                "rootErrorCommand": {
-                    "type": "integer"
-                },
-                "rootErrorStatus": {
-                    "type": "integer"
-                },
-                "errorSourceIDRegister": {
-                    "type": "integer"
-                },
-                "correctableErrorSourceIDRegister": {
-                    "type": "integer"
                 }
             }
         }